一、实时同步方案选择
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、源服务器的加密文件内容是密码。本实验添加的账号:密码,导致问题产生
注:
以上为本人实际搭建过程中的经验总结,如果有什么问题,可以在评论区留言,大家一起探讨进步!