一.为什么要用Rsync+sersync架构
1.sersync是基于Inotify开发的,类似于Inotify-tools的工具
2.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在遍历查找比对文件时,速度很快),因此,效率很高。
小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。

说明:
操作系统:CentOS 6
源服务器:192.168.21.129
目标服务器:192.168.21.127,192.168.21.128
目的:把源服务器上/home/wwwoot/目录实时同步到目标服务器的/home/ wwwoot/下
具体操作:
第一部分:分别在两台目标服务器192.168.21.127,192.168.21.128上操作

三.分别在两台在目标服务器安装Rsync服务端
1.关闭SELINUX

[root@rsync ~]# vim /etc/selinux/config #编辑防火墙配置文件
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存,退出
[root@rsync ~]# setenforce #立即生效

2.开启防火墙tcp 873端口(Rsync默认端口)

[root@rsync ~]# vim /etc/sysconfig/iptables #编辑防火墙配置文件
-A RH-Firewall--INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT
:wq! #保存退出
[root@rsync ~]# /etc/init.d/iptables restart #最后重启防火墙使配置生效

3.安装Rsync服务端软件

[root@rsync ~]# yum install rsync #安装
[root@rsync ~]# rsync –deamon #启动rsync

4.创建rsyncd.conf配置文件

[root@rsync ~]# vi /etc/rsyncd.conf #创建配置文件,添加以下代码
log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pidfile = /var/run/rsyncd.pid #pid文件的存放位置
lock file = /var/run/rsync.lock #支持max connections参数的锁文件
secrets file = /etc/rsync.pass #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
[gaosubo] #自定义名称
path = /home/wwwroot/ #rsync服务端数据目录路径
comment = gaosubo #模块名称与[home_www.osyunwei.com]自定义名称相同
uid = rsync #设置rsync运行权限为rsync
gid = rsync #设置rsync运行权限为rsync
port= #默认端口
use chroot = no #默认为true,修改为no,增加对目录文件软连接的备份
read only = no #设置rsync服务端文件为读写权限
list = no #不显示rsync服务端资源列表
max connections = #最大连接数
timeout = #设置超时时间
auth users = gaosubo #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = 192.168.21.129 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 192.168.21.254 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

5.创建用户认证文件

[root@rsync ~]# vim /etc/rsync.pass #配置文件,添加以下内容
gaosubo: #格式,用户名:密码,可以设置多个,每行一个用户名:密码

6.设置文件权限

[root@rsync ~]# chmod  /etc/rsyncd.conf  #设置文件所有者读取、写入权限
[root@rsync ~]# chmod /etc/rsync.pass #设置文件所有者读取、写入权限

7.启动rsync

[root@rsync ~]# rsync --deamon #rsync deamon模式启动
[root@rsync ~]# killall rayns #停止,杀掉进程

第二部分:在源服务器192.168.21.129上操作

四.安装Rsync客户端
1.关闭SELINUX

[root@rsync ~]# vi /etc/selinux/config  #编辑防火墙配置文件
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加

:wq!  #保存退出
setenforce 0   #立即生效

2.开启防火墙tcp 873端口(Rsync默认端口,做为客户端的Rsync可以不用开启873端口)

[root@rsync ~]# vim /etc/sysconfig/iptables  #编辑防火墙配置文件
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT

:wq! #保存退出

[root@rsync ~]# /etc/init.d/iptables restart #最后重启防火墙使配置生效

3.安装Rsync客户端端软件

[root@rsync ~]# whereis rsync   #查看系统是否已安装rsync,出现下面的提示,说明已经安装
rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz
yum install rsync #如果默认没有rsync,运行此命令进行安装rsync

4.创建认证密码文件

[root@rsync ~]# vi /etc/passwd.txt  #编辑文件,添加以下内容
123456 #密码

:wq! #保存退出

[root@rsync ~]# chmod 600 /etc/passwd.txt  #设置文件权限,只设置文件所有者具有读取、写入权限即可

5.测试源服务器192.168.21.129到两台目标服务器192.168.21.127,192.168.21.128之间的数据同步

[root@rsync ~]# mkdir /home/wwwroot/gaosubo #在源服务器上创建测试文件夹,然后在源服务器运行下面2行命令
[root@rsync ~]# rsync -avH --port=873 --progress --delete /home/wwwroot/ gaosubo@192.168.21.127::gaosubo --password-file=/etc/passwd.txt [root@rsync ~]# rsync -avH --port=873 --progress --delete /home/wwwroot/ gaosubo@192.168.21.128::gaosubo --password-file=/etc/passwd.txt

运行完成后,分别在两台目标服务器192.168.21.127,192.168.21.128上查看,在/home/wwwroot/目录下有gaosubo文件夹,说明数据同步成功。

五.安装sersync工具,实时触发rsync进行同步
1.查看服务器内核是否支持inotify

[root@rsync ~]# ll /proc/sys/fs/inotify   #列出文件目录,出现下面的内容,说明服务器内核支持inotify
total 0
-rw-r--r-- 1 root root 0 Jan 20 21:43 max_queued_events
-rw-r--r-- 1 root root 0 Jan 20 21:43 max_user_instances
-rw-r--r-- 1 root root 0 Jan 20 21:43 max_user_watches

2.修改inotify默认参数(inotify默认内核参数值太小)

查看系统默认参数值:
[root@rsync ~]# sysctl -a | grep max_queued_events
fs.inotify.max_queued_events = 16384
[root@rsync ~]# sysctl -a | grep max_user_instances
fs.inotify.max_user_instances = 128
[root@rsync ~]# sysctl -a | grep max_user_watches
fs.inotify.max_user_watches = 8192
修改参数:
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
[root@rsync ~]# 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/wwwroot/ -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/wwwroot/为同步文件目录)
max_user_instances:
每个用户创建inotify实例最大值

3.安装sersync
sersync下载地址:https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
上传sersync2.5.4_64bit_binary_stable_final.tar.gz到/usr/local/src目录下

[root@rsync ~]# cd /usr/local/src
[root@rsync ~]# tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz #解压
[root@rsync ~]# mv GNU-Linux-x86 /usr/local/sersync #移动目录到/usr/local/sersync

4.配置sersync

[root@rsync ~]# cd  /usr/local/sersync #进入sersync安装目录
[root@rsync ~]# cp confxml.xml confxml.xml-bak #备份原文件
[root@rsync ~]# vim 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="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="/home/gaosubo">
<remote ip="192.168.21.127" name="gaosubo"/>
<remote ip="192.168.21.128" name="gaosubo"/>
<!--<remote ip="192.168.8.40" name="xx"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="gaosubo" passwordfile="/etc/passwd.txt"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- 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>

:wq!  #保存退出

参数说明:

localpath watch="/home/wwwroot/":#源服务器同步目录
192.168.21.127,192.168.21.128:#目标服务器IP地址
name="home_www.osyunwei.com": #目标服务器rsync同步目录模块名称
users="gaosubo": #目标服务器rsync同步用户名
passwordfile="/etc/passwd.txt": #目标服务器rsync同步用户的密码在源服务器的存放路径
remote ip="192.168.21.127": #目标服务器ip,每行一个
remote ip="192.168.21.128": #目标服务器ip,每行一个
failLog path="/tmp/rsync_fail_log.sh" #脚本运行失败日志记录
start="true" #设置为true,每隔600分钟执行一次全盘同步

5.设置sersync监控开机自动执行

vi /etc/rc.d/rc.local  #编辑,在最后添加一行
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml #设置开机自动运行脚本

:wq!  #保存退出

6.添加脚本监控sersync是否正常运行

[root@rsync ~]# vim /script/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!  #保存退出

[root@rsync ~]# chmod +x /script/check_sersync.sh #添加脚本执行权限
[root@rsync ~]# vim /etc/crontab #编辑,在最后添加下面一行
*/5 * * * * root /script/check_sersync.sh > /dev/null 2>&1 #每隔5分钟执行一次脚本
[root@rsync ~]# service crond reload #重新加载服务

7.测试sersync实时触发rsync同步脚本是否正常运行
在源服务器192.168.21.129上创建文件夹test

[root@rsync ~]# mkdir /home/wwwroot/test

重新启动源服务器:192.168.21.129
等系统启动之后,查看两台目标服务器192.168.21.127,192.168.21.128的/home/wwwroot/下是否有test文件夹
然后再在源服务器192.168.21.129创建文件夹test_new

mkdir /home/wwwroot/test_new

继续查看两台目标服务器192.168.21.127,192.168.21.128的/home/wwwroot下是否有test_new文件夹
如果以上测试都通过,说明sersync实时触发rsync同步脚本运行正常。

六.附:sersync详细参数
sersync开发者网站:http://blog.johntechinfo.com/sersyncguild

rsync参数

-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息

Rsync+sersync文件实时同步的更多相关文章

  1. rsync+inotify-tools文件实时同步

    rsync+inotify-tools文件实时同步案例 全量备份 Linux下Rsync+sersync实现数据实时同步完成. 增量备份 纯粹的使用rsync做单向同步时,rsync的守护进程是运行在 ...

  2. Rsync+Sersync数据实时同步(双向)

    Rsync+Sersync数据实时同步(双向) 服务介绍 一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.se ...

  3. centos6.6配置rsync+sersync实现实时同步分布式多客户端分发同步

    1.sersync项目: sersync项目利用inotify与rsync技术实现对服务器数据实时同步到解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,rsync是目 ...

  4. Rsync+sersync实现实时同步

    介绍: sersync主要用于服务器同步,web镜像等功能.基于boost1.43.0,inotify api,rsync command.开发.目前使用的比较多的同步解决方案是inotify-too ...

  5. rsync+sersync多线程实时同步

    一.sersync优点 1)使用c++编写,对linux系统文件产生的临时文件和重复文件操作会进行过滤,在结合rsync同步的时候,会减少运行时消耗的本地及网络资源,因此速度更快. 2)相比较inot ...

  6. rsync+sersync实现数据文件实时同步

    一.简介 sersync是基于Inotify开发的,类似于Inotify-tools的工具: sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或某一个目录的名字: ...

  7. sersync+rsync实现服务器文件实时同步

    sersync+rsync实现服务器文件实时同步 一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.sersyn ...

  8. (转)Linux下通过rsync与inotify(异步文件系统事件监控机制)实现文件实时同步

    Linux下通过rsync与inotify(异步文件系统事件监控机制)实现文件实时同步原文:http://www.summerspacestation.com/linux%E4%B8%8B%E9%80 ...

  9. Centos 6.5 rsync+inotify 两台服务器文件实时同步

    rsync和inotify是什么我这里就不在介绍了,有专门的文章介绍这两个工具. 1.两台服务器IP地址分别为: 源服务器:192.168.1.2 目标服务器:192.168.1.3 @todo:从源 ...

随机推荐

  1. Java 文件IO

    文件IO Java IO    IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中    按操作数据分为 字节流和字符流        字符流的 ...

  2. Android 上千张图片的列表滑动加载

    一般项目中图片加载用的比较多的是ImageLoader 但是需求自己配置一些参数 上手有些复杂 对于手机图库中有上千张图片需要加载时 一个使用性能很好的库Glide可以解决 效果图如下 滑动非常流畅 ...

  3. Linux chmod命令修改文件与文件夹权限的命令附实例

    Linux chmod命令修改文件与文件夹权限的命令附实例 作者:佚名 字体:[增加 减小] 来源:互联网 时间:05-01 20:46:07我要评论 在linux中要修改一个文件夹或文件的权限我们需 ...

  4. panels能否包含views_block ////// panels -- content pane 参数传递

    是可以的包含block,不管是手动在block后台创建的,还是通过views创建的block,都可以在Panel add content的时候添加. ------------ panels 和 con ...

  5. hook_schema 小总结

    1, primary key 可以带空格 做为下表 但field就不行 2, dev_node 仅为下标 'primary key' => array('nid'),    'foreign k ...

  6. xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误

    xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误 一:场景 xcode 同时引入了 libA.a, libB.a 两个静态类库,如果 这两个静态类库之中 ...

  7. DI 之 3.3 更多DI的知识(陆)

    3.3.1  延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 " ...

  8. RESEACH PAPER

      个,proquest的username和password赫然在目,别急,再看第4个结 果"HB Thompson Subscription Online Databases", ...

  9. .NET简谈反射(动态调用)

    我们继续C#基础知识的学习,这篇文章主要要讲的是我们C#程序员迈向高级C#程序员的关键性的一步. 有的朋友会说事实不是这样的,我不用反射就不能开发吗?当然可以,但是用与不用肯定是不一样的,任何复杂抽象 ...

  10. input上传图片预览

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...