载入天数... 载入时分秒... (*๓´╰╯`๓)
李星辰
发布于 2022-12-04 / 22 阅读 / 0 评论 / 0 点赞

rsync+inotify实现文件实时同步【增量同步】

客户端初始化脚本:

mkdir /data/ -p
touch  server.pass
echo "cVOfK6csmJP4ak7b"  >> /data/server.pass
chmod 600 /data/server.pass
echo "50000000" > /proc/sys/fs/inotify/max_user_watches
echo "50000000" > /proc/sys/fs/inotify/max_queued_events

# inotifywait -mrq -e modify,create,move,delete --timefmt "%d-%m-%y %H:%M" --format "%T %w%f"  /home/
#查看是否支持inotify,从kernel  2.6.13开始正式并入内核。
#uname -r

#安装inotify-toos
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify-tools
make -j4 && make install
cd usr/local/inotify-tools/bin
#做个软链方便系统调用命令
ln -s usr/local/inotify-tools/bin/inotifywait  usr/bin/ 
 
#inotify语法详解: 
 inotifywait [-hcmrq] [-e ] [-t ] [-- format ] [--timefmt ] [ ... ]
选项参数:
-h,–help # 输出帮助信息
@ # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径
–fromfile # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-m,–monitor # 接收到一个事情而不退出,无限期地执行。默认行为是接收到一个事情后立即退出
-d,–daemon # 跟–monitor一样,除了是在后台运行,需要指定 –outfile把事情输出到一个文件。也意味着使用了–syslog
-o,–outfile # 输出事情到一个文件而不是标准输出。
-s,–syslog # 输出错误信息到系统日志
-r,–recursive # 监视一个目录下的所有子目录。
-q,–quiet # 指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude # 正则匹配需要排除的文件,大小写敏感。
–excludei # 正则匹配需要排除的文件,忽略大小写。
-t,–timeout # 设置超时时间,如果为0,则无限期地执行下去。
-e,–event # 指定监视的事件。
-c,–csv # 输出csv格式。
–timefmt # 指定时间格式,用于–format选项中的%T格式。
– format # 指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式

客户端执行脚本:

vim ync_inotify.sh 
nohup bash ync_inotify.sh >> ync_inotify.log 2>&1 &
#! /bin/bash
# **********************************************************
# * Author        : 李星辰
# * Email         : 1352113079@qq.com
# * Last modified : 2022-12-02 21:20
# * Filename      : ync_inotify.sh
# * Description   : 君子慎独,不欺暗室,卑以自牧,含章可贞,
#                   大丈夫立于天地之间,当仰天地浩然正气,
#                   行光明磊落之事,克己,慎独,守心,明性,
#                   以克人之心克己,以容己之心容人;
# * *******************************************************

#同步到备份机的ip地址
HOST=""
#同步到备份机的rsync用户名
PASSWD=""
#本地要同步的文件路径或者目录,请写绝对路径
PATH=""

#定义inotifywait监控/data目录中文件事件的变量。attrib表示属性编号
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /data01/"
#定义执行 rysnc 上行同步的变量。--delete保证两边目录内容一致,可以不加
RSYNC_CMD="rsync -azH --delete --password-file=/data/server.pass ${PATH} ${PASSWD}@${HOST}::ync_data/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -le 0 ];then
    $RSYNC_CMD
    fi
echo "$INOTIFY_CMD:${INOTIFY_CMD}"
echo "DIRECTORY:${DIRECTORY}"
echo "EVENT:${EVENT}"
echo "FILE:${FILE}"
echo "[$(date "+%Y-%m-%d %H:%M:%S")]  ########################################################"
done

服务端配置:

mv /etc/rsyncd.conf   /etc/rsyncd.conf.back
touch /etc/rsyncd.conf 
mkdir /data/rsync/run/ -p 
mkdir /data/rsync/log/ -p
cat > /etc/rsyncd.conf <<EOF
# **********************************************************
# * Author        : 李星辰
# * Email         : 1352113079@qq.com
# * Last modified : 2022-12-02 21:20
# * Filename      : ync_inotify.sh
# * Description   : 君子慎独,不欺暗室,卑以自牧,含章可贞,
#                   大丈夫立于天地之间,当仰天地浩然正气,
#                   行光明磊落之事,克己,慎独,守心,明性,
#                   以克人之心克己,以容己之心容人;
# * *******************************************************

#设置rsync运行权限为root
uid = root
#设置rsync运行权限为root
gid = root
#监听地址
address = 0.0.0.0
#默认端口
port = 873
#禁锢在源目录
use chroot = yes
#日志文件位置,启动rsync后自动产生这个文件,无需提前创建
log file = /var/log/rsyncd.log
#pid文件的存放位置
pidfile = /var/run/rsyncd.pid
支持max connections参数的锁文件
lock file = /var/run/rsync.lock
#同步时不再压缩的文件类型
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
#允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
#hosts allow = 192.168.183.135
#禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
#hosts deny = 192.168.1.1
#存放访问的客户机地址。多个地址以空格分隔
#hosts allow = 0.0.0.0


#自定义同步名称
[ync_data]
#rsync服务端数据存放路径,客户端的数据将同步至此目录
path = /data/data_backup
#备注
comment = sync etc from client lxc
#表示出现错误忽略错误
#ignore errors
默认为true,修改为no,增加对目录文件软链接的备份
use chroot = no
#是否为只读,yes表示客户端只能读取目录内容,不能写入。只允许下行,不允许上行。
read only = no
#不显示rsync服务端资源列表
list = no
#最大连接数
max connections = 200
#设置超时时间
timeout = 600
#执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
auth users = admin
#存放授权账户信息的数据文件
#如采用匿名的方式,只要将其中的“auth users”和“secrets file”配置项去掉即可。
secrets file = /data/rsync/rsyncd_users.db
EOF

systemctl restart rsyncd
ln -s /var/log/rsyncd.log /data/rsync/log/
ln -s /var/run/rsyncd.pid /data/rsync/run/


评论