Linux 数据实时同步:Rsync+Sersync
Linux 2014-03-05 3223
  在《Linux 文件实时同步:Sersync 介绍》中我们详细介绍了 Sersync 的原理,设计架构以及和 Inotify 等等的优势区别。这里我就带大家一起来做一下 Rsync + Sersync 这个同步分发架构案例。

实验环境介绍:
  操作系统:CentOS 6.4(最小化安装)
  Sersync 服务器(即 SerSync,Rsync 客户端),承担 MASTER 角色,IP:3.3.3.3
  # SerSyncSlave,作为 SerSync 的从机,如果 SerSync 宕机,SerSyncSlave 来接管服务,保证业务不中断,本实验不包括它!

  Web服务器A(即 WebA,Rsync 服务端),IP:1.1.1.1
  Web服务器B(即 WebB,Rsync 服务端),IP:2.2.2.2

  架构图:


一、在两台 SWeb 服务器上部署 Rsync 服务端程序
  特别提醒:本文的 SWeb 服务器即为 SWebA(1.1.1.1),SWebB(2.2.2.2)。此处仅以 SWebA 的 Rsync 服务端部署为例,SWebB 的部署和SWebA 一样,此处不再敖述。

  1、安装 Rsync
  # yum install rsync -y

  2、修改 Rsync 配置文件
  # vim /etc/rsyncd.conf   # Rsync Server
   uid = ftp  # rsync对后面模块中的path路径里文件的权限
   gid = ftp  # rsync对后面模块中的path路径里文件的权限
   use chroot = no  # 安全操作
   max connections = 2000  # 定义连接数2000
   timeout = 600  # 600秒超时
   pid file = /var/run/rsyncd.pid
   lock file = /var/run/rsync.lock
   log file = /var/log/rsyncd.log
   ignore errors  # 忽略错误
   read only = false  # false才能上传文件,true不能上传文件
   list = false  # 文件列表
   hosts allow = 1.1.1.1
   auth users = vusr  # 虚拟用户,同步时需要用这个用户
   secrets file = /etc/rsync.pass  # 密码文件
   #####################################
   [upload1]  # 模块名称
   path = /data/httpd/htdocs/upload1/  # 模块的路径
   #####################################
   [upload2]  # 模块名称
   path = /data/httpd/htdocs/upload2/  # 模块的路径
   #####################################

  特别提示:此处,使用一个多目录同步的案例。大家可以看需求,如果需求只有一个,那仅仅做一个目录即可。

  上面的 Rsync 服务的配置文件,表明允许 1.1.1.1 的主机访问,Rsync 同步模块名为 [upload1]和[upload2],将同步过来的文件分别放入对应 path 指定的目录 /data/httpd/htdocs/upload1,/data/httpd/htdocs/upload2下。

  如果有多台目标服务器,则每一台都需要进行类似的 rsync 服务端配置,上面的 uid 和 gid 需要换成你服务器的相应的同步用户。注意,Rsync 服务账户(本文用root)要有对被同步目录(/data/httpd/htdocs/upload1 和 /data/httpd/htdocs/upload2)的写入和更新权限。

  3、创建相关待同步目录
  # mkdir -p /data/httpd/htdocs/{upload1, upload2}
  提示:此步在SWebA,SWebB上都要执行,否则,rsync 服务会因为没有 PATH 路径而无法启动

  4、相关认证和权限项配置
  # echo 'vusr:vpass' > /etc/rsync.pass
  # chmod 600 /etc/rsync.pass

  5、以守护进程方式启动rsync服务
  # rsync --daemon

  6、查看 rsync 服务状态
  # lsof -i tcp:873
   rsync 20982 root 3u IPv4 88170 0t0 TCP *:rsync (LISTEN)
   rsync 20982 root 5u IPv6 88171 0t0 TCP *:rsync (LISTEN)

  7、为rsync添加开机自启动
  # echo "/usr/bin/rsync --daemon" >> /etc/rc.local

  这里顺带附上重启的命令,rsync 重启有点麻烦,需要以先杀掉后台守护进程,然后再启动的方式来重启服务。
  # pkill rsync
  # rsync --daemon

