转自:http://chocolee.blog.51cto.com/8158455/1400596

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

1.1 inotify介绍

2.1 rsync+inotify同步逻辑图

3.1 环境部署

4.1 inotify-slave部署

4.1.1检查是否安装rsync

4.1.2 新建rsync用户及模块目录并更改其用户组

4.1.3 编写rsync daemon配置文件/etc/rsyncd.conf

4.1.4 配置虚拟用户的密码文件

4.1.5 启动rsync 服务

4.1.6 通过inotify-master测试推送

5.1 inotify-master部署

5.1.1 查看当前系统是否支持inotify

5.1.2 下载inotify源码包并编译安装

5.1.3 inotify之inotifywait命令常用参数详解

5.1.4 编写监控脚本并加载到后台执行

5.1.5 实时同步测试

1.1 inotify介绍

inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。

2.1 rsync+inotify同步逻辑图

3.1 环境部署

主机名

主机IP地址

系统版本

系统内核版本

inotify-master

192.168.1.128

CentOS release 6.4 (Final)

2.6.32-358.el6.x86_64

inotify-slave

192.168.1.160

CentOS release 6.4 (Final)

2.6.32-358.el6.x86_64

4.1 inotify-slave部署

这里就是部署rsync服务,rsync daemon工作模式。

4.1.1检查是否安装rsync

[root@inotify-slave ~]# rpm -aq rsync
rsync-3.0.-.el6.x86_64

4.1.2 新建rsync用户及模块目录并更改其用户组

[root@inotify-slave mail]# useradd rsync -s /sbin/nologin -M #添加rsync用户
[root@inotify-slave mail]# grep rsync /etc/passwd
rsync:x::::/home/rsync:/sbin/nologin
[root@inotify-slave mail]# mkdir /backup #创建rsync daemon工作模式的模块目录
[root@inotify-slave mail]# ll -d /backup/
drwxr-xr-x. root root 4月 : /backup/
[root@inotify-slave mail]# chown rsync.rsync /backup/ #更改模块目录的用户组
[root@inotify-slave mail]# ll -d /backup/
drwxr-xr-x. rsync rsync 4月 : /backup/

4.1.3 编写rsync daemon配置文件/etc/rsyncd.conf

[root@inotify-slave /]# cat /etc/rsyncd.conf
##rsyncd.conf start##
#工作中指定用户(需要指定用户)
uid = rsync
gid = rsync
#相当于黑洞.出错定位
use chroot = no
#有多少个客户端同时传文件
max connections =
#超时时间
timeout =
#进程号文件
pid file = /var/run/rsyncd.pid
#日志文件
lock file = /var/run/rsync.lock
#日志文件
log file = /var/log/rsyncd.log
#模块开始
#这个模块对应的是推送目录
#模块名称随便起
[backup]
#需要同步的目录
path = /backup/
#表示出现错误忽略错误
ignore errors
#表示网络权限可写(本地控制真正可写)
read only = false
#这里设置IP或让不让同步
list = false
#指定允许的网段
hosts allow = 192.168.1.0/
#拒绝链接的地址,一下表示没有拒绝的链接。
hosts deny = 0.0.0.0/
#不要动的东西(默认情况)
#虚拟用户
auth users = rsync_backup
#虚拟用户的密码文件
secrets file = /etc/rsync.password
#配置文件的结尾
#rsync_config_______________end

4.1.4 配置虚拟用户的密码文件

[root@inotify-slave /]# echo “rsync_backup:leesir” >/etc/rsync.password
[root@inotify-slave /]# cat /etc/rsync.password
rsync_backup:leesir #注:rsync_backup为虚拟用户,leesir为这个虚拟用户的密码
[root@inotify-slave /]# chmod /etc/rsync.password #为密码文件提权,增加安全性
[root@inotify-slave /]# ll /etc/rsync.password
-rw——-. root root 4月 : /etc/rsync.password

4.1.5 启动rsync 服务

[root@inotify-slave /]# rsync –daemon #启动rsync服务
[root@inotify-slave /]# ps -ef |grep rsync
root : ? :: rsync –daemon
root : pts/ :: grep rsync
[root@inotify-slave /]# netstat -lnutp |grep rsync
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rsync
tcp ::: :::* LISTEN /rsync

4.1.6 通过inotify-master测试推送

inotify-master配置密码文件,测试推送

[root@inotify-master ~]# echo “leesir” >/etc/rsync.password
[root@inotify-master ~]# cat /etc/rsync.password

leesir #注意:这里只要写密码即可,切记。

[root@inotify-master ~]# chmod  /etc/rsync.password
[root@inotify-master ~]# ll /etc/rsync.password
-rw——- root root 4月 : /etc/rsync.password
[root@inotify-master ~]# echo “hello leesir”>test.txt
[root@inotify-master ~]# cat test.txt
hello leesir
[root@inotify-master ~]# rsync -avz test.txt rsync_backup@192.168.1.160::backup –password-file=/etc/rsync.password
sending incremental file list
test.txt
sent bytes received bytes 72.67 bytes/sec
total size is speedup is 0.12

