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

 

posted @ 2019-10-20 19:59  也曾少年  阅读(584)  评论(0编辑  收藏  举报