感谢支持
我们一直在努力

Linux实时同步—-Rsync+Inotify-Tools

在Linux备份工具—-镜像备份Rsync这篇文章中(http://www.linuxidc.com/Linux/2014-06/103807.htm),我带大家了解 rsync 的诸多特性以及它所支持的四种模式。作为一个镜像备份工具,可以说 rsync 做的很出色。

可是,随着应用系统规模的不断扩大,我们对数据的安全性和可靠性方面的需求也越来越高!Rsync 在高端业务系统中的不足也逐渐暴露了出来。

首先,rsync 在同步数据时,需要扫描所有文件后才进行比对,然后再进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的一个操作,并且往往发生变化的是其中很小的一部分,那么这将是非常低效的方式。

其次,rsync 不能实时的去监测和同步数据。虽然我们使用crontab的方式,加上 rsync 自身以守护进程启动的方式实现触发同步,但是两次触发动作一定会有时间差。受限于crontab最短也是1分钟,因此这就导致了服务端和客户端数据可能出现不一致,更无法在应用故障时做到数据的完全恢复。

为了满足这方面的需求,我们就结合了 linux文件系统事件监控机制这样一个系统特性(即inotify),通过使用工具 inotify-tools,整合出了 rsync+inotify 这样的一个技术架构,来实现数据实时同步的功能!

推荐阅读:

利用inotifywait监控主机文件和目录 http://www.linuxidc.com/Linux/2013-03/81075.htm

利用inotify+rsync实现Linux文件批量更新 http://www.linuxidc.com/Linux/2012-01/52132.htm

inotify-tools+rsync实时同步文件安装和配置 http://www.linuxidc.com/Linux/2012-06/63624.htm

inotify 实时的Linux文件系统事件监控 http://www.linuxidc.com/Linux/2014-03/98304.htm

下面就跟着我一起来部署一下 rsync+inotify-tools 架构吧!

简易架构图

RHCE系列之实时同步----Rsync+Inotify-Tools

实验环境介绍:

内核版本:2.6.32-431.el6.x86_64
系统采用最小化安装,系统经过了基本优化,selinux为关闭状态,iptables为无限制模式
源码包存放位置:/root
Rsync客户端+inotify服务,承担角色MASTER,IP:172.16.100.3,主机名:rsync-client-inotify
Rsync服务端(S1)        ,承担角色S1,  IP:172.16.100.1,主机名:rsync-server-1
Rsync服务端(S2)        ,承担角色S2,  IP:172.16.100.2,主机名:rsync-server-2

下面,就开始我们的实验!

一、在两台 SLAVE 机器上部署 rsync 服务端程序

特别提醒:本文的Slave机器即为S1(172.16.100.1),S2(172.16.100.2)。此处仅以S1的rsync服务端部署为例,S2的部署和S1一样,此处不再敖述。

1、安装rsync

[root@rsync-server-1 ~]# yum install rsync -y

2、修改rsync配置文件

cat > /etc/rsyncd.conf << EOF
#Rsync server
#created by sunsky 00:17 2013-06-28
##rsyncd.conf start##
uid = root      # rsync对后面模块中的path路径拥有什么权限
gid = root      # rsync对后面模块中的path路径拥有什么权限
use chroot = no      # 安全操作
max connections = 2000      # 定义连接数2000
timeout = 600      # 600秒超时
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors      # 忽略错误
read only = false    # false才能上传文件,true不能上传文件
list = false    # 文件列表
hosts allow = 172.16.100.0/24
hosts deny = *
auth users = rsync_backup    # 虚拟用户,同步时需要用这个用户
secrets file = /etc/rsync.password      # 密码文件
#####################################
[web]      # 模块名称
comment = RedHat.sx site files by sunsky 00:17 2013-06-28    # 注释
path = /data/web/redhat.sx                # 模块的路径
####################################
[data]
comment = redhat.sx site sit data files  by sunsky 00:17 2013-06-28
path = /data/web_data/redhat.sx
#####################################

特别提示:此处,使用一个多目录同步的案例。大家可以看需求,如果需求只有一个,那仅仅做一个目录即可。

      上面的rsync服务的配置文件,表明允许M1主服务器(ip为172.16.100.1)访问,rsync同步模块名为[web]和[data],将同步过来的文件分别放入对应path指定的目录/data/web/redhat.sx,/data/web_data/redhat.sx下。

      如果有多台目标服务器,则每一台都需要进行类似的rsync服务端配置,上面的uid和gid需要换成你服务器的相应的同步用户。注意,rsync服务账户(本文用root)要有对被同步目录(/data/web/redhat.sx和/data/web_data/redhat.sx)的写入和更新权限。

3、创建相关待同步目录

[root@rsync-server-1 ~]# mkdir /data/{web,web_data}/redhat.sx -p

[root@rsync-server-1 ~]# tree /data

/data

├── web_data

│  └── redhat.sx

└── web

    └── redhat.sx

提示:此步在S1,S2上都要执行,否则,rsync服务会因为没有PATH路径而无法启动。

4、相关认证和权限项配置

[root@rsync-server-1 /]# echo ‘rsync_backup:redhat’ > /etc/rsync.password

[root@rsync-server-1 /]# chmod 600 /etc/rsync.password

[root@rsync-server-1 /]# cat /etc/rsync.password

rsync_backup:redhat

[root@rsync-server-1 /]# ll /etc/rsync.password

-rw——-. 1 root root 20 Jun  4 04:27 /etc/rsync.password

5、以守护进程方式启动rsync服务

[root@rsync-server-1 /]# rsync –-daemon

6、查看rsync服务状态

[root@rsync-server-1 /]# lsof -i tcp:873

COMMAND  PID USER  FD  TYPE DEVICE SIZE/OFF NODE NAME

rsync  10309 root    4u  IPv4  94045      0t0  TCP *:rsync (LISTEN)

rsync  10309 root    5u  IPv6  94046      0t0  TCP *:rsync (LISTEN)

7、为rsync添加开机自启动

[root@rsync-server-1 /]# echo “# rsyncd service daemon by sun 20140628” >>/etc/rc.local

[root@rsync-server-1 /]# echo “/usr/bin/rsync –daemon”  >> /etc/rc.local

[root@rsync-server-1 /]# grep daemon /etc/rc.local

# rsyncd service daemon by sun 20140628

/usr/bin/rsync –daemon

这里顺带附上重启的命令,rsync重启有点麻烦,需要以先杀掉后台守护进程,然后再启动的方式来重启服务。

[root@rsync-server-1 /]# pkill rsync

[root@rsync-server-1 /]# rsync –daemon

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-06/103806p2.htm

二、在M1 上配置rsync客户端

1、配置rsync权限

在Master上配置rsync客户端相关权限认证:

[root@rsync-client-inotify /]# echo “111111”>/etc/rsync.password

[root@rsync-client-inotify /]# chmod 600 /etc/rsync.password

[root@rsync-client-inotify /]# cat /etc/rsync.password

RedHat

[root@rsync-client-inotify /]# ll /etc/rsync.password

-rw——-. 1 root root 20 Jun  4 04:27 /etc/rsync.password

2、M1上手动测试rsync的同步情况

特别强调:此步很关键,如果这不能同步,后面的inotify配好了也不会同步数据。

1)分别创建待同步数据

