使用rsync从旧文件系统同步到CFS文件系统
本文档提供了一种基于rsync
的数据同步方案,帮助用户将存储在本地机房、其它云厂商的文件系统数据备份或迁移到百度智能云CFS中。
以下假设被同步的文件系统已经挂载在一台或者多台服务器上,路径为/old_fs
。
操作步骤
-
登录云服务器
- 在云服务器BCC上绑定EIP,从而拥有公网IP。
- 确保远端服务器可以通过ssh方式登录到BCC的公网IP。
-
配置公钥
登录远端服务器,执行如下命令:
ssh-keygen -t rsa #创建公钥,会提示输入信息,可以不用管,一直敲回车即可 cat ~/.ssh/id_rsa.pub #查看生成的公钥,将这里的内容拷贝,准备输入下一步中的文件中
登录BCC,编辑文件
~/.ssh/id_rsa.pub
,将上一步拷贝的公钥,输入到这里。至此,现在从远端服务器,即可无需秘钥登录并访问BCC。
-
策略评估
用户需要评估以下因素,以采用更合适的方式来同步数据:
- 同步期间是否可以暂停对已有文件系统的写入。如果可以,则只执行一次全量同步(同步方案4.1)。如果不可以,请评估同步期间的新写入数据量,若数据量很少,可以使用全量同步+一次增量同步(同步方案4.2),否则使用周期性同步方案4.3。
- 文件系统的数据量。若已有文件系统数据量较大,则分目录进行同步。每个子目录的同步,是不相关的,既可同时进行,也可序列化执行。同时,CFS支持多个虚机同时挂载,适当增加虚机的数量来并发执行子目录的同步可提高同步的速度。
-
同步方案
同步过程会针对用户对旧文件系统是否有写操作而略有不同。下面分别讨论以下几种情况:
4.1 用户没有写IO请求到原有文件系统
首先确认CFS文件系统已经被mount到BCC上机器上的/mnt/cfs/或其他目录上,接着在远端服务器上执行如下命令:
rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1 rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_2 rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_3 ...
注释
–z:允许压缩
–v:冗长
–r:递归
user:bcc的登录账号
bcc_ip:BCC的公有IP地址
4.2 用户有少量的写IO请求到原有文件系统
若用户有写IO的请求,此时通过rsync命令,不能保证原文件系统和CFS文件系统保持绝对同步。但rsync内部的算法可以保证两个文件系统是大部分同步的。用户可以在第一次rsync执行完毕后,暂停应用程序的写操作IO到原有文件系统。具体步骤如下:
- 用户对旧文件系统的写IO可以继续。在远端服务器上执行如下命令:
rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1 rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_2 rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_3 ...
- 暂停用户对旧文件系统的写IO。在远端服务器上执行如下命令:
rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1 rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_2 rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_3 ...
第二次执行rsync操作时,由于已经做过一次同步操作,第二次会根据计算两个文件的差异,然后进行同步。因此,第二次执行rsync操作会快很多。
4.3 用户有大量的写IO请求到原有文件系统
当用户的应用程序有大量的写IO,同时又不能暂停IO的情况下。理论上无法通过同步保证旧文件系统和CFS的强一致性。此时可以考虑周期的运行rsync操作,尽可能让两个文件系统保持最大程度的一致。在Linux系统下,有多重周期执行命令的办法,这里我们推荐使用crontab,它可以方便的周期的调用rsync。例如:
crontab -e
接着将下列内容输入,其含义是每间隔1小时调动一次rsync命令。
* */1 * * * rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1
可通过如下命令查看crontab命令是否配置成功。
crontab -l
当用户经过一段周期的从旧文件系统到百度CFS的同步后,选择一个合适时机,暂停应用程序对旧文件系统的写操作,同时删掉crontab的任务,操作如下:
crontab -e #根据提示,删除rsync任务并退出
最后再手动的执行以下rsync命令,再次确保两个文件系统完全同步。
rsync -zvr /old_fs/sub_folder_1/ user@bcc_ip:/mnt/cfs/sub_folder_1 rsync -zvr /old_fs/sub_folder_2/ user@bcc_ip:/mnt/cfs/sub_folder_2 rsync -zvr /old_fs/sub_folder_3/ user@bcc_ip:/mnt/cfs/sub_folder_3 ...
此时,用户则可以从旧的服务器迁移应用程序到百度BCC服务器上。
-
统计结果
每当执行完rsync后,会显示出这次同步的结果,其中包括:
- 同步花费的时间;
- 传送了多少字节;
- IO传送的速度;
- 一共有多少文件被同步。