
Sersync实时同步实战
1.什么是实时同步
- 实时同步是一种只要当前目录触发事件,就马上同步到远程的目录。
为什么要实时同步
- 保证数据的连续性(定时任务是以分钟为单位的)
- 减少人力维护成本
实时同步工具的选择
- inotify+RSYNC
- sersync+RSYNC
- lsyncd
Inotify是一个通知接口,用来监控文件系统的各种变化,如果文件存取,删除,移动。可以非常方便地实现文件异动告警,增量备份,并针对目录或文件的变化及时作出响应。rsync+inotify可以实触发式实时同步增量备份
sersync是国人基于rsync+inotify-tools开发的工具,不仅保留了优点同时还强化了实时监控,文件过滤,简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。sersync项目地址sersync优点
- 1)支持通过配置文件管理
- 2)真正的守护进程socket(不需要写脚本)。
- 3)可以对失败文件定时重传(定时任务功能)。
- 4)第三方的HTTP接口(例如更新cdn缓存)。
- 5)默认多线程rsync同步。
2.Sersync模拟环境
准备三台机器
1.web (挂载nfs上共享的目录)
2.nfs (提供共享目录/data)
3.rsync (提供仓库/data)1.back服务器只建立rsyncd服务 主要用来做仓库 其他服务器的文件推送到此服务器的指定目录(服务端-至-客户端)
2.nfs服务器(nfs服务端+rsync客户端)主要用来共享NFS指定目录 sersync主要监控指定目录变换然后执行rsync客户端推送到服务端
3.web服务 (nfs挂载端)主要挂载nfs共享存储
3.安装nfs
[root@nfs01 ~]# yum install nfs-utils -y
4.配置nfs
[root@nfs01 ~]# cat /etc/exports /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
5.初始环境
[root@nfs01 ~]# mkdir -p /data [root@nfs01 ~]# groupadd -g666 www [root@nfs01 ~]# useradd -u666 -g666 www [root@nfs01 ~]# id www uid=666(www) gid=666(www) groups=666(www) [root@nfs01 ~]# chown -R www.www /data
6.启动nfs
[root@nfs01 ~]# systemctl start nfs-server
7.在web上操作如下
1)创建一个挂载点目录
[root@web01 ~]# mkdir -p /data2)启动rpc远程过程调用
[root@web01 ~]# yum install nfs-utils -y [root@web01 ~]# systemctl start rpcbind3)使用showmount命令查看远程共享
[root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/244)使用mount命令进行挂载
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /data/ 5)检查挂载情况 [root@web01 ~]# df -h Filesystem Size Used Avail Use% Mounted on 172.16.1.31:/data 98G 1.7G 97G 2% /data5)在web上写入数据,检查数据存在web端还是nfs上
[root@web01 ~]# cd /data/ [root@web01 data]# touch web_file [root@web01 data]# ll -rw-r--r-- 1 www www 0 Sep 10 11:23 web_file
8.nfs中的/data目录一旦发生变更立即进行同步
1.在nfs上面安装sersync
2.推送nfs共享的/data目录至backup服务器的/data
先在backup服务器上面开放一个模块,这个模块对应的就是/data目录
8.1 Backup操作步骤如下
1.安装rsync[root@backup-41 ~]# yum install rsync -y2.配置rsync
[root@backup-41 ~]# cat /etc/rsyncd.conf uid = www gid = www port = 873 fake super = yes use chroot = no max connections = 200 timeout = 600 ignore errors read only = false list = false auth users = rsync_backup secrets file = /etc/rsync.password log file = /var/log/rsyncd.log ##################################### [backup] path = /backup [data] path = /data # 建立对应密码文件 [root@backup-41 ~]# echo "rsync_backup:123456" > /etc/rsync.password4.创建对应目录并授权
[root@backup ~]# useradd -M -s /sbin/nologin rsync [root@backup ~]# echo "rsync_backup:123456" >/etc/rsync.password [root@backup ~]# chmod 600 /etc/rsync.password [root@backup ~]# mkdir /backup /data -p [root@backup ~]# chown -R rsync.rsync /backup /data5.启动rsync
[root@backup-41 ~]# systemctl enable rsyncd [root@backup-41 ~]# systemctl start rsyncd [root@backup-41 ~]# netstat -lntp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1680/rsync
9.Nfs-Server操作步骤如下(不需要配置rsync服务)
1.安装sersync
# sersync需要依赖inotify和rsync,所以需要安装对应软件 [root@nfs01 ~]# yum install rsync inotify -y # 安装sersync [root@nfs01 ~]# mkdir /server/tools -p [root@nfs01 ~]# cd /server/tools/ [root@nfs01 tools]# wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz [root@nfs01 tools]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz [root@nfs01 tools]# mv GNU-Linux-x86/ /usr/local/sersync2.配置sersync实时同步
1.修改配置文件confxml.xm<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> <debug start="false"/> <fileSystem xfs="true"/> <!--文件系统--> <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"> <remote ip="172.16.1.41" name="data"/> <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> <commonParams params="-az"/> <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/> <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="true" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> <crontab start="false" schedule="600"><!--600mins--> <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"/> <!--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="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>2.confxml.xml需要修改的地方
[root@nfs01 sersync]# vim confxml.xml 5 <fileSystem xfs="true"/> <!-- 文件系统 --> 6 <filter start="false"> <!-- 排除不想同步的文件--> 7 <exclude expression="(.*)\.svn"></exclude> 8 <exclude expression="(.*)\.gz"></exclude> 9 <exclude expression="^info/*"></exclude> 10 <exclude expression="^static/*"></exclude> 11 </filter> 12 <inotify> <!-- 监控的事件类型 --> 13 <delete start="true"/> 14 <createFolder start="true"/> 15 <createFile start="true"/> 16 <closeWrite start="true"/> 17 <moveFrom start="true"/> 18 <moveTo start="true"/> 19 <attrib start="false"/> 20 <modify start="false"/> 21 </inotify> 23 <sersync> 24 <localpath watch="/data/www"> <!-- 监控的目录 --> 25 <remote ip="172.16.1.41" name="data"/> <!-- backup的IP以及模块 --> 26 <!--<remote ip="192.168.8.39" name="tongbu"/>--> 27 <!--<remote ip="192.168.8.40" name="tongbu"/>--> 28 </localpath> 29 <rsync> <!-- rsync的选项 --> 30 <commonParams params="-az"/> 31 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/> 32 <userDefinedPort start="false" port="874"/><!-- port=874 --> 33 <timeout start="true" time="100"/><!-- timeout=100 --> 34 <ssh start="false"/> 35 </rsync> <!-- 每60分钟执行一次同步--> 36 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--def ault every 60mins execute once-->3.使用命令
4.启动sersync
[root@nfs01 ~]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml5.模拟NFS故障
web->nfs->backup
web->backup 故障
web->nfs 恢复1)在backup服务器安装nfs [root@backup ~]# yum install nfs-utils -y 2)配置nfs [root@backup ~]# cat /etc/exports /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666) 3)启动nfs [root@backup ~]# systemctl start rpcbind [root@backup ~]# systemctl start nfs-server 4)创建对应的用户 [root@backup ~]# groupadd -g666 www [root@backup ~]# useradd -u666 -g666 www 5)修改rsync服务的uid和gid [root@backup ~]# vim /etc/rsyncd.conf uid = www gid = www 6)重新授权 [root@backup ~]# chown -R www.www /data/ /backup/ 7)重启服务 [root@backup ~]# systemctl restart rsyncd 8)客户端重新挂载 [root@web01 ~]# umount -lf /data/ [root@web01 ~]# mount -t nfs 172.16.1.41:/data /data 9)如果nfs恢复那么就重新恢复 [root@web01 ~]# umount /data/ [root@web01 ~]# mount -t nfs 172.16.1.31:/data /data [root@web01 ~]# ls /data/ cloud-001.mp4