当前位置: 首页 > 工具软件 > inotify-sync > 使用案例 >

rsync + inotify 同步数据

颜骁
2023-12-01

rsync

1.安装rsync包
yum install rsync
2.两种工作模式
2.1.本地
rsync -r /var/www/image/ /var/www/test/
2.2.远程
rsync -r /var/www/test/ root@192.168.56.102:/var/www/test/

rsync -r root@192.168.56.102:/var/www/test/ /var/www/test/
3.两种认证协议
3.1.ssh认证
rsync -r /var/www/test/ root@192.168.56.102:/var/www/test/
3.2.rsync 协议认证
3.2.1.配置账号密码文件(远程)
echo -e "image:123456\ntest:123456" > /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd
3.2.2.修改配置文件 /etc/rsyncd.conf(远程)

# /etc/rsyncd: configuration file for rsync daemon mode
uid = root
gid = root
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

[image]
path = /var/www/image/
# https://download.samba.org/pub/rsync/rsyncd.conf.5#auth_users
auth users = image
# https://download.samba.org/pub/rsync/rsyncd.conf.5#secrets_file
secrets file = /etc/rsyncd.passwd
# 此参数确定客户端是否能够上传文件。如果“只读”为真,则任何尝试上传都将失败。如果“只读”为假,则如果守护程序端的文件权限允许上传,则可以上传。默认情况下所有模块都是只读的。请注意,“ auth users ”可以基于每个用户覆盖此设置。
read only = false

[test]
path = /var/www/test/
# https://download.samba.org/pub/rsync/rsyncd.conf.5#auth_users
auth users = test
# https://download.samba.org/pub/rsync/rsyncd.conf.5#secrets_file
secrets file = /etc/rsyncd.passwd
# 此参数确定客户端是否能够上传文件。如果“只读”为真,则任何尝试上传都将失败。如果“只读”为假,则如果守护程序端的文件权限允许上传,则可以上传。默认情况下所有模块都是只读的。请注意,“ auth users ”可以基于每个用户覆盖此设置。
read only = false

3.2.3.开启 rsyncd 服务(远程)
systemctl start rsyncd
3.2.4.配置密码文件实现无需手动输入密码(本地)
echo 123456 > /etc/rsync.image.passwd
chmod 600 /etc/rsync.image.passwd

echo 123456 > /etc/rsync.test.passwd
chmod 600 /etc/rsync.test.passwd
3.2.5.请求同步(本地)
rsync -r /var/www/image/ image@192.168.56.101::image
也可以使用 url 格式语法:
rsync -r /var/www/image/ rsync://image@192.168.56.101/image

inotify

1.安装inotify-tools包
yum install inotify-tools

rsync + inotify

1.创建脚本文件 /var/www/inotify_rsync.sh(本地)

#!/bin/bash 
# 本地被监控目录
watch_dir=/var/www/image/
# 虚拟用户               
user="image"
# 虚拟用户密码                    
export RSYNC_PASSWORD=123456
# 远程模块名      
module="image"
# 远程主机ip                   
ip=192.168.56.101               
# 先整体同步一次
rsync -azc --delete ${watch_dir} ${user}@${ip}::${module}
# 切换到被监控目录下,然后用inotifywait监控./目录,这样后期就可以用-R选项同步新增的子目录
cd $watch_dir  
/usr/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%w%f:%Xe:%T' -e create,delete,modify,move,attrib,close_write ./ \
--exclude=".*.swp" | \
while read line
do
    # $line的输出format为:文件路径:事件:时间
    # 获取文件的绝对路径
    FILE=$(echo $line | awk -F: '{print $1}')  
    # 获取监控的事件
    EVENT=$(echo $line | awk -F: '{print $2}') 
    # 监控到对文件的下述行为后,只把文件同步到远端
    if [[ $EVENT =~ 'CREATE' ]] || [[ $EVENT =~ 'MODIFY' ]] || [[ $EVENT =~ 'CLOSE_WRITE' ]] || [[ $EVENT =~ 'MOVED_TO' ]] || [[ $EVENT =~ 'ATTRIB' ]];then
        rsync -azcR ${FILE} ${user}@${ip}::${module}
    fi    
    # 监控到涉及到目录的改动,将目录同步到远端,例如用dirname ${FILE}获取目录
    if [[ $EVENT =~ 'DELETE' ]] || [[ $EVENT =~ 'MOVED_FROM' ]];then
        rsync -azcR --delete $(dirname ${FILE}) ${user}@${ip}::${module} &>/dev/null
    fi
done &
# 末尾的&符号,代表在子shell中提交命令,这样进程的ppid就变为1,当前窗口关闭,该进程依然存活

2.创建/usr/lib/systemd/system/inotify_rsync.service开机自启文件(本地)

[Unit]
Description=inotify_rsync
Wants=network-online.target
[Service]
User=root
Type=forking
ExecStart=/usr/bin/bash /var/www/inotify_rsync.sh start
ExecStop=/usr/bin/bash /var/www//inotify_rsync.sh stop
SuccessExitStatus=143
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=inotify_rsync
[Install]
WantedBy=multi-user.target

3.创建日志配置文件 /etc/rsyslog.d/inotify_rsync.conf(本地)

if $syslogtag contains 'inotify_rsync' then /var/log/inotify_rsync.log
if $syslogtag contains 'inotify_rsync' then stop

4.启动(本地)
systemctl start inotify_rsync

 类似资料: