文件存储CFS

    使用rsync从旧文件系统同步到CFS文件系统

    本文档提供了一种基于rsync的数据同步方案,帮助用户将存储在本地机房、其它云厂商的文件系统数据备份或迁移到百度智能云CFS中。

    以下假设被同步的文件系统已经挂载在一台或者多台服务器上,路径为/old_fs

    操作步骤

    1. 登录云服务器

      1. 在云服务器BCC上绑定EIP,从而拥有公网IP。
      2. 确保远端服务器可以通过ssh方式登录到BCC的公网IP。
    2. 配置公钥

      登录远端服务器,执行如下命令:

      ssh-keygen -t rsa      #创建公钥,会提示输入信息,可以不用管,一直敲回车即可
      cat ~/.ssh/id_rsa.pub  #查看生成的公钥,将这里的内容拷贝,准备输入下一步中的文件中 

      登录BCC,编辑文件~/.ssh/id_rsa.pub,将上一步拷贝的公钥,输入到这里。

      至此,现在从远端服务器,即可无需秘钥登录并访问BCC。

    3. 策略评估

      用户需要评估以下因素,以采用更合适的方式来同步数据:

      1. 同步期间是否可以暂停对已有文件系统的写入。如果可以,则只执行一次全量同步(同步方案4.1)。如果不可以,请评估同步期间的新写入数据量,若数据量很少,可以使用全量同步+一次增量同步(同步方案4.2),否则使用周期性同步方案4.3。
      2. 文件系统的数据量。若已有文件系统数据量较大,则分目录进行同步。每个子目录的同步,是不相关的,既可同时进行,也可序列化执行。同时,CFS支持多个虚机同时挂载,适当增加虚机的数量来并发执行子目录的同步可提高同步的速度。
    4. 同步方案

      同步过程会针对用户对旧文件系统是否有写操作而略有不同。下面分别讨论以下几种情况:

      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到原有文件系统。具体步骤如下:

      1. 用户对旧文件系统的写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
      ...
      1. 暂停用户对旧文件系统的写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服务器上。

    5. 统计结果

      每当执行完rsync后,会显示出这次同步的结果,其中包括:

      1. 同步花费的时间;
      2. 传送了多少字节;
      3. IO传送的速度;
      4. 一共有多少文件被同步。
    上一篇
    使用SFTP上传下载CFS文件系统数据
    下一篇
    API参考