rsync+sersync数据实时同步(实践篇)

一、实时同步方案选择

1、Rsync+Inotify-tools
(1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
(2):rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。

2、Rsync+sersync
(1):sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
(2):rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。

小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。


二、具体操作步骤

1、准备环境:


操作系统 CentOS 7
sersync2.5.4_64bit、xinetd-2.3.15(rpm包文件)
源服务器 192.168.0.248
目标服务器 192.168.0.249
把A机器上的一个目录下文件的变化实时同步到B机器上,两边文件保持一致;
两台服务器的selinux与iptables自行设置好,rsync的端口两边要配置一致,默认是873

2、具体操作


目标服务器

1、环境准备

rsync默认是安装好的,需要安装xinetd服务

mkdir /myrpm                                                            #然后将xinetd上传到/myrpm下

rpm -ivh xinetd-2.3.15-13.el7.x86_64.rpm                #安装xineted

yum install xinetd                                                       #或者使用yum安装


2、配置rsync

(配置是要把后面的注释去掉,否则会出错!!!)

vi /etc/rsyncd.conf

uid = root                                                  #设置rsync的运行用户权限为root
gid = root                                                  #设置rsync的运行组权限为root
use chroot =no
list = no                                                     #不显示rsync服务端资源列表
log file = /var/log/rsyncd.log                      #配置rsync日志文件存放路径
[data]                                                         #自定义模块名称
path=/data/jenkins                                    #定义需要实时同步的路径
comment=data                                          #与模块名称相同即可
ignore errors
read only=no                                              #设置rsync服务端文件为读写权限
list=no                                                         #不显示rsync服务端资源列表
max connections=200                                #允许最大的客户端连接数
timeout=600                                               #设置超时时间
auth users=rsync                                        #执行数据同步的虚拟用户名,可以设置多个,用逗号隔开
secrets file=/etc/rsync.pas                          #设置同步使用的用户及密码信息文件存放路径
hosts allow=*                                              #允许所有用户访问


3、创建密码文件

创建用于存放同步的用户及密码的文件/etc/rsync.pas,并将此文件权限修改为600

echo "rsync:1230" >> /etc/rsync.pas                        #密码文件,跟上面的配置文件要相同,密码要尽量复杂一些
chmod 600 /etc/rsync.pas


4、启动rsync与xinetd服务

systemctl start xinetd                                                      #启动xinetd服务
systemctl enable xinetd                                                  #将xinetd服务加入开机项
rsync --daemon --config=/etc/rsyncd.conf                      #加载配置文件rsyncd.conf启动rsync服务


5、配置rsync开机自启动

 echo "rsync --daemon --config=/etc/rsyncd.conf"  >> /etc/rc.d/rc.local


源服务器

1、安装sersync服务
    

    mkdir /usr/local/sersync
    mkdir /usr/local/sersync/conf
    mkdir /usr/local/sersync/bin
    mkdir /usr/local/sersync/log

    将sersync2.5.4的rpm包传到/usr/local/sersync/下 

    cd /usr/local/sersync
    tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
    cd GNU-Linux-x86/
    cp confxml.xml /usr/local/sersync/conf
    cp sersync2 /usr/local/sersync/bin


2、创建密码文件

跟目标服务器一样,不过这个文件只要保存密码即可,不需要保存用户名,权限也是600

    echo "1230" >> /etc/rsync.pas
    chmod 600 /etc/rsync.pas


3、配置sersync服务

vim /usr/local/sersync/conf/confxml.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
   <head version="2.5">
   <!--设置本地IP和端口-->
   <host hostip="localhost" port="8008"></host>
   <!--开启DUBUG模式-->
   <debug start="false"/>
   <!--开启xfs文件系统-->
   <fileSystem xfs="false"/>
   <!--同步时忽略推送的文件(正则表达式),默认关闭-->
   <filter start="false">
       <exclude expression="(.*)\.svn"></exclude>
       <exclude expression="(.*)\.gz"></exclude>
       <exclude expression="^info/*"></exclude>
       <exclude expression="^static/*"></exclude>
   </filter>
   <inotify>
   <!--设置要监控的事件-->
       <delete start="true"/>
       <createFolder start="true"/>
       <createFile start="true"/>
       <closeWrite start="true"/>
       <moveFrom start="true"/>
       <moveTo start="true"/>
       <attrib start="true"/>
       <modify start="true"/>
   </inotify>
   <sersync>
   <!--本地同步的目录路径-->
       <localpath watch="/data">
   <!--远程IP和rsync模块名-->
           <remote ip="192.168.0.249" name="data"/>  
       </localpath>
       <rsync>
   <!--rsync指令参数-->
           <commonParams params="-auvzP"/>
   <!--rsync同步认证-->
           <auth start="true" users="rsync" passwordfile="/etc/rsync.pas"/>
   <!--设置rsync远程服务端口,远程非默认端口则需打开自定义-->
           <userDefinedPort start="false" port="873"/><!-- port=874 -->
   <!--设置超时时间-->
           <timeout start="true" time="100"/><!-- timeout=100 -->
   <!--设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书-->
           <ssh start="false"/>
       </rsync>
    <!--sersync传输失败日志脚本路径,每隔60会重新执行该脚本,执行完毕会自动清空-->
       <failLog path="/usr/local/sersync/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    <!--设置rsync+crontab定时传输,默认关闭-->
       <crontab start="false" schedule="600"><!--600mins-->
           <crontabfilter start="false">
               <exclude expression="*.php"></exclude>
               <exclude expression="info/*"></exclude>
           </crontabfilter>
       </crontab>
   <!--设置sersync传输后调用name指定的插件脚本,默认关闭-->
       <plugin start="false" name="command"/>
   </sersync>
   <!--插件脚本范例-->
   <plugin name="command">
       <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
       <filter start="false">
           <include expression="(.*)\.php"/>
           <include expression="(.*)\.sh"/>
       </filter>
   </plugin>
   <!--插件脚本范例-->
   <plugin name="socket">
       <localpath watch="/opt/tongbu">
           <deshost ip="192.168.138.20" port="8009"/>
       </localpath>
   </plugin>
   <plugin name="refreshCDN">
       <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
           <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxx"/>
           <sendurl base="http://pic.xoyo.com/cms"/>
           <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
       </localpath>
   </plugin>
</head>

4、设置环境变量

    echo "export PATH=$PATH:/usr/local/sersync/bin/" >> /etc/profile
    source /etc/profile


5、启动、重启、停止sersync服务

 sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml                                                        #启动
 killall sersync2 && sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml                          #重启
 killall sersync2                                                                                                                    #停止

6、设置开机启动sersync

echo "sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml" >> /etc/rc.d/rc.local

7、测试

最后重启下目标服务器的xinetd,开始测试。

本实验用于jenkins环境迁移,可以看到,已经开始同步啦

三、问题出现与解决

问题1:

问题描述:rsync: failed to connect to xxxx (xxxx): Connection refused (111)
                 rsync error: error in socket IO (code 10) at clientserver.c(125) [Receiver=3.1.2]

 问题解答:一般是连接的问题

        1、首先查看rsync服务有没有运行

        2、查看两端的sexlinux和防火墙有没有开启

        3、telnet对方端口是否可通

       本次实验是因为在阿里云环境,防火墙虽然关闭了,但是阿里云的安全组还有限制,导致我排查了很久。

问题2:

问题描述:@ERROR: auth failed on module data
                   rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]

 问题解答:一般是rsync模块配置的问题

        1、首先采用输入密码的方式进行测试,可以提示密码,输入密码后正常,由此排查是加密文件的问题。

         2、查看加密文件是否正确。是否是600权限

         3、源服务器的加密文件内容是密码。本实验添加的账号:密码,导致问题产生

注: 

以上为本人实际搭建过程中的经验总结,如果有什么问题,可以在评论区留言,大家一起探讨进步!

猜你喜欢

转载自blog.csdn.net/tiny_du/article/details/119411467