inotify-slave检查:

[root@inotify-slave /]# ll /backup/
总用量
-rw-r–r–. rsync rsync 4月 : test.txt
[root@inotify-slave /]# cat /backup/test.txt
hello leesir

5.1 inotify-master部署

注:

inotify是rsync客户端安装和执行的

企业场景压力测试200-300个同步限制,受网卡,磁盘,带宽等的制约。

5.1.1 查看当前系统是否支持inotify

[root@inotify-master ~]# ll /proc/sys/fs/inotify/
总用量
-rw-r–r– root root 4月 : max_queued_events
-rw-r–r– root root 4月 : max_user_instances
-rw-r–r– root root 4月 : max_user_watches

#显示这三个文件则证明支持。

拓展:

/proc/sys/fs/inotify/max_queued_evnets

表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。

/proc/sys/fs/inotify/max_user_instances

表示每一个real user ID可创建的inotify instatnces的数量上限。

/proc/sys/fs/inotify/max_user_watches

表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

例如:

echo  > /proc/sys/fs/inotify/max_user_watches

5.1.2 下载inotify源码包并编译安装

[root@inotify-master tools]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz #下载inotify源码包
…………………………….
[root@inotify-master tools]# ll inotify-tools-3.14.tar.gz
-rw-r–r– root root 3月 inotify-tools-3.14.tar.gz
[root@inotify-master tools]# tar zxf inotify-tools-3.14.tar.gz
[root@inotify-master tools]# cd inotify-tools-3.14
[root@inotify-master inotify-tools-3.14]# ./configure –prefix=/usr/local/inotify-3.14 #配置inotify,并指定安装路径为/usr/local/inotify-3.14
…………………………..
[root@inotify-master inotify-tools-3.14]# make && make install
…………………………..

5.1.3 inotify之inotifywait命令常用参数详解

[root@inotify-master inotify-tools-3.14]# cd /usr/local/inotify-3.14/
[root@inotify-master inotify-3.14]# ./bin/inotifywait –help
-r|–recursive Watch directories recursively. #递归查询目录
-q|–quiet Print less (only print events). #打印监控事件的信息
-m|–monitor Keep listening for events forever. Without this option, inotifywait will exit after one event is received. #始终保持事件监听状态
–excludei Like –exclude but case insensitive. #排除文件或目录时,不区分大小写。
–timefmt strftime-compatible format string for use with %T in –format string. #指定时间输出的格式
–format Print using a specified printf-like format string; read the man page for more details.
#打印使用指定的输出类似格式字符串
-e|–event [ -e|–event … ] Listen for specific event(s). If omitted, all events are listened for. #通过此参数可以指定需要监控的事件,如下所示:
Events:
access file or directory contents were read #文件或目录被读取。
modify file or directory contents were written #文件或目录内容被修改。
attrib file or directory attributes changed #文件或目录属性被改变。
close file or directory closed, regardless of read/write mode #文件或目录封闭,无论读/写模式。
open file or directory opened #文件或目录被打开。
moved_to file or directory moved to watched directory #文件或目录被移动至另外一个目录。
move file or directory moved to or from watched directory #文件或目录被移动另一个目录或从另一个目录移动至当前目录。
create file or directory created within watched directory #文件或目录被创建在当前目录
delete file or directory deleted within watched directory #文件或目录被删除
unmount file system containing file or directory unmounted #文件系统被卸载

5.1.4 编写监控脚本并加载到后台执行

[root@inotify-master scripts]# cat inotify.sh
#!/bin/bash
#para
host01=192.168.1.160 #inotify-slave的ip地址
src=/backup/ #本地监控的目录
dst=backup #inotify-slave的rsync服务的模块名
user=rsync_backup #inotify-slave的rsync服务的虚拟用户
rsync_passfile=/etc/rsync.password #本地调用rsync服务的密码文件
inotify_home=/usr/local/inotify-3.14 #inotify的安装目录
#judge
if [ ! -e “$src” ] \
|| [ ! -e “${rsync_passfile}” ] \
|| [ ! -e “${inotify_home}/bin/inotifywait” ] \
|| [ ! -e “/usr/bin/rsync” ];
then
echo “Check File and Folder”
exit
fi
${inotify_home}/bin/inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f’ -e close_write,delete,create,attrib $src \
| while read file
do
# rsync -avzP –delete –timeout= –password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null >&
cd $src && rsync -aruz -R –delete ./ –timeout= $user@$host01::$dst –password-file=${rsync_passfile} >/dev/null >&
done
exit
[root@inotify-master scripts]# sh inotify.sh & #将脚本加入后台执行
[]
[root@inotify-master scripts]#

5.1.5 实时同步测试

inotify-master操作:

