直接挂载迁移
适用场景
能够在百度云与IDC或三方云之间打通网络(如专线等),且需要将本地IDC或三方云的数据上传至CFS中。

基本原理
将CFS挂载至BCC中当做本地目录,利用数据同步工具(如msrsync、SFTP等)进行数据传输。
操作步骤
第一步:在同一VPC及可用区内创建BCC及CFS。
第二步:将CFS挂载至BCC中,挂载后的CFS文件系统即可当作一个普通的本地目录来访问和使用。
- Linux系统挂载NFS协议CFS文件系统请见:Linux系统挂载与卸载NFS协议CFS。
第三步:将本地IDC/三方云的数据通过同步工具,将数据同步至BCC后写入CFS挂载的本地目录。
实施迁移
使用msrsync迁移数据
1.登录云服务器
- 在云服务器BCC上绑定EIP,从而拥有公网IP。
- 确保远端服务器可以通过ssh方式登录到BCC的公网IP。
2.配置公钥
登录远端服务器,执行如下命令:
1ssh-keygen -t rsa #创建公钥,会提示输入信息,可以不用管,一直敲回车即可
2cat ~/.ssh/id_rsa.pub #查看生成的公钥,将这里的内容拷贝,准备输入下一步中的文件中
登录BCC,编辑文件~/.ssh/id_rsa.pub,将上一步拷贝的公钥,输入到这里。
至此,现在从远端服务器,即可无需秘钥登录并访问BCC。
3.策略评估
需要评估以下因素,以采用更合适的方式来迁移数据:
- 迁移期间是否可以暂停对已有文件系统的写入。如果可以,则只执行一次全量迁移(迁移方案4.1)。如果不可以,请评估迁移期间的新写入数据量,若数据量很少,可以使用全量迁移+一次增量迁移(迁移方案4.2),否则使用周期性迁移方案4.3。
- 文件系统的数据量。若已有文件系统数据量较大,则分目录进行迁移。每个子目录的迁移,是不相关的,既可同时进行,也可序列化执行。同时,CFS支持多个BCC同时挂载,适当增加BCC的数量来并发执行子目录的迁移,可提高迁移的速度。
4.迁移方案
迁移过程会针对用户对原有文件系统是否有写操作而略有不同。下面分别讨论以下几种情况:
4.1 用户没有写IO请求到原有文件系统 在原有文件系统所挂载的远端服务器上执行如下命令:
1nohup ./msrsync -P -p 128 --stats -b /ssd1/tmp/ --rsync "-at --inplace --whole-file" /old_fs/sub_folder_1/ root@实例的弹性公网IP:/mnt/cfs/sub_folder_1/ 1>rsync.log 2>&1 &
以下是对上述命令参数的含义说明。
| 参数/选项 | 含义 |
|---|---|
| nohup | 使命令在退出终端后继续运行,并将输出重定向到nohup.out文件或指定文件。 |
| ./msrsync | 执行当前目录下的msrsync脚本或程序。 |
| -P | 显示msrsync命令的进度。 |
| -p 128 | 设置并行进程数为 128。 |
| --stats | 统计并显示文件传输的详细信息。 |
| -b ~/tmp | 用于存储每个 rsync 同步的文件列表。 |
| --rsync "-at --inplace --whole-file" | 传递给rsync的选项: -a:归档模式,表示递归复制并保持所有文件属性。 -t:保持文件时间戳。 --inplace:直接更新文件而不是创建临时文件。 --whole-file:传输整个文件,不进行增量复制。 |
| root | 待上传目标CFS文件系统目录的属主。 |
| 实例的弹性公网IP | 已挂载CFS文件系统的BCC实例公网IP。 |
| /old_fs/sub_folder_1/ | 原有文件系统的源目录,表示要复制的文件所在目录。 |
| /mnt/cfs/sub_folder_1/ | CFS文件系统的目标目录,表示复制文件的目的目录。 |
| 1>rsync.log | 将标准输出(stdout)重定向到rsync.log文件。 |
| 2>&1 | 将标准错误(stderr)重定向到标准输出(stdout),即将错误信息也重定向到rsync.log文件中。 |
msrsync的详细用法请参考:msrsync。
4.2 用户有少量的写IO请求到原有文件系统 若用户有写IO的请求,此时通过msrsync命令,不能保证迁移过程中原文件系统和CFS文件系统数据绝对一致。但msrsync内部的算法可以保证两个文件系统数据是大部分一致的。用户可以在第一次msrsync执行完毕后,暂停应用程序的写操作IO到原有文件系统。具体步骤如下:
- 用户对原有文件系统的写IO可以继续。在远端服务器上执行如下命令:
1nohup ./msrsync -P -p 128 --stats -b /ssd1/tmp/ --rsync "-at --inplace --whole-file" /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1/ 1>rsync.log 2>&1 &
- 暂停用户对原有文件系统的写IO。在远端服务器上执行如下命令:
1nohup ./msrsync -P -p 128 --stats -b /ssd1/tmp/ --rsync "-at --inplace --whole-file" /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1/ 1>rsync.log 2>&1 &
第二次执行msrsync操作时,由于已经做过一次迁移操作,第二次会根据计算两个文件的差异,然后进行迁移。因此,第二次执行msrsync操作会快很多。
4.3 用户有大量的写IO请求到原有文件系统
当用户的应用程序有大量的写IO,同时又不能暂停IO的情况下。理论上迁移时,无法保证原有文件系统和目标文件系统数据强一致性。此时可以考虑周期的运行msrsync操作,尽可能让两个文件系统保持最大程度的数据一致。在Linux系统下,有多重周期执行命令的办法,这里我们推荐使用crontab,它可以方便的周期的调用msrsync。例如:
1crontab -e
接着将下列内容输入,其含义是每间隔1小时调动一次msrsync命令。
1* */1 * * * nohup ./msrsync -P -p 128 --stats -b /ssd1/tmp/ --rsync "-at --inplace --whole-file" /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1/ 1>rsync.log 2>&1 &
可通过如下命令查看crontab命令是否配置成功。
1crontab -l
当用户经过一段周期的从原有文件系统迁移到CFS文件系统后,选择一个合适时机,暂停应用程序对原有文件系统的写操作,同时删掉crontab的任务,操作如下:
1crontab -e #根据提示,删除msrsync任务并退出
最后再手动的执行以下msrsync命令,再次确保两个文件系统数据完全一致。
1nohup ./msrsync -P -p 128 --stats -b /ssd1/tmp/ --rsync "-at --inplace --whole-file" /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1/ 1>rsync.log 2>&1 &
此时,用户则可以从原有的服务器迁移应用程序到BCC服务器上。
5.统计结果
每当执行完msrsync后,会显示出这次同步的结果,其中包括:
- 同步花费的时间;
- 传送了多少字节;
- IO传送的速度;
- 一共有多少文件被同步。
使用SFTP迁移数据
当有少量文件需要一次性上传时,建议您在系统上安装使用SFTP来完成。此方案具有以下优点:
- 支持众多操作系统平台
- 提供图形化操作界面
本章节以Linux系统为例介绍操作步骤:
- 登录待上传数据的服务器
- 修改配置文件/etc/ssh/sshd_config
- 将 sshd_config配置文件中的 Subsystem 行注释掉,新增一行 Subsystem sftp internal-sftp
1# override default of no subsystems
2#Subsystem sftp /usr/libexec/openssh/sftp-server
3Subsystem sftp internal-sftp
- 在 sshd_config 文件末尾添加如下内容。其中 /usr/sftp 为sftp根目录,请根据实际情况修改
1X11Forwarding no
2AllowTcpForwarding no
3ForceCommand internal-sftp
4ChrootDirectory /usr/sftp
- 设置相关权限
- 执行以下命令添加用户组。
- 执行添以下命令添加用户并设置为SFTP组。
- 执行以下命令设置SFTP用户密码。
- 创建SFTP用户的根目录、属主和属组,并修改权限(755)。
1 cd /usr
2 mkdir sftp
3 chown root:sftp sftp
4 chmod 755 sftp
- 在SFTP目录中,创建CFS的挂载目录,并修改权限
1cd sftp/
2mkdir mnt
3chown sftp:sftp mnt
- 执行以下命令将CFS文件系统挂载到/usr/sftp/mnt目录
1mount -t nfs4 -o minorversion=1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport cfs-q2BPKzxxxx.lb-5179xxxx.cfs.bj.baidubce.com:/ /usr/sftp/mnt
- 执行以下命令重启sshd服务
- 登录SFTP服务,上传、下载文件
- 账号密码为步骤3中配置的用户和密码。此处以Cyberduck客户端为例,可根据实际情况使用支持SFTP协议的客户端进行连接。

