centos7部署inotify与rsync实现实时数据同步
实验环境:CentOS Linux release 7.6.1810
node1:192.168.216.130 客户端(向服务端发起数据同步)
node2:192.168.216.132 服务端(接收来自客户端的数据)
本次实验为单向同步
1、在两个节点安装rsync
yum -y install rsync
2、在node2节点修改rsyncd.conf配置文件,注意hosts allow允许数据同步的IP、path同步目录、 comment备注信息、auth users认证用户、secrets file密钥文件,其参数值需要和实际一致
cat /etc/rsyncd.conf # /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: uid = 0 gid = 0 use chroot = no max connections = 200 timeout = 1000 pid file = /var/run/rsyncd.pid # exclude = lost+found/ transfer logging = yes lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log log format = %t %a %m %f %b reverse lookup = no hosts allow = 192.168.216.0/24 # timeout = 900 # ignore nonreadable = yes # dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # [ftp] # path = /home/ftp # comment = ftp export area [data] path = /data/ comment = data ignore errors read only = no #write only = yes list = false auth users = postgres secrets file = /etc/rsync/rsync.passwd
3、在node2上启动rsync服务,并创建用户认证文件,注意认证文件中的用户必须实际存在,自行创建用户
启动服务 systemctl start rsyncd 创建用户名/密码认证文件 echo "postgres:123456" > /etc/rsync/rsync.passwd 修改认证文件权限为600 chmod 600 /etc/rsync/rsync.passwd 查看认证文件 cat /etc/rsync/rsync.passwd postgres:123456
4、在node1上创建用户认证文件
node1节点只需要存放密码内容即可 echo "123456" > /etc/rsync/rsync.passwd cat /etc/rsync/rsync.passwd chmod 600 /etc/rsync/rsync.passwd
5、在node1上执行以下命令,手动测试是否可以正常同步数据,同步node1上data目录的文件至node2上的data目录
touch /data/a{1..100} rsync -avz --password-file=/etc/rsync/rsync.passwd /data/ postgres@192.168.216.132::data
此时可以看到node2下的data目录数据和node1一致
6、在node1上安装inotify-tools,这里采用编译安装,也可以执行yum install inotify-tools安装
cd /tmp/ wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz tar zxf inotify-tools-3.14.tar.gz cd inotify-tools-3.14 ./configure --prefix=/usr/local/include/ make && make install
7、在node1上创建shell脚本用于实时监控目录数据变化,并自动完成数据同步
vi inotify_rsync.sh #!/bin/bash SRC='/data/' DEST='postgres@192.168.216.132::data' inotify_home=/usr/local/include/ ${inotify_home}/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} | while read DATE TIME DIR FILE;do FILEPATH=${DIR}${FILE} rsync -az --delete --password-file=/etc/rsync/rsync.passwd $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log done
这里引入一个--delete 选项,表示客户端上的数据要与服务器端完全一致,如果 /data目录中有服务器上不存在的文件,则删除。最终目的是让客户端/data目录上的数据完全与服务器上/data保持一致;用的时候要 小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除;
注意脚本中变量SRC(同步目录)、DEST(服务端信息)、inotify_home(inotify-tools安装目录)需要和实际目录一致
8、后台运行脚本sh inotify_rsync.sh &
参考:https://blog.51cto.com/14234525/2396910