集群间服务器实现数据的同步一直是一个问题,比如一个lvs集群中,如果有上百台RS服务器,当更新Web程序时,如何在这么多台服务器间进行快速的更新,这是一个问题,如果使用手动更新,或者scp等命令,明显是不可取的。因此,介绍这样rsync+sersync的组合工具实现多台服务器直接的文件数据同步。
Rsync服务在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。
Sersync服务可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。
环境:
操作系统:CentOS 7.3
源服务器:192.168.30.10
目标服务器: 192.168.30.20
目的:把源服务器上/home/Sync目录实时同步到目标服务器的/home/Sync下
具体操作:
第一部分:在目标服务器192.168.0.50上操作
一、在目标服务器安装Rsync服务端
1、关闭SELINUX
2、关闭防火墙
3、安装Rsync服务端软件
#yum install rsync xinetd #安装
rsync是由超级守护进程xinetd来启动的。因此需要启动xinetd服务。
# vi /etc/rc.d/rc.local #设置开机启动
/usr/bin/rsync –daemon –config=/etc/rsyncd.conf
# chmod +x/etc/rc.d/rc.local #否则重启不执行
4、创建rsyncd.conf配置文件
vim /etc/rsyncd.conf
- 添加自定义的配置文件内容,配置文件中需要删除其中的添加配置后的注释。截图中的注释仅作提示。
5、创建用户认证文件
#vi/etc/rsync.pass #配置文件,添加以下内容,添加允许传输用户和密码
Sync:123 #格式,用户名:密码,可以设置多个,每行一个用户名:密码
6、设置文件权限
#chmod 600 /etc/rsyncd.conf #设置文件所有者读取、写入权限
#chmod 600 /etc/rsync.pass #设置文件所有者读取、写入权限
- 权限设置必须为600,否则rsync会报错,这是基于安全的考虑。
7、启动rsync
# systemctl start rsyncd
第二部分:在源服务器192.168.30.10上操作
一、安装Rsync客户端
1、关闭SELINUX
2、关闭防火墙
3、安装Rsync客户端端软件
#yum install rsync
# vi /etc/rc.local #设置开机启动
/usr/bin/rsync –daemon
#vim/etc/rsyncd.conf #编辑配置文件添加如下的配置规则
- 配置文件中设置的规则需与目标端的设置相符。
#systemctl start xinetd #启动(CentOS中是以xinetd来管理rsync服务的)
如果没有安装xinetd,需要手动安装。
4、创建认证密码文件
#vi /etc/passwd.txt #编辑文件,添加以下内容,该密码应与目标服务器中的/etc/rsync.pass中的密码一致,
123 #密码
#chmod 600 /etc/passwd.txt #设置文件权限,只设置文件所有者具有读取、写入权限即可
5、测试源服务器192.168.30.10到目标服务器 192.168.30.20,之间的数据同步
#mkdir -p /home/Sync/ceshi 在目标服务器上创建测试文件夹
在源服务器运行下面1行命令
运行完成后,在目标服务器192.168.30.10上查看,在/home/Sync/目录下有ceshi文件夹,说明数据同步成功,命令中目录可以随意目录,传输到目标服务器目录时文件(或目录)均放到/etc/rsyncd.conf配置的服务器目录路径,如果源目录改变了,那么传输时两个目录将进行目录匹配,会有增删动作,因此需要注意。
Rsync服务文件同步成功,但是需要手动触发,现在搭建sersync服务,配合crontab定时任务和脚本自动触发数据同步。
sersync是基于Inotify开发的,类似于Inotify-tools的工具,所以先查看一下inotify的内核参数,并适当修改,如果参数过小可能导致报错。
1.查看系统默认参数值:
sysctl -a | grep max_queued_events
结果是:fs.inotify.max_queued_events= 16384
sysctl -a | grep max_user_watches
结果是:fs.inotify.max_user_watches= 8192
sysctl -a | grep max_user_instances
结果是:fs.inotify.max_user_instances= 128
2.修改参数:
#sysctl -wfs.inotify.max_queued_events=”99999999″
#sysctl -w fs.inotify.max_user_watches=”99999999″
#sysctl -wfs.inotify.max_user_instances=”65535″
#vi /etc/sysctl.conf #添加以下代码
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
参数说明:
max_queued_events:
inotify队列最大长度,如果值太小,会出现” Event QueueOverflow “错误,导致监控文件不准确
max_user_watches:
要同步的文件包含多少目录,可以用:find /home/Sync-type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/
home/Sync为同步文件目录)
max_user_instances:
每个用户创建inotify实例最大值
3、安装sersync
下载sersync2.5.4_64bit_binary_stable_final.tar.gz
#tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
#mv GNU-Linux-x86 /usr/local/sersync #移动目录到/usr/local/sersync
wget–no-check-certificate https://raw.githubusercontent.com/orangle/sersync/master/release/sersync2.5.4_64bit_binary_stable_final.tar.gz
4.配置sersync
#cd /usr/local/sersync #进入sersync安装目录
#cp confxml.xml confxml.xml-bak #备份原文件
#vi confxml.xml #编辑,修改下面的代码
参数说明:
截图中圈出的是需要修改的地方
localpath watch=”/home/Sync”:#源服务器同步目录
192.168.30.20:#目标服务器IP地址
name=”Sync”: #目标服务器rsync同步目录模块名称
users=”Sync”: #目标服务器rsync同步用户名
passwordfile=”/etc/rsync.pass”: #目标服务器rsync同步用户的密码在源服务器的存放路径
remote ip=”192.168.30.20″: #目标服务器ip,每行一个
failLogpath=”/tmp/rsync_fail_log.sh” #脚本运行失败日志记录
start=”true” #设置为true,每隔600分钟执行一次全盘同步
5、设置sersync监控开机自动执行
#vi /etc/rc.d/rc.local #编辑,在最后添加一行
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml #设置开机自动运行脚本
:wq! #保存退出
# chmod +x /etc/rc.d/rc.local #否则重启不执行
6、添加脚本监控sersync是否正常运行,或者直接将同步命令写入计划任务,按时执行同步。
#mkdir /home/crontab
#vi /home/crontab/check_sersync.sh #编辑,添加以下代码
#!/bin/bash
sersync=”/usr/local/sersync/sersync2″
confxml=”/usr/local/sersync/confxml.xml”
status=“$(ps aux |grep ‘sersync2’|grep -v ‘grep’|wc -l)
if [$status -eq 0 ];“
then$sersync -d-r -o $confxml &
else
exit 0;
fi
#chmod +x /home/crontab/check_sersync.sh#添加脚本执行权限
#vi /etc/crontab #编辑,在最后添加下面一行
/5 * root /home/crontab/check_sersync.sh >/dev/null 2>&1 #每隔5分钟执行一次脚本
#重新加载服务
#systemctl restart crond.service
6、测试sersync实时触发rsync同步脚本是否正常运行
在源服务器192.168.30.20上创建文件inotify_rsync_ceshi
#mkdir /home/Sync/inotify_rsync_ceshi
重新启动源服务器:192.168.30.10
等系统启动之后,查看两台目标服务器 192.168.30.10的/home/Sync下是否有inotify_rsync_ceshi文件夹
如果测试通过,说明inotify实时触发rsync同步脚本运行正常。
原文链接:https://developer.aliyun.com/article/589947