Sersync介绍
Sersync是结合inotify机制和rsync技术实现的对服务器数据实时复制的解决方案,inotify用于监控服务器上文件系统 的事件变化,rsync将变化的数据复制到远端备份服务器上。
sersync的特点
- 支持对监控的事件的过滤功能
- 采用xml配置文件,由守护进程启动,配置起来比inotify简单
- 使用多线程进行复制,可以并发复制多个不同文件
- 自带出错处理机制,通过失败队列对出错的文件重新复制
- 自带crontab功能,可实现对失败队列中的文件定时整体复制
- 自带socket与http的协议扩展,可以满足有特殊需求的公司二次开发
sersync原理图
部署Sersync+Rsync
前期准备
确保rsync环境部署完成
参考rsync部分内容
检查Linux系统支持inotify实时监控
1 2
| uname -r # 检查操作系统内核版本是否超过2.6.13 ll /proc/sys/fs/inotify # 检查inotif文件是否存在(应包含三个文件)
|
文件名称 |
作用说明 |
max_queued_events |
设置inotify实例事件队列可容纳的事件数量 |
max_user_instances |
设置每个用户最多可以运行的inotify命令的进程数 |
max_user_watches |
设置inotify命令最多可以监视的文件数量(单进程) |
安装inotify工具
1 2 3 4
| yum install inotify-tools -y # 安装 rpm -ql inotify-tools # 查看包含的文件 /usr/bin/inotifywait # 在被监控的目录中等待特定事件的发生(open、close、delete)等,执行后处于阻塞状态,是实现监控的重点。 /user/bin/inotifywatch # 收集被监控的文件系统的使用数据,指文件系统事件发生的次数统计。
|
部署Sersync
安装Sersync
1 2 3 4 5 6
| mkdir -p /server/tools cd /server/tools wget https://github.com/wsgzao/sersync/blob/master/sersync2.5.4_64bit_binary_stable_final.tar.gz tar -xvf sersync2.5.4_64bit_binary_stable_final.tar.gz ls GNU-Linux-x86 cat confxml.xml
|
编辑配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| <?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> <debug start="false"/> <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="false"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify>
<sersync> <localpath watch="/data1"> <remote ip="1192.168.110.142" name="/data1"/> </localpath> <rsync> <commonParams params="-artuz"/> <auth start="true" users="rsync" passwordfile="/etc/rsyncd.password"/> <userDefinedPort start="false" port="874"/> <timeout start="false" time="100"/> <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/> <crontab start="false" schedule="600"> <crontabfilter start="false"> <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync>
<plugin name="command"> <param prefix="/bin/sh" suffix="" ignoreError="true"/> <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="xxxx"/> <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>
|
启动Sersync
1 2 3 4 5 6 7 8 9 10 11
| /server/tools/GNU-Linux-x86/sersync2 -h # 查看命令帮助,要使用 [绝对路径] -h 参数-d:启用守护进程模式 参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍 c参数-n: 指定开启守护线程的数量,默认为10个 参数-o:指定配置文件,默认使用confxml.xml文件 参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块 参数-m:单独启用其他模块,使用 -m socket 开启socket模块 参数-m:单独启用其他模块,使用 -m http 开启http模块 不加-m参数,则默认执行同步程序
/server/tools/GNU-Linux-x86/sersync2 -r -o /server/tools/GNU-Linux-x86/confxml.xml -d # 开启Sersync
|
配置systemctl
启动方案
兼容Cent OS 6
因为Sersync不是本地服务,所以默认不能使用systemctl
的方式来控制进程。关闭必须要使用ps -ef | grep sersync
来找到进程id,通过kill命令来停止。每次开启都要使用这条命令,/server/tools/GNU-Linux-x86/sersync2 -r -d
,把这条命令写入rc.local
实现开机自启,比较繁琐。
配置systemctl
启动方案的步骤:
1. 写启动脚本
1
| vim /etc/rc.d/init.d/sersync # 编辑系统启动的脚本
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #!/bin/bash # chkconfig: 2345 21 81 centos6实现开机启动顺序以及在哪些级别上开机启动 # description: rsync service start and stop scripts
start(){ /server/tools/GNU-Linux-x86/sersync2 -d &>/dev/null } stop(){ killall sersync2 2>/dev/null } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 2 start ;; *) echo $"Usage:$0 {start|stop|restart}" exit 1 esac
|
1 2 3 4 5
| chmod +x /etc/rc.d/init.d/sersync # 增加执行权限
# 此时已经能够通过脚本来控制程序启动和停止,可以通过ps -ef | grep sersync验证是否成功 /etc/init.d/sersync start /etc/init.d/sersync stop
|
2. 通过service来控制
1 2 3 4
| chkconfig sersync on # 输入这条指令,可以使用下面的命令来控制程序启动关闭
service sersync start service sersync stop
|
3. 使用systemctl来控制
1
| vim /usr/lib/systemd/system/sersyncd.service # 编辑系统服务的脚本(除此之外还有/etc/systemd/system)
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| [Unit] Description=sersyncd service After=network.target [Service] Type=forking ExecStart=/etc/rc.d/init.d/sersync start ExecReload=/etc/rc.d/init.d/sersync restart ExecStop=/etc/rc.d/init.d/sersync stop PrivateTmp=true [Install] WantedBy=multi-user.target
|
1 2 3 4 5 6
| # 此时已经能够通过systemctl来控制程序启动关闭以及开机自启 systemctl start sersyncd systemctl restart sersyncd systemctl stop sersyncd systemctl enable sersyncd systemctl disable sersyncd
|