一、概述
1、Rsync+Sersync 是什么?
1)Sersync使用c++编写基于inotify开发的触发机制;
2)Sersync可以监控所监听的目录发生的变化(包括新建、修改、删除),具体到一个文件名或目录名,然后触发rsync同步,只同步发生改变的文件或目录。如果只是目录下的文件发生变化,则只会同步变化的文件而不会同步目录。只有目录本身发生变化的时候才会同步目录。
3)自带crontab功能,只需在 xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。
4)使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状 态。
5)有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则 每10个小时对同步失败的文件重新同步。
2、Rsync+Inotify-tools 与 Rsync+Sersync 区别
1)Inotify-tools只能记录被监控的目录发生的变化(包括新建、修改、删除),并不能监控是哪个文件或目录发生了改变;
rsync同步的时候会把整个监控的目录整个同步过去,但数据量很大的时候,同步的时间就会很久(rsync同步要遍历整个目录进行文件对比)
2)Sersync可以监控所监听的目录发生的变化(包括新建、修改、删除),具体到一个文件名或目录名,然后触发rsync同步,只同步发生改变的文件或目录。如果只是目录下的文件发生变化,则只会同步变化的文件而不会同步目录。只有目录本身发生变化的时候才会同步目录。
rsync同步的时候之同步发生改变的文件或目录(因为每次发生变化的数据很小,所以速度很快)效率很高。
3、小结
当同步的目录下的数据量很小时,可以使用Rsync+Inotify;当数据很大(几个G甚至更大的时候)、文件数很多时使用Rsync+Sersync。
二、服务部署
1、环境介绍
系统:centos7.2 默认支持了inotify 内核:3.10.0-514.el7.x86_64 版本: jdk-8u111-linux-x64.tar、sersync2.5.4_64bit_binary_stable_final.tar.gz、rsync-3.0.9-17.el7.x86_64
linux内核从2.6.13开始支持inotify。
2、安装
#yum -y install rsync
配置文件
#cat /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
address = 192.168.1.202
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/log/rsync.lock
max connections = 5
motd file = /etc/rsyncd.motd
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[config]
path = /data/mongodb/conf
comment = copy config for cluster every node
read only = no
dont compress = *.gz *.bz2 *.tgz *.xz *.zip *.rar *.z
auth users = root #用户必须为系统用户
secrets file = /etc/rsyncd.pas
list = no
ignore errors
exclude = logs/;slaves;master
hosts allow = 192.168.1.201
hosts deny = *
保存退出;
创建密码文件
#echo "root:666666" > /etc/rsyncd.pas
root是用户名,666666是密码,用户名与密码之间使用冒号分割,每个用户单独一行。
#chmod 600 /etc/rsyncd.pas
欢迎输出的提示信息:
# cat /etc/rsyncd.motd
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
It's config copy!
amazing man!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3、启动服务
#rsync --daemon
4、客户端
#yum -y install rsync
rsync同步源的资源表示方式:
用户名@主机地址::共享模块名
或
rsync://用户名@主机地址/共享模块名
需要创建密码文件:
#echo "666666" >/root/rsyncd.pas
#chmod 600 /root/rsyncd.pas
注意这个密码文件rsync服务的密码文件不一样,这个密码文件只有同步用户的密码!!
#rsync -avzH --delete --password-file=/root/rsyncd.pas root@10.0.0.200::config /myweb
或
#rsync -avzH --delete --password-file=/root/rsyncd.pas rsync://root@10.0.0.200/config /myweb
rsync常用参数:
基本格式: rsync [选项] 原始位置 目标位置
-r:递归模式,包含目录及子目录中的所有文件
-l:对于符号链接文件仍然复制为链接文件
-v:显示同步过程的详细信息
-a:递归模式,保留文件的权限、属性信息
-z:在传输文件时进行压缩
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户)
-o:保留文件的属主标记(仅超级用户)
-H:保留硬连接
-A:保留ACL属性信息
-D:保留设备文件及其他特殊文件
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据校验和来决定是否跳过文件
在需要同步的服务器上面执行相同的操作,将ip换成对应的即可。
三、部署sersync
1、 首先要确定服务器已经部署好了rsync,并且测试能成功同步文件,因为sersync依赖于rsync。
去官网下载包,下载需要FQ。
https://code.google.com/archive/p/sersync/downloads
解压后的目录为GNU-Linux-x86。
#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
#mv GNU-Linux-x86/ sersync
#cd sersync;ls
confxml.xml sersync2
confxml.xml是他的配置文件,sersync2是可执行的bin文件。
2、复制一份配置文件,做个备份再修改。
#cp confxml.xml confxml.xml.bak
#cat confxml.xml
<?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/mongodata">
<remote ip="192.168.1.202" name="config"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
<userDefinedPort start="true" port="873"/><!-- port=874 -->
<timeout start="true" time="300"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="true" 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>
红色字体为修改项,参数解释:
1)fileSystem xfs="true" :开启xfs文件系统支持
2)<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>
这段配置是监控的操作,根据需要定制即可。我这里选择全部行为。
3)<localpath watch="/data/mongodata"> 本地监控的目录
<remote ip="192.168.1.202" name="config"/> 需要同步数据的服务器ip、name是rsync里面配置的module。
4)<auth start="true" users="root" passwordfile="/root/rsyncd.pas"/> 同步的用户和密码文件,这个文件内容只有密码。部署rsync时就创建好了
<userDefinedPort start="true" port="873"/><!-- port=874 --> rsync服务监听的端口。
3、启动服务
首先要修改linux内核参数:
#sysctl -p
fs.inotify.max_queued_events = 66666666
fs.inotify.max_user_instances = 65535
fs.inotify.max_user_watches = 66666666
queued_events:如果设置的值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
user_watches:必须保证这个值要远大于所监控目录下的文件数。
#cd /data/sersync
#./sersync2 -d -r -o ./confxml.xml
另外一台服务器,只需要修改localpath watch、remote ip、name根据rsync的配置修改即可。必须要与需要同步数据的服务器rsync里面的path、address、modulename[config]一致。
重启服务:
#killall sersync2 && rm -rf /var/run/rsyncd.pid && /data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null
参数解释:
-d 实时同步
-r 一次全量同步
-o 指定配置文件
4、将服务做成开机启动
#echo "/data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>& 1 >>/dev/null" >>/root/.bashrc
#source /root/.bashrc
当然可以写一个启动脚本:
# cat /etc/init.d/sersync
#!/bin/bash
# chkconfig: 90 89 70
# description:it's create by cuishuai useed to start or stop sersync
sersync="/data/sersync/sersync2"
conf="/data/sersync/confxml.xml"
case $1 in
start)
/data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null
num=`ps -ef | grep sersync2 | grep -v grep | wc -l`
if [ $num -ne 0 ];then
echo "sersync start success!"
fi
;;
stop)
killall sersync2 && rm -rf /var/run/rsyncd.pid
;;
restart)
killall sersync2 && rm -rf /var/run/rsyncd.pid && /data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null
;;
*)
echo "Usage $0 start|stop|restart"
esac
5、如果要监控多个目录,同步到多主机,需要创建多个sersync的配置文件,由于需要启动多个进程,注意修改监听端口!!,默认是8008:
# cat spark.xml
<?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/spark-2.2.0-bin-hadoop2.7/conf">
<remote ip="10.10.2.13" name="spark_conf"/>
<remote ip="10.10.6.8" name="spark_conf"/>
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
<userDefinedPort start="true" port="873"/><!-- port=874 -->
<timeout start="true" time="300"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="true" schedule="600"><!--600mins-->
# cat hadoop.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8009"></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/hadoop-2.7.3/etc/hadoop">
<remote ip="10.10.2.13" name="hadoop_conf"/>
<remote ip="10.10.5.8" name="hadoop_conf"/>
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
<userDefinedPort start="true" port="873"/><!-- port=874 -->
<timeout start="true" time="300"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="true" schedule="600"><!--600mins-->
启动多个进程:
#/data/sersync2 -d -o /data/sersync/spark.xml
#/data/sersync2 -d -o /data/sersync/hadoop.xml
至此,整个的rsync+sersync同步机制就完成了。
附上rsync+inotify搭建:
rsync远程同步:
可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前进行压缩因此非常适用于异地备份、镜像服务器等。官网:http://rsync.samba.org/
1、在远程同步任务中,负责发起rsync同步操作的客户机称为发起端。
2、负责相应来自客户机的rsync同步操作的服务器称为同步源
3、在同步过程中,同步源负责提供文档的原始位置,发起端应对该位置具有读取权限
下行同步案例:
配置rsync源服务器
ip:10.0.0.200
1、以源目录/var/www/html、备份账号backuper为例
[root@localhost ~]# yum -y install rsync
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# ls /var/www/html/
2、建立/etc/rsync.conf配置文件
uid = nobody
gid = nobody
use chroot = yes
address = 10.0.0.200
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
max connections = 5
motd file = /etc/rsyncd.motd
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[wwwroot]
path = /var/www/html
comment = document root of www.azui.com
read only = yes
dont compress = *.gz *.bz2 *.tgz *.xz *.zip *.rar *.z
auth users = backuper #用户必须为系统用户
secrets file = /etc/rsyncd.secrets
list = no
exclude = logs/;slaves;master
hosts allow = 10.0.0.250
hosts deny = *
ignore errors
3、为备份账户创建数据文件
[root@localhost ~]# useradd backuper
[root@localhost ~]# echo '123' | passwd --stdin backuper >/dev/null
[root@localhost ~]# vim /etc/rsyncd.secrets
baackuper:123
[root@localhost ~]# chmod 600 /etc/rsyncd.secrets #必须改否则客户端同步时会报错
[root@localhost ~]# vim /etc/rsyncd.motd
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
wellcom to www.azui.com
2016-09-12 15:32
2017-09-18
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4、启动与关闭rsync服务
[root@localhost ~]# rsync --daemon
5、rsync命令的使用
基本格式: rsync [选项] 原始位置 目标位置
-r:递归模式,包含目录及子目录中的所有文件
-l:对于符号链接文件仍然复制为链接文件
-v:显示同步过程的详细信息
-a:递归模式,保留文件的权限、属性信息
-z:在传输文件时进行压缩
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户)
-o:保留文件的属主标记(仅超级用户)
-H:保留硬连接
-A:保留ACL属性信息
-D:保留设备文件及其他特殊文件
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据校验和来决定是否跳过文件
!!!客户端使用rsync服务
ip:10.0.0.250
rsync同步源的资源表示方式:
用户名@主机地址::共享模块名
或
rsync://用户名@主机地址/共享模块名
执行以下操作访问rsync同步源,下载到本地/tmp目录下进行备份
rsync -avz backuper@10.0.0.200::/wwwroot /tmp
或
rsync -avz rsync://backuper@10.0.0.200/wwwroot /tmp
--delete的使用:
[root@localhost myweb]# rsync -avz --delete --password-file=/tmp/rsyncd.secrets backuper@10.0.0.200::wwwroot /myweb
由于在客户端需要设置crontab周期计划任务,所以也要建立密码文件
[root@localhost tmp]# vim /tmp/rsyncd.secrets
123 #服务器上设置的密码。只写密码前面什么都不能有
[root@localhost tmp]# chmod 600 /tmp/rsyncd.secrets
[root@localhost myweb]# crontab -e
0 22 * * * /usr/bin/rsync -avz --password-file=/tmp/rsyncd.secrets backuper@10.0.0.200::wwwroot /myweb.$(date +%F/%R)
[root@localhost myweb]# chkconfig crond on
配置rsync+inotify实时同步:上行同步
Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便的实现文件异动警告、增量备份
rsync工具与inotify机制组合相结合,实现实时同步-只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静默等待状态。这样就避免了按固定周期备份是存在的延迟性、周期过密等问题。
发起端:配置
10.0.0.250
1、调整inotify内核参数
[root@localhost ~]# vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@localhost ~]# sysctl -p
2、安装inotify-tools
[root@localhost ~]# tar xf inotify-tools-3.14.tar.gz
[root@localhost ~]# cd inotify-tools-3.14
[root@localhost ~]# ./configure && make && make install
[root@localhost ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html/ 监控
3、编写触发式同步脚本
[root@localhost ~]# vim /opt/inotify_rsync.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete,attrib /var/www/html"
RSYNC_CMD="rsync -azH --delete /var/www/html/ backuper@10.0.0.200:/var/www/html"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync |wc -l) -le 0 ] ;then
$RSYNC_CMD
fi
done
[root@localhost ~]# chmod +x /opt/inotify_rsync.sh
[root@localhost ~]# yum -y install openssh-clients
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id backuper@10.0.0.200
另外一端服务器:10.0.0.200
[root@localhost ~]# vim /etc/rsyncd.conf
把read only = yes 注释掉。
[root@localhost ~]# rm -rf /var/run/rsyncd.pid
[root@localhost ~]# rsync --daemon --config=/etc/rsyncd.conf
[root@localhost ~]# chown -R backuper:backuper /var/www/html/
4、验证
在发起端的/var/www/html下新建文件,然后去10.0.0.200服务器上的/var/www/html下查看。