rsync结合inotify实现数据自动同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsync结合inotify实现数据自动同步相关的知识,希望对你有一定的参考价值。
rsync+inotify
rsync介绍
rsync是一个远程数据同步工具,可通过lan/wan快速同步多台主机间的文件。它使用所谓的“rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。所以通常可以作为备份工具来使用。
运行rsync server的机器也叫backup server,一个rsync server可同时备份多个client的数据;也可以多个rsync server备份一个client的数据。rsync可以搭配ssh甚至使用daemon模式。rsync server会打开一个873的服务通道(port),等待对方rsync连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
inotify介绍
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
服务器端(数据接收方)的配置
[[email protected] ~]# vim /etc/sysconfig/selinux #配置selinux
SELINUX=disabled
[[email protected] ~]#reboot #重启
[[email protected] ~]# yum -y install rsync #安装rsync,默认情况下已经安装
[[email protected] ~]# vim /etc/rsyncd.conf #编辑rsync配置文件
log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pid file = /var/run/rsyncd.pid #pid文件的存放位置
lock file = /var/run/rsync.lock #支持max connections参数的锁文件
secrets file = /etc/rsync.password #用户认证配置文件,里面保存用户名称和密码
motd file = /etc/rsyncd.motd #rsync启动时欢迎信息页面文件位置(文件内容自定义)
[web_log] #定义模板,自定义名称
path = /rsydata/ #rsync服务端数据目录路径,自定义
comment = web_log #模块名称与[web_log]自定义名称相同
uid = root #设置rsync运行权限为root
gid = root #设置rsync运行权限为root
port=873 #默认端口
use chroot = false #默认为true,修改为false,增加对目录文件软连接的备份
read only = false #设置rsync服务端文件为只读权限
list = false #不显示rsync服务端资源列表
max connections = 200 #最大连接数
timeout = 600 #设置超时时间
auth users = backuser #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = ip地址 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = IP地址 #禁止数据同步的客户端IP地址,可以设置多个
[[email protected] ~]# mkdir /rsydata #创建备份目录
[[email protected] ~]# vim /etc/rsync.password #编辑用户认证配置文件
backuser:redhat
[email protected] ~]# chmod 600 /etc/rsync.password #一定要把用户认证配置文件的权限改成600
[[email protected] ~]# /usr/bin/rsync --daemon & #后台运行rsync服务
[1] 3392
[[email protected] ~]# systemctl enable rsyncd.service #设置rsync服务开机自启
[[email protected] ~]# firewall-cmd --permanent --add-port=873/tcp #配置防火墙
[[email protected]er ~]# firewall-cmd --reload
客户端(数据发送方)的配置
[[email protected] ~]# yum -y install rsync #安装rsync,默认情况下已经安装
[[email protected] ~]# vim /etc/rsync.password#编辑认证文件,只保存密码
redhat
[[email protected] ~]# chmod 600 /etc/rsync.password#一定要把认证文件权限修改成600
[[email protected]~]#wget
http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz#下载inotify源码包
[[email protected] ~]# tar -xzvf inotify-tools-3.14.tar.gz -C /usr/local/#解压到/usr/logcal目录
[[email protected] ~]# mkdir /usr/local/inotify#创建安装目录
[[email protected] ~]# cd /usr/local/inotify-tools-3.14/
[[email protected] inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify#指定安装目录为/usr/local/inotify
[[email protected] inotify-tools-3.14]# make &&make install#编译安装
[[email protected] ~]# systemctl restart rsyncd
[[email protected] ~]# systemctl enable rsyncd
测试验证
[[email protected] ~]# mkdir /tmp/test
[[email protected] ~]# cd /tmp/test
[[email protected] test]# touch a{1..9}
[[email protected] test]# ls
a1 a2 a3 a4 a5 a6 a7 a8 a9
[[email protected]~]#rsync -vzrtopg --progress /tmp/test/ [email protected]::web_log --password-file=/etc/rsync.password#把客户端/tmp/test目录下的文件同步到服务器端的/rsydata目录下
[[email protected] ~]# cd /rsydata/
[[email protected] rsydata]# ls
a1 a2 a3 a4 a5 a6 a7 a8 a9 #数据已经同步
写一个脚本实现当客户端/tmp/test/下的文件有变化时,把此目录下的数据自动同步到服务器端的/rsydata下
[[email protected] ~]# vim inotify.sh
#!/bin/bash
/usr/local/inotify/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f‘ -e modify,delete,create,attrib /tmp/test | while read file
do
/usr/bin/rsync -vzrtopg --delete /tmp/test/ [email protected]::web_log --password-file=/etc/rsync.password
echo "${files} was rsynced" >> /var/log/rsync.log 2>&1
done
[[email protected] ~]# chmod +x inotify.sh
[[email protected] ~]# sh inotify.sh & #后台运行脚本
[1] 15435
[[email protected] ~]# jobs #查看后台作业
[1]+ Running sh inotify.sh &
[[email protected] ~]# echo "/root/inotify.sh" >> /etc/rc.local #把脚本写到开机自启动文件里面
为了防止inotify服务由于意外情况停止服务,编写监控inotify进程的脚本
[[email protected] ~]# vim /root/inotify_status.sh
#!/bin/bash
ps -elf | grep inotify &> /dev/null
if [ -z $? ]
then
echo "inotify service is running"
else
/root/inotify.sh &
echo "inotify service is activing"
fi
[[email protected] ~]# chmod +x /root/inotify_status.sh
[[email protected] ~]# crontab -e #编写一个计划任务,每时每刻执行这个脚本
* * * * * /root/inotify_status.sh & > /dev/null
参数说明
语法:inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
参数:
-h, –help
输出帮助信息
-v, –verbose
输出详细信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z, –zero
输出表格的行和列,即使元素为空
–exclude
正则匹配需要排除的文件,大小写敏感。
例:要排除/home/mjb目录下的test1,test2,cc目录,可这样写--exclude="/home/mjb/(test1/|test2/|cc/)"。多个目录或文件一定要用“|”分开,不能在命令行中用两个--exclude,否则最后的--exclude会覆盖其它的。系统只是在文件路径中查找是否有上面参数指定的字符,如果有就排除。因此在test1后面加了“/”。否则/home/mjb/test123也会被排除。
–excludei
正则匹配需要排除的文件,忽略大小写。
-r, –recursive
监视一个目录下的所有子目录。
-t , –timeout
设置超时时间
-e , –event
只监听指定的事件。
-a , –ascending
以指定事件升序排列。
-d , –descending
以指定事件降序排列。
可监听事件
access 文件读取
modify 文件更改。
attrib 文件属性更改,如权限,时间戳等。
close_write 以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。
close_nowrite 以只读模式打开的文件被关闭。
close 文件被关闭,不管它是如何打开的。
open 文件打开。
moved_to 一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。
moved_from 一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。
move 包括moved_to和 moved_from
move_self 文件或目录被移除,之后不再监听此文件或目录。
create 文件或目录创建
delete 文件或目录删除
delete_self 文件或目录移除,之后不再监听此文件或目录
unmount 文件系统取消挂载,之后不再监听此文件系统。
本文出自 “11588738” 博客,请务必保留此出处http://11598738.blog.51cto.com/11588738/1903481
以上是关于rsync结合inotify实现数据自动同步的主要内容,如果未能解决你的问题,请参考以下文章
inotify介绍及rsync + inotify 实时同步备份
惊雷Linux下rsync+inotify的实时文件自动同步
centos7中配置rsync+inotify实现自动监控数据同步