linux下Sersync实现触发式文件同步
一、为什么要用Rsync+sersync架构?
- sersync是基于Inotify开发的,类似于Inotify-tools的工具
- sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。
二、Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别?
1、Rsync+Inotify-tools
(1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
(2):rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。
2、Rsync+sersync
(1):sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
(2):rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。
(3):使用多线程进行同步,能够保证多个服务器实时保持同步状态;
(4):自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;
(5):自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;
(6):自带socket与http协议扩展,你可以方便的进行二次开发;
小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。
三、具体操作
源服务器:192.168.95.31
目标服务器:192.168.95.33
目的:把源服务器上/data/www目录实时同步到目标服务器的/data/www下
1.目标服务器配置
1.1 在目标服务器安装rsync
yum -y install rsync
1.2 在目标服务器创建配置文件/etc/rsyncd.conf,内容如下:
#运行RSYNC守护进程的用户
uid = root
#运行RSYNC守护进程的组
gid = root
#运行RSYNC守护进程的用户
uid = root
#运行RSYNC守护进程的组
gid = root
#不使用chroot
use chroot = no
#最大连接数无限制
max connections=0
#日志记录文件的存放位置
log file=/``var``/log/rsyncd.log
#锁文件的存放位置
pid file=/``var``/run/rsyncd.pid
#pid文件的存放位置
lock file=/``var``/run/rsyncd.lock
#有多少个客户端同时传文件
max connections = 200
##超时时间
timeout = 300
#这里是认证的模块名,在client端需要指定
[CacheDir]
#需要做镜像的目录,不可缺少
path =/data/www
#comment = 同步的源服务器
#comment = rsync from 192.168.95.31
#非只读
read only = no
#不允许列文件
list = on
#认证的用户名,如果没有这行则表明是匿名,此用户与系统无关
auth users = rsyncuser
#密码和用户名对比表,密码文件自己生成
secrets file = /etc/secrets.pas
1.3 Rsync****密码文件的配置
cat /etc/secrets.pas
rsyncuser:123456
chmod 600 /etc/secrets.pas
需要设置密码文件为600权限,不然同步的时候会报password file must not be other-accessible错误!
1.4 启动rsync
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
2.源服务器配置
2.1、查看服务器内核是否支持inotify
ll /proc/sys/fs/inotify #列出文件目录,出现下面的内容,说明服务器内核支持inotify
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_queued_events
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_instances
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_watches
备注:Linux下支持inotify的内核最小为2.6.13,可以输入命令:uname -a查看内核
** 2.2 修改inotify默认参数(inotify默认内核参数值太小)**
查看系统默认参数值:
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
修改参数:
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.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
:wq! #保存退出
参数说明:
max_queued_events:
inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
max_user_watches:
要同步的文件包含多少目录,可以用:find /home/www.osyunwei.com -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/www.osyunwei.com为同步文件目录)
max_user_instances:
每个用户创建inotify实例最大值
2.3 安装rsync
yum -y install rsync
2.4 安装sersync
wget http:``//sersync.googlecode.com/files/sersync2.5_64bit_binary_stable_final.tar.gz
tar xzvf sersync2.5_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86 /usr/local/sersync
2.5 配置文件详解
2.6 密码文件的配置
cat /etc/rsyncd.secret
123456
chmod 600 /etc/rsyncd.secret
主服务器的密码配置文件不需要用户,如果添加用户的话同步的时候会报
rsync error: error starting client-server protocol (code 5) at main.c(1296) [sender=2.6.8]错误
2.7 启动参数举例
- /usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/config.xml
#通常情况下使用这种方式,对本地到远程整体同步一遍后,在后台运行实时同步。
- /usr/local/sersync/sersync2 -d -o /usr/local/sersync/config.xml
#在主服务器上开启sersync守护进程,使sersync在后台运行,开启实时同步。
- /usr/local/sersync/sersync2 -r -o /usr/local/sersync/config.xml
#在开启实时监控的之前对主服务器目录与远程目标机目录进行一次整体同步
(如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效)
- /usr/local/sersync/sersync2 -n 5 -d -o /usr/local/sersync/config.xml
#指定默认的线程池的线程总数,如果不指定,默认启动线程池数量是10(适用于四核服务器)
#如果cpu使用过高,可以通过这个参数调低,如果机器配置较高,可以用-n跳高线程总数
2.8 脚本监控sersync
因为有的时候sersync脚本会自动关掉,因此需要写一个脚本自动的去检测该进程是否存在,不存在就启动,脚本内容如下:
vim check_sersync.sh
#!/bin/sh
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
:wq!
#保存退出
chmod +x /home/crontab/check_sersync.sh #添加脚本执行权限
脚本写好以后,添加到计划任务中去
*/5 * * * * /``var``/script/check_sersync.sh > /dev/``null
2>&1
四 总结
**通过以上几步以后,你从服务器的 /data/www 就能够从源服务器实时更新,升级的时候只升级源服务器的文件,从服务器也会自动同步过去,减少你的工作量以及出错的概率!
标题:linux下Sersync实现触发式文件同步
作者:LeeOcean
地址:https://www.leiocean.com/articles/2019/11/08/1573192431413.html