[root@rsync-client-inotify ~]# mkdir /data/{web,web_data}/redhat.sx -p

[root@rsync-client-inotify ~]# touch /data/{web/redhat.sx/index.html,web_data/redhat.sx/a.jpg}

[root@rsync-client-inotify ~]# tree /data

/data

├── web_data

│  └── redhat.sx

│      └── a.jpg

└── web

    └── redhat.sx

        └── index.html

 4 directories, 2 files

2)执行同步命令

针对S1(172.16.100.1):

[root@rsync-client-inotify ~]# rsync -avzP /data/web/redhat.sx rsync_backup@172.16.100.1::www/ –password-file=/etc/rsync.password

[root@rsync-client-inotify ~]# rsync -avzP /data/web_data/redhat.sx  rsync_backup@172.16.100.1::data/ –password-file=/etc/rsync.password

针对S2(172.16.100.2):

[root@rsync-client-inotify ~]# rsync -avzP /data/web/redhat.sx rsync_backup@172.16.100.2::www/ –password-file=/etc/rsync.password

[root@rsync-client-inotify ~]# rsync -avzP /data/web_data/redhat.sx  rsync_backup@172.16.100.2::web_data/ –password-file=/etc/rsync.password

提示:在后面进行部署inotify之前,inotify主服务器(即rsync-client-inotify)上必须要确保手动可以把文件推送到S1,S2上,这样后续inotify-tools才能调用这些命令来自动推送。

同步完之后,分别对S1,S2的相应目录进行查看!此处以 S1 为例:

[root@rsync-server-1 ~]# tree /data

/data

├── web_data

│  └── redhat.sx

│      └── a.jpg

└── web

    └── redhat.sx

        └── index.html

 

4 directories, 2 files

三、在M1 上配置inotify

1、查看 M1的 内核是否支持inotify

[root@rsync-client-inotify ~]# uname -r

