关于rsync+inotify-tools实时同步模式
介绍同步模式
-
左边是原来的,一般的rsync的cs架构(client & server)同步模式,数据源服务器上安装rsync server,由server统一控制可以传输的数据的内容,例如权限,目录,文件数等,发起传输的是rsync client,即看起来就是将数据从源服务器拉取到备份服务器。
-
右边的是加上inotify-tools的同步模式,在数据源服务器上安装rsync client,在备份源服务器上安装rsync server,也是由server统一控制传输的数据内容,但是这里是数据源服务器作为了client端,因为发起传输的是rsync client,所以这里看起来就是将数据从源服务器推送到备份服务器。
-
从逻辑上cs的架构 c 和 s 变成了相反位置,但是传输的模式依然是从 s 传输到 c 。
-
数据源服务器ip暂定为10.111.111.112 ,数据备份服务器ip暂定为10.111.111.111。
-
我需要做同步的目录是/app/www/uploads,源服务器和备份服务器都存在,并且路径相同,权限也一致(权限一致是非常重要的,因为同步数据涉及到权限,而因为我不是使用root进行同步,所以要确保传输双方的权限是可写或者可读才行)
-
操作系统是centos 6.5 x64
开始配置
在数据源服务器上安装rsync client 和inotify-tools
yum -y install rsync inotify-tools
rsync client和server是同一个软件,而inotify是linux 内核2.6以上才有的特性。
创建rsync client 和inotify 合体脚本
mkdir /app/rsync
vi /app/rsync/rsync_do.sh
1.inotifywait 是inotify的命令工具
2.rsync的src目录需要注意,源目录也跟rsync一样,对于文件夹是区分有/和没有/的
3.需要注意rsync的同步的模块名字要匹配
4.inotifywait命令可以监听操作,输出信息,并且是一直输出,所以跟read 搭配起来,将inotifywait的输出通过read捕获到变量
强制记录了同步日志输出到/var/log/rsync.log5.--delete参数需要注意,这个会删除源目录没有的东西,所以在没有确定和测试好脚本之前可以先暂时不加这个参数
6.脚本中的rsync解析出来就是/usr/bin/rsync -vzrtopg --delete --progress /app/www/uploads/ www@$10.111.111.111::uploads --password-file=/app/rsync/rsync.passwd, 同步的目录是/app/www/uploads/,使用www这个用户进行同步,目标服务器是10.111.111.111,rsync的模块是uploads,这样就可以将源服务器的/app/www/uploads/下的所有数据(uploads目录本身)同步到备份服务器的/app/www/uploads/上,有delete参数,保持源和备份一致。
需要创建/app/rsync/rsync.passwd
这里只需要写密码就好了,因为账号已经在命令行指明了。
nohup运行作为监听服务
使用nohup + & 运行是为了将程序放置在后台运行,主要是为了忽略系统发出的hangup信号而导致关闭
在数据备份服务器上安装rsync服务端
默认安装后,在/etc目录下,并不存在rsyncd目录,需要手动创建配置文件目录
mkdir /etc/rsyncd
但是因为我想将所有配置文件放在特定的目录,所以我创建了自己的目录和rsync server的配置文件rsync.conf
mkdir /app/rsync
vi /app/rsync/rsync.conf
创建secrets file验证文件,并且设置权限为600
这个验证文件需要账号和密码,用冒号分隔开,用来给客户端client验证使用的。
运行demon模式
daemon 模式可以保持进程一直运行而不被系统强制关闭,可能会有系统信号hangup影响。
科普时间:
1.rsync
与传统的 cp、tar 备份方式相比,rsync 具有安全性高、备份迅速、支持增量备份等优点,通过 rsync 可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等,随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync 在高端业务系统中也逐渐暴露出了很多不足,首先,rsync 同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync 不能实时的去监测、同步数据,虽然它可以通过 linux 守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify 组合出现了!
2.inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux 内核从 2.6.13 起,加入了 Inotify支持,通过 Inotify 可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 就是这样的一个第三方软件。 在上面章节中,我们讲到,rsync 可以实现触发式的文件同步,但是通过 crontab 守护进程方式进行触发,同步的数据和实际数据会有差异,而 inotify 可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync 同步,这样刚好解决了同步数据的实时性问题。
3.rsync.conf的配置解释
4.rsync命令
参数
5.inotifywait