配置 Rsync + inotify 实现文件服务器数据实时双向同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置 Rsync + inotify 实现文件服务器数据实时双向同步相关的知识,希望对你有一定的参考价值。
Rsync 概述
Rsync 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,在传输钱执行压缩,因此非常适用于异地备份、镜像服务器等应用。
Rsync 的官方网站是 http://rsync.samba.org/ ,由 Wayne Davison 进行维护。作为一种最常见的文件备份工具, Rsync 往往是 Linux 和 UNIX 系统默认安装的基本组件之一。
- Rsync 的优点
Rsync与传统的cp、tar备份方式相比,具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
- Rsync 的缺点
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
inotify 概述
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
Rsync可以实现触发式的文件同步,但是通过Crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而Inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发Rsync同步,这样刚好解决了同步数据的实时性问题。
部署环境
主机 | 操作系统 | IP地址 | 用于同步的目录 | 主要软件包 |
---|---|---|---|---|
Server1 | CentOS 7.4 x86_64 | 192.168.125.117 | /test | rsync-3.0.9-18.el7.x86_64、inotify-tools-v3.14-8.le7.x86_64 |
Server2 | CentOS 7.4 x86_64 | 192.168.125.118 | /test | rsync-3.0.9-18.el7.x86_64、inotify-tools-v3.14-8.le7.x86_64 |
开始部署
在此我们部署服务使主机 Server1 的数据推向主机 Server2 ,而双向同步即在此基础上在主机 Server2 上部署服务使数据推向主机 Server1 。至此,我们只要在两台服务器的任意一台更改数据都会同步到另外一台,从而实现双机同步。
数据从Server1上同步到Server2
- 两台机器配置rsync服务(配置文件要修改为对方主机)
-
安装Rsync软件包
tar zxvf rsync-3.1.3.tar.gz -C /opt cd /opt/rsync_3.1.3 ./configure make && make install
-
修改rsync配置文件
# vim /etc/rsyncd.conf ……省略部分信息…… uid = nobody gid = nobody use chroot = yes //禁锢在源目录 address = 192.168.125.117 //监听地址 port 873 //监听端口 log file = /var/log/rsyncd.log //日志文件路径 pid file = /var/run/rsyncd.pid //进程ID文件路径 hosts allow = 192.168.125.0/24 //允许访问的客户机地址 [wwwroot] //共享模块名称 path = /web1/wwwroot //源目录的实际地址 comment = www.wzn.cn read only = no //是否为只读 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 //同步时 不再压缩的文件类型 auth users = web1user //授权账户 secrets file = /etc/rsyncd_users.db //存放账户信息的数据文件
- 为备份账户创建数据文件、源目录
# vim /etc/rsyncd_users.db backuper:abc123 # chmod 600 /etc/rsyncd_users.db # mkdir -p /web1/wwwroot # chmod 777 /web1/wwwroot # chown -R nobody:nobody /web1/wwwroot
- 为备份账户创建数据文件、源目录
-
启动rsync,并加入系统自启动文件
# rsync --daemon #运行参数为--daemon # ps -ef | grep rsync # echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local
-
Rsync命令的基本用法
- -a 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
- -z 对备份的文件在传输时进行压缩处理。
- -H 保留硬链结。
- -D 保持设备文件信息。
- -A 保留ACL属性信息
- --delete 删除那些目标位置有而原始位置没有的文件。
- --checksum 打开校验开关,强制对文件传输进行校验。
-
安装inotify-tools(需要gcc、gcc-c++软件包支持)
# tar zxvf inotify-tools-3.14.tar.gz -C /opt # cd /opt/inotify-tools-3.14 # ./configure # make && make install
-
Inotify命令的基本用法
- -m 表示持续监控
- -r 表示递归整个目录
- -q 简化输出信息
- inotifywait 可监控: modify 修改、 create 创建、move 移动、delete 删除
-
编写shell脚本配置内容发布节点
# vim /web/inotifyrsync.sh #!/bin/bash host1=192.168.125.117 src=/web/wwwroot/ dst1=web1 user1=web1user /usr/local/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f%e‘ -e close_write,delete,create,attrib $src | while read files do /usr/bin/rsync -vzrtopg --delete --progress --password-file= /etc/rsyncd_users.db $src [email protected]$host1::$dst1 > /dev/null 2>&1 echo "${files} was rsynced." >> /tmp/rsync.log 2>&1 done
- 为脚本指定可执行权限,放入后台执行,并加入系统自启动文件
chmod 755 /web/inotifyrsync.sh
/web/inotifyrsync.sh &
echo "/web/inotifyrsync.sh &" >> /etc/rc.local
-
调整inotify内核参数
# vim /etc/sysctl.conf fs.inotify.max_queued_events = 16384 监控事件队列(16384) fs.inotify.max_user_instances = 1024 最多监控实例数(1024) fs.inotify.max_user_watches = 1048576 每个实例最多监控文件数(1048576)
- 此时我们在Server1服务器上变更数据会在Server2上同步,此时我们使用同样的方法使Server2的数据及时同步到Server1服务器,即可实现双机同步。
以上是关于配置 Rsync + inotify 实现文件服务器数据实时双向同步的主要内容,如果未能解决你的问题,请参考以下文章