配置rsync+inotify实时同步
Linux从2.6.13版内核开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件的存取,删除,移动,修改内容及属性等。利用这个机制,可以实现文件异动警告,增量备份,针对目录或文件的变化及时做出响应。
将inotify机制与rsync工具结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份,否则处于静默等待状态,避免了按固定周期备份是存在的延迟性,周期过密等问题。
正因为inotify通知机制有Linux内核提供,因此inotify主要做本机监控,在触发式备份应用中更适合上行同步
1、调整inotify内核参数(在客户端操作)
在linux内核中,默认的inotify机制提供给了三个调控参数:
cat /proc/sys/fs/inotify/max_queued_events (表示监控事件队列)(16384)
16384
cat /proc/sys/fs/inotify/max_user_instances (最多监控实例数)(128)
128
cat /proc/sys/fs/inotify/max_user_watches (每个实例最多监控文件数)(8192)
8192
当要监控的目录,文件数量较多或者变化频繁时,建议加大这三个参数的值
vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
sysctl -p
2、安装inotify-tools
inotify-tools主要提供inotifywait,inotifywatch等工具,用来监控,汇总改动情况。
上传软件包,在Linux soft内
tar -xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14/
./configure && make && make install
以监控网站目录/var/www/html/为例,执行inotifywait命令后,在另外一个终端中改动/var/www/html目录下内容
mkdir -p /var/www/html (在本地创建目录)
inotifywait -mrq -e modify,create,move,delete,attrib /var/www/html/ (测试监控本机目录)
【监控窗口不会退出,所以以下操作要在另一个窗口进行】
-e 指定要监控的事件
-m 表示持续监控
-r 表示递归整个目录
-q 简化输出信息
modify:对文件内容的修改
create:创建
move:移动,重命名
delete:删除
attrib:属性,比如修改权限,属主,属组
一有变动立即输出结果。inotifywait可用于收集系统变动情况,并在运行结束后输出汇总的变化情况
另一个终端:在/var/www/html目录下添加文件、移动文件、跟踪屏幕输出结果
touch /var/www/html/a.txt
touch /var/www/html/b.txt
编写触发式同步脚本
inotifywait输出的监控结果中,每行记录中包括目录,事件,文件。据此可以识别变动情况。为了简单,只要检测到变动时执行rsync上同步操作即可。
注意:当更新较频繁时,避免并发执行rsync备份,若rsync进程已经存在则忽略本次同步,或者根据rsync进程数量(取决于实际任务)来决定是否同步。
为了使发起端可以上传文件的权限,修改同步源(服务端)的配置文件
vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
address = 192.168.200.111
port = 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.200.0/24
[wwwroot]
path = /var/www/html
comment = Document Root os www.laowang.com
read only = no (只读改为no)
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper
secrets file = /etc/rsyncd_users.db
重启服务
kill $(cat /var/run/rsyncd.pid)
rsync --daemon
netstat -lnpt | grep 873
chown nobody:nobody /var/www/html/ (修改共享目录属主,属组)
在客户端测试是否可以上传
rsync -avzH --password-file=/etc/server.pass /etc/hosts [email protected]::wwwroot/
vim /opt/inotify.sh (脚本名中不能有rsync,否则会被认为rsync存活)
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,attrib,delete /var/www/html" (监控变量命令)
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ [email protected]::wwwroot" (rsync上传命令变量)
$INOTIFY_CMD | while read DIRECTORY EVENT FILE (执行监控命令|定义了三个变量,默认空格分开)
do
if [ $(pgrep rsync | wc -l) -le 0 ] (判断rsync是否开启,如果没有进程,执行以下操作)
then
$RSYNC_CMD
fi
done
chmod +x /opt/inotify_rsync.sh
nohup /opt/inotify.sh & (可以使脚本在后台运行)
触发式操作有些场景不用
可以用:用于数据异地备份
不建议用:WEB集群中节点数据的批量更新,管理员上传文件服务器A才会有变化,
管理员知道什么时候有改动,不需要触发,
管理员上传代码出错,所有服务器都会同步到错的代码
原文地址:https://www.cnblogs.com/elin989898/p/12005601.html