2.6.32-431.el6.x86_64

[root@rsync-client ~]# ll /proc/sys/fs/inotify/*

-rw-r–r– 1 root root 0 Jun  4 15:30 /proc/sys/fs/inotify/max_queued_events

-rw-r–r– 1 root root 0 Jun  4 15:30 /proc/sys/fs/inotify/max_user_instances

-rw-r–r– 1 root root 0 Jun  4 15:30 /proc/sys/fs/inotify/max_user_watches

2、安装inotify

[root@rsync-client-inotify ~]# yum install make  gcc gcc-c++

[root@rsync-client-inotify ~]# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz

[root@rsync-client ~]# tar xzf inotify-tools-3.13.tar.gz

[root@rsync-client ~]# cd inotify-tools-3.13

[root@rsync-client inotify-tools-3.13]# ./configure

[root@rsync-client inotify-tools-3.13]# make && make install

3、查看inotify提供的工具

[root@rsync-client-inotify ~]# ll /usr/local/bin/inotify*

-rwxr-xr-x. 1 root root 38582 Jun  3 22:23 /usr/local/bin/inotifywait

-rwxr-xr-x. 1 root root 40353 Jun  3 22:23 /usr/local/bin/inotifywatch

在inotify-tools的博文中,我已经详尽的介绍过了inotify-tools的两个命令的用法,这里就不多做介绍!

四、rsync和inotify-tools做结合

      我们知道rsync可以实现推送和拉取,而inotify-tools借助内核的inotify机制实现了文件的实时监控。因此,借助这个思路,我们可以通过使用shell脚本,调整inotifywait的输出格式,然后借助inotifywait的监控文件或目录实时变化去通知rsync做相应的推送或者拉取操作!

1、实时备份脚本

下面,我就贴出来,我所使用的脚本!

[root@rsync-client-inotify ~]# cat auto_rsync.sh

#!/bin/bash

src1=’/data/web/redhat.sx/’

src2=’/data/web_data/redhat.sx/’

des1=web

des2=data

host1=172.16.100.1

host2=172.16.100.1

user=rsync_backup

allrsync=’/usr/bin/rsync -rpgovz –delete –progress’

/usr/local/bin/inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w %w%f %e’ -e modify,delete,create,attr

ib $src | while read DATE TIME DIR FILE EVENT;

do

case $DIR in

${src1}*)

$allrsync $src1 $user@$host1::$des1 –password-file=/etc/rsync.password && echo “$DATE $TIME $FILE was rsynced” &>> /var/log

/rsync-$des1-$host1.log

$allrsync $src1 $user@$host2::$des1 –password-file=/etc/rsync.password && echo “$DATE $TIME $FILE was rsynced” &>> /var/log

/rsync-$des1-$host2.log

;;

${src2}*)

$allrsync  $src2 $user@$host1::$des2 –password-file=/etc/rsync.password && echo “$DATE $TIME $FILE was rsynced” &>> /var/lo

g/rsync-$des2-$host1.log

$allrsync  $src2 $user@$host2::$des2 –password-file=/etc/rsync.password && echo “$DATE $TIME $FILE was rsynced” &>> /var/lo

g/rsync-$des2-$host2.log

;;

esac

done

2、加入开机自启动

        另外,为了保证开机之后自动开始实时同步备份,因此我们需要将该脚本加入开机自启动,并且设置在启动的时候,将脚本执行输出重定向到指定日志文件以及放到后台运行!

[root@rsync-client-inotify ~]# chmod o+x auto_rsync.sh

[root@rsync-client-inotify ~]# mv auto_rsync.sh /usr/sbin/

[root@rsync-client-inotify ~]# vim /etc/rc.local

Bash /usr/sbin/auto_rsync.sh &>> /var/log/auto_rsync.log &

以上,就是rsync+inotify-tools的整体架构操作了,下面我将我个人做的一些同步测试,贴在这里方便大家对照学习!

SLAVE:

[root@rsync-server-1 ~]# tree /data/

/data/

├── web

│  └── redhat.sx

└── web_data

    └── redhat.sx

 4 directories, 0 files

[root@rsync-server-2 ~]# tree /data/

/data/

├── web

│  └── redhat.sx

└── web_data

    └── redhat.sx

 

4 directories, 0 files

MASTER机:

[root@rsync-client-inotify ~]# tree /data/

/data/

├── web

│  └── redhat.sx

└── web_data

    └── redhat.sx

 