[root@inotify-master scripts]# cd /backup/
[root@inotify-master backup]# ll
总用量
[root@inotify-master backup]# for a in `seq `;do touch $a;done #创建200个文件
[root@inotify-master backup]# ll –time-style=full-iso
总用量
-rw-r–r– root root -- ::08.141497569 +
-rw-r–r– root root -- ::08.172497529 +
-rw-r–r– root root -- ::08.235497529 +
-rw-r–r– root root -- ::08.236497529 +
-rw-r–r– root root -- ::08.237497529 +
……………………………..
inotify-slave检查 [root@inotify-slave backup]# ll –time-style=full-iso
总用量
-rw-r–r–. rsync rsync -- ::08.393823754 +
-rw-r–r–. rsync rsync -- ::08.393823754 +
-rw-r–r–. rsync rsync -- ::08.393823754 +
-rw-r–r–. rsync rsync -- ::08.393823754 +
-rw-r–r–. rsync rsync -- ::08.393823754 +
……………………..

sync使用的是873端口 最后别忘了把这个端口添加到iptables

iptables -I INPUT -p tcp –dport  -j ACCEPT
iptables -I INPUT -p udp –dport -j ACCEPT

rsync+inotify实现实时同步案例的更多相关文章

  1. rsync+inotify实现实时同步案例--转

    转自:http://chocolee.blog.51cto.com/8158455/1400596 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐 ...

  2. rsync+inotify实现实时同步案例【转】

    1.1 inotify介绍 inotify是一种强大的.细粒度的.异步的文件系统事件控制机制.linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加.删除. ...

  3. linux rsync +inotify 实现 实时同步

    前言:     rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rs ...

  4. rsync + inotify 数据实时同步

    一.rsync介绍 rsync英文全称为Remote synchronization,从软件的名称就可以看出来,Rsync具有可是本地和远程两台主机之间的数据快速复制同步镜像.远程备份的功能,这个功能 ...

  5. Rsync+inotify实现实时同步

    1.1 inotify介绍 inotify是一种强大的.细粒度的.异步的文件系统事件控制机制.linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加.删除. ...

  6. rsync简介与rsync+inotify配置实时同步数据

    rsync简介 rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. rsync特性 rsync ...

  7. CentOS 7 rsync+inotify实现实时同步

    测试环境如下: inotify-slave IP : 172.16.0.222 inotify-master IP : 172.16.0.233 对两台机的要求: 安装依赖包gcc: yum inst ...

  8. centos 配置rsync+inotify数据实时同步2

    一.Rsync服务简介 1. 什么是Rsync 它是一个远程数据同步工具,它在同步文件的同时,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的“rsync算法”来使本地和远程两个主机 ...

  9. centos 配置rsync+inotify数据实时同步

    何为rsync? 定义: rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,非常适用于异地备份 何为源端和发起端? 在远程同步过程中,负责发起rs ...

随机推荐

  1. linux下使用lftp的小结

    今天在解决一个远程服务器备份的问题时,用到了lftp的相关知识.整理如下: lftp的功能比较强大,相比原来用ftp,方便了很多. 1.登陆: lftp ftp://yourname@site pwd ...

  2. 【转】 Linux 的目录详解 (Linux基础一)

    前言 转自: http://c.biancheng.net/view/2833.html 进行了一些提炼和修改. 学习 Linux,不仅限于学习各种命令,了解整个 Linux 文件系统的目录结构以及各 ...

  3. hive sql基础了解

    会有些不一样 1 例如使用SQL 之前,要了解用了那个库,use jz_daojia 2 使用GET_JSON_OBJECT 函数等,以及参数 匹配 $.childBrithDay 挺有意思的.新玩意 ...

  4. python使用消息队列RabbitMq(进阶)

    import pika connection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel = ...

  5. nginx 日志统计接口每个小时访问量

    指定时间段增量统计nginx日志不同接口的访问量: #!/bin/bash#此脚本用于统计nginx日志当前时间15分钟之内不同接口(URL)的访问量统计LOG=/usr/local/nginx/lo ...

  6. Codeforces 1132D(二分答案+堆)

    题面 传送门 分析 二分答案,考虑如何判定 可以用贪心的方法,每次找最快没电的电脑,在没电前1单位时间给它充电 正确性显然 实现上可以维护一个堆,存储每个电脑电用完的时刻,每次从堆顶取出最小的一个给它 ...

  7. TP框架实现文件的下载(主要解决文件存在中文文件名的问题)

    namespace Home\Controller; use Think\Controller; use Org\Net\Http; class IndexController extends Con ...

  8. 在Ubuntu custom kernel上裝perf by compile

    Using perf, the Linux Performance Analysis tool on Ubuntu Karmic A lot has been going on with Linux ...

  9. Fix invisible cursor issue in Ubuntu 13.10

    Fix invisible cursor issue in Ubuntu 13.10 Fixing this problem is rather too easy. Open a terminal ( ...

  10. object in depth

    创建和修改属性 创建对象 const myObject = {}; //字面量表示法 const myObject = new Object(); //Object() 构造函数 修改属性 ---- ...