目录
rysnc 备份服务结合 inotify
搭建
服务器端
客户端
结合 inotify 实现实时同步
rysnc 备份服务结合 inotify
搭建
服务器端
1. 首先关闭 selinux,iptables
- setenfore 0
- systemctl stop firewalld
上面是临时关闭, 永久关闭如下:
- sed -ir 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
- source /etc/selinux/config
- systemctl disable firewalld
2. 编辑 /etc/rsyncd.conf 文件
- uid = rsync
- gid = rsync
- use chroot = no
- max connections = 100
- pid file = /var/run/rsyncd.pid
- lock file = /var/run/rsyncd.lock
- log file = /var/log/rsyncd.log
- [backup]
- path = /var/backup
- comment = rsync backup directory
- ignore errors
- read only = no
- hosts allow = *
- list = false
- auth users = rsync_backup
- secrets file = /etc/rsync.passwd
3. 创建密码文件并修改权限
- [root@controller ~]# VIM /etc/rsync.passwd
- rysnc_backup:123456
- [root@controller ~]# chmod 600 /etc/rsync.passwd
4. 创建备份目录, 并修改权限
- [root@controller ~]# mkdir /var/backup
- [root@controller ~]# chown rsync.rsync /var/backup
5. 重启服务即可
systemctl restart rsyncd
客户端
1. 配置密码文件 / etc/rsync.passwd
- [root@node1 ~]# VIM /etc/rsync.passwd
- 123456
2. 推送文件到服务器
- [root@node1 ~]# rsync -avz test.txt rsync://rsync_backup@192.168.139.105/backup --password-file=/etc/rsync.passwd
- # 或者
- [root@node1 ~]# rsync -avz test.txt rsync_backup@192.168.139.105::backup --password-file=/etc/rsync.passwd
- # 将以上命令写进 cron 定时任务实现定时备份
结合 inotify 实现实时同步
1. 安装 inotify 工具
yum -y install inotify-tools
2. 选项说明
-m 持续监控
-r 递归
-q 静默, 仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载
inotify 监控效果如下
- [root@node1 ~]# /usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /tmp
- MODIFY /tmp/ test
- CLOSE_WRITEXCLOSE /tmp/ test
- ATTRIB /tmp/ test
rsync+inotify 脚本
简洁版
- [root@node1 ~]# VIM rsyn-inotify.sh
- [root@node1 ~]# cat rsyn-inotify.sh
- #!/bin/bash
- dir=/tmp/backup
- /usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;do
- cd $dir && rsync -az -R --delete . rsync_backup@192.168.139.105::backup --password-file=/etc/rsync.passwd>/dev/null 2>&1
- done &
优化版:
- #!/bin/bash
- src=/tmp/backup # 需要同步的源路径
- des=backup # 目标服务器上 rsync --daemon 发布的名称, rsync --daemon 这里就不做介绍了, 网上搜一下, 比较简单.
- rsync_passwd_file=/etc/rsyncd.passwd # rsync 验证的密码文件
- ip1=192.168.139.105 # 目标服务器 1
- #ip2=192.168.0.19 # 目标服务器 2
- user=rsync_backup # rsync --daemon 定义的验证用户名
- cd ${src} # 此方法中, 由于 rsync 同步的特性, 这里必须要先 cd 到源目录, inotify 再监听 ./ 才能 rsync 同步后目录结构一致, 有兴趣的同学可以进行各种尝试观看其效果
- /usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的 "文件路径列表" 循环
- do
- INO_EVENT=$(echo $file | awk '{print $1}') # 把 inotify 输出切割 把事件类型部分赋值给 INO_EVENT
- INO_FILE=$(echo $file | awk '{print $2}') # 把 inotify 输出切割 把文件路径部分赋值给 INO_FILE
- # echo "-------------------------------$(date)------------------------------------"
- # echo $file
- #增加, 修改, 写入完成, 移动进事件
- #增, 改放在同一个判断, 因为他们都肯定是针对文件的操作, 即使是新建目录, 要同步的也只是一个空目录, 不会影响速度.
- if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型
- then
- # echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
- rsync -azcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}>/dev/null 2>&1 #&& # INO_FILE 变量代表路径哦 -c 校验文件内容
- #rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
- #仔细看 上面的 rsync 同步命令 源是用了 $(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录 (只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏> 文件下也有不错的速度 做到平衡) 然后用 - R 参数把源的目录结构递归到目标后面 保证目录结构一致性
- fi
- #删除, 移动出事件
- if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
- then
- # echo 'DELETE or MOVED_FROM'
- rsync -azR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}>/dev/null 2>&1 # &&
- # rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
- #看 rsync 命令 如果直接同步已删除的路径 ${INO_FILE}会报 no such or directory 错误 所以这里同步的源是被删文件或目录的上一级路径, 并加上 --delete 来删除目标上有而源中没有的文件, 这里不
能做到指定文件删除, 如果删除的路径越靠近根, 则同步的目录月多, 同步删除的操作就越花时间.
- fi
- #修改属性事件 指 touch chgrp chmod chown 等操作
- if [[ $INO_EVENT =~ 'ATTRIB' ]]
- then
- # echo 'ATTRIB'
- if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步, 因为同步目录会发生递归扫描, 等此目录下的文件发生同步时, rsync 会顺带更新此目录.
- then
- rsync -azcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}>/dev/null 2>&1 #&&
- # rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
- fi
- fi
- done &
来源: https://www.cnblogs.com/fllf/p/rsync-inotify.html