4 directories, 0 files

 

 

      以上为初始状态,现在我运行 auto_rsync.sh 脚本,然后在 M1上执行如下命令,最后分别在S1和S2上查看同步状态,已经同步的时间!

      我在这里模拟分别向/data/web/redhat.sx和/data/web_data/redhat.sx各写入10个10M的小文件,然后使用ls命令对比M1和S1与S2的同步时间!

[root@rsync-client-inotify ~]# bash /usr/sbin/auto_rsync.sh &>> /var/log/auto_rsync.log &

[1] 40802

[root@rsync-client-inotify ~]# for i in {1..10};do dd if=/dev/zero of=/data/web/redhat.sx/$i.html bs=10M count=1 ;dd if=/dev/zero of=/data/web_data/redhat.sx/$i.html bs=10M count=1;done

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0370034 s, 283 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0253611 s, 413 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0277293 s, 378 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0234147 s, 448 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0211738 s, 495 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0381865 s, 275 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0431456 s, 243 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0442159 s, 237 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0413299 s, 254 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0633694 s, 165 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0812681 s, 129 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0911646 s, 115 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0677276 s, 155 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0539137 s, 194 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.055881 s, 188 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0601847 s, 174 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0575894 s, 182 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0670688 s, 156 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.119225 s, 87.9 MB/s

1+0 records in

1+0 records out

10485760 bytes (10 MB) copied, 0.0874657 s, 120 MB/s

[root@rsync-client-inotify ~]# ll –full-time /data/{web_data,web}/redhat.sx/*

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:03.244999994 +0800 /data/web_data/redhat.sx/10.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.179999994 +0800 /data/web_data/redhat.sx/1.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.237999994 +0800 /data/web_data/redhat.sx/2.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.285999993 +0800 /data/web_data/redhat.sx/3.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.378999994 +0800 /data/web_data/redhat.sx/4.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.475999995 +0800 /data/web_data/redhat.sx/5.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.627999994 +0800 /data/web_data/redhat.sx/6.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.799999994 +0800 /data/web_data/redhat.sx/7.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.924999994 +0800 /data/web_data/redhat.sx/8.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:03.057999994 +0800 /data/web_data/redhat.sx/9.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:03.121999994 +0800 /data/web/redhat.sx/10.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.149999996 +0800 /data/web/redhat.sx/1.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.207999995 +0800 /data/web/redhat.sx/2.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.260999994 +0800 /data/web/redhat.sx/3.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.330999994 +0800 /data/web/redhat.sx/4.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.424999994 +0800 /data/web/redhat.sx/5.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.542999995 +0800 /data/web/redhat.sx/6.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.730999994 +0800 /data/web/redhat.sx/7.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.862999994 +0800 /data/web/redhat.sx/8.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:02.991999994 +0800 /data/web/redhat.sx/9.html

下面,我们去S1和S2上查看同步后的文件以及时间!

[root@rsync-server-1 ~]# ll –full-time /data/{web_data,web}/redhat.sx/*

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.082999997 +0800 /data/web_data/redhat.sx/10.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.008999997 +0800 /data/web_data/redhat.sx/1.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.237999998 +0800 /data/web_data/redhat.sx/2.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.427999998 +0800 /data/web_data/redhat.sx/3.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.546999997 +0800 /data/web_data/redhat.sx/4.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.652999997 +0800 /data/web_data/redhat.sx/5.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.792999997 +0800 /data/web_data/redhat.sx/6.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.902999998 +0800 /data/web_data/redhat.sx/7.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:04.997999997 +0800 /data/web_data/redhat.sx/8.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:05.124999997 +0800 /data/web_data/redhat.sx/9.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:40.318999989 +0800 /data/web/redhat.sx/10.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:40.152999989 +0800 /data/web/redhat.sx/1.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:40.436999989 +0800 /data/web/redhat.sx/2.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:40.601999989 +0800 /data/web/redhat.sx/3.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:40.736999989 +0800 /data/web/redhat.sx/4.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:39.132999990 +0800 /data/web/redhat.sx/5.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:39.277999989 +0800 /data/web/redhat.sx/6.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:39.432999990 +0800 /data/web/redhat.sx/7.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:39.578999991 +0800 /data/web/redhat.sx/8.html

-rw-r–r–. 1 root root 10485760 2014-06-28 02:54:39.721999990 +0800 /data/web/redhat.sx/9.html

大家可以对比MASTER和S1的文件的时间,不难发现,rsync+inotify架构的整体同步速率还是蛮高的!

OK!

        本篇博文就写到这里!

        希望能对大家有所帮助!

本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-06/103806.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-06/1038.htm

赞(0) 打赏
转载请注明出处:服务器评测 » Linux实时同步—-Rsync+Inotify-Tools
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