二、在 SerSync 服务器上配置 rsync 客户端
  1、安装 Rsync 并配置相关权限
  # yum install rsync
  # echo "vpass" > /etc/rsync.pass
  # chmod 600 /etc/rsync.pass

  2、在 SerSync 上手动测试 rsync 的同步情况
  特别强调:此步很关键,如果这不能同步,后面的 SerSync 配好了也不会同步数据。
  1)分别创建待同步数据
    # mkdir /data/httpd/htdocs/{upload1,upload2} -p
    # touch /data/httpd/htdocs/{upload1/a.html, upload2/b.jpg}

  2)执行同步命令
    # rsync -avzP /data/httpd/htdocs/upload1/ vusr@1.1.1.1::upload1 --password-file=/etc/rsync.pass
    # rsync -avzP /data/httpd/htdocs/upload2/ vusr@1.1.1.1::upload2 --password-file=/etc/rsync.pass
    # rsync -avzP /data/httpd/htdocs/upload1/ vusr@2.2.2.2::upload1 --password-file=/etc/rsync.pass
    # rsync -avzP /data/httpd/htdocs/upload2/ vusr@2.2.2.2::upload2 --password-file=/etc/rsync.pass

  同步完之后,分别对 SWebA,SWebB 的相应目录进行查看!此处以 SWebA 为例:提示:在后面进行部署 Sersync 之前,SerSync 主服务器上必须要确保手动可以把文件推送到 SWebA,SWebB 上,这样后续 Sersync 才能调用这些命令来自动推送。

三、在 SerSync 服务器上配置 Sersync 服务
  上面的工作做好之后呢,下面就开始正式配置我们的 Sersync 了!
  我们在 Sersync 安装过程中所用到包均是从谷歌 Sersync 项目组取得的,地址:https://code.google.com/p/sersync/downloads/list
  这里,我所用的将是这个 sersync2.5.4_64bit_binary_stable_final.tar.gz 的64位可执行文件版本,里面已经包含了配置文件与可执行文件。下面的操作也都是基于该版本去做的。

  1、准备 Sersync 的安装包
    # wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
    # tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
     GNU-Linux-x86/
     GNU-Linux-x86/sersync2
     GNU-Linux-x86/confxml.xml

  2、安装 Sesync
    # cp -r GNU-Linux-x86 /usr/local/sersync

  3、规范 Sersync 目录结构
    # cd /usr/local/sersync
    # mkdir conf bin logs
    # mv confxml.xml conf
    # mv sersync2 bin/sersync

  4、配置 Sersync
    #vim conf/confxml.xml
   为了满足我们的需求,我们需要修改如下几处设置:
   1)修改24-28行的内容,内容修改为:
     <localpath watch="/data/httpd/htdocs/upload1">
      <remoteip="1.1.1.1" name="upload1"/>
      <remoteip="2.2.2.2" name="upload1"/>
     </localpath>

   2)修改31-34行,认证相关部分:
     <commonParams params="-aruz"/>
     <auth start="true" users="vusr" passwordfile="/etc/rsync.pass"/>
     <timeout start="true" time="100"/>

   3)修改36-37行
     <failLog path="/usr/local/sersync/logs/fail.sh" timeToExecute="60">
     当同步失败后,日志记录到/usr/local/sersync/logs/fail.sh,并且每60分钟对失败的log进行重新同步。

   以上的配置文件,我们仅仅配置了针对 SWebA 和 SWebB 上 upload1 这个模块,即 /data/httpd/htdocs/upload1 目录的自动同步。由于我们还有一个 upload2 模块,即 /data/httpd/htdocs/upload2 目录需要进行自动同步。因此这就意味着,我们需要配置多实例了。

  Sersync 的多实例和往常的apache,nginx一样,你只需要把配置文件拷贝一份出来,然后针对不同的实例做不同的修改,然后在最后开启 Sersync 服务的时候指定不同的配置文件做启动即可!

  配置针对 upload2 的实例配置文件:
    # cp /usr/local/sersync/conf/confxml.xml /usr/local/sersync/conf/confxml_upload2.xml

  修改方法如上,这里仅贴出和上个实例之间不一样的地方:
    <localpath watch="/data/httpd/htdocs/upload2">
      <remote ip="1.1.1.1" name="upload2"/>
      <remote ip="2.2.2.2" name="upload2"/>
    </localpath>

  5、开启 Sersync 守护进程进行数据同步
   注意:我们这里要启动的是多实例,即 confxml.xml 和 confxml_upload2.xml
   # /usr/local/sersync/bin/sersync -r -d -o /usr/local/sersync/conf/confxml.xml
   # /usr/local/sersync/bin/sersync -r -d -o /usr/local/sersync/conf/confxml_upload2.xml

   开启后查看进程
   # ps -ef |grep sersync

   配置开机自启动
   # vim /etc/rc.local
    /usr/local/sersync/bin/sersync -d -o /usr/local/sersync/conf/confxml.xml
    /usr/local/sersync/bin/sersync -d -o /usr/local/sersync/conf/confxml_upload2.xml

  注意:-r 参数作用是在开启实时监控的之前对主服务器目录与远程目标机目录进行一次整体同步(同步会删除远程目标机目录下其他的文件和目录)