文件触发式实时同步 Rsync+Sersync Rsync+Inotify-tools

一、概述

 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下查看。

posted @ 2017-11-21 18:13  诗码者  阅读(998)  评论(0编辑  收藏  举报