Inotify+rsync主机之间数据同步
rsync即remote sync,是UNIX类系统文件同步和数据传输工具,能实现客户端和远程服务器端的文件同步,它采用的是rsync算法,它比较传输源文件和目标文件有变更的部分进行传送。rsync的一些特性:
(1) 增量数据同步,传输效率搞;
(2) 镜像保存整个目录树和文件系统
(3) 保留文件属性,时间戳等。
(4) 支持加密传输
inotify是一种高效率、细粒度、异步的文件系统监控机制。它监控文件系统,并且及时向第三方软件(如rsync)发出相关的删、读、写操作等。linux内核2.6.13版本开始支持inotify。利用这个内核接口,第三方软件如inotify-tools可以监控文件系统下文件的变化情况。
实验案例:
主机:192.168.1.10 CentOS 6.8 x86_64
备份机:192.168.1.20 CentOS 6.8 x86_64
监控主机(192.168.1.10)的/data/web目录,当该目录内容有变化,立即将其内容同步到备份机(192.168.1.20)的/data/www目录。
注意:实验前请先关闭两台主机的SeLinux和iptables。
备份机:192.168.1.20
系统默认已安装rsync,不需手动安装,如果没有安装,请先进行rsync的安装。但没有提供配置文件,需手动建立。
# 查询主机是否安装rsync软件,若主机没有安装rsync软件,则使用yum进行安装。
[root@localhost ~]# rpm -qa | grep rsync
[root@localhost ~]# yum -y install rsync
# 编辑rsync的配置文件/etc/rsyncd.conf
[root@localhost ~]# vim /etc/rsyncd.conf
#/etc/rsyncd: configuration file for rsync daemon mode
#See rsyncd.conf man page for more options.
#configuration example:
uid = root
gid = root
port = 38000 # rsyncd服务监听端口,默认为873,防火墙需要放行
use chroot = yes
max connections =10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[www]
path = /data/www/
comment = rsync files
ignore errors
read only = no
write only = no
host allow = 192.168.1.10
host deny = *
list = false
uid = root
gid = root
auth user = rsync
secrets file = /etc/server.passwd
编辑好配置文件并保存后,添加文件同步用户和设置同步用户密码:
[root@localhost ~]# useradd -M -s /sbin/nologin rsync
[root@localhost ~]# echo 123456 | passwd rsync --stdin
# 创建密码文件(文件格式:user:password)
[root@localhost ~]# vim /etc/server.passwd
rsync:123456
# 修改密码文件权限
[root@localhost ~]# chmod 600 /etc/server.passwd
# 启动rsync守护进程
[root@localhost ~]# /usr/bin/rsync --daemon
#将rsync守护进程加入系统自启动文件
[root@localhost ~]# echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local
主机:192.168.1.10
# 安装inotify-tools软件包
[root@localhost ~]# yum install inotify-tools -y
inotifywait使用内核inotify接口等待文件的变化,时候使用shell脚本来实现。
-m, --monitor 始终保持事件的坚听,默认是在一个事件发生后退出。
-r, --recursive 递归监控目录 -
q, --quiet 在屏幕显示监控事件
-e, --event 制定要监控的事件,如modify、delete、create、access、attrib等inotifywatch收集被监控的文件系统统计数据。
编写shell脚本来执行inotifywait命令内容同步监控
[root@localhost ~]# vim /usr/local/sbin/inotifyrsync.sh
#!/bin/bash
host=192.168.1.20
src=/data/web/
user=rsync
dst=www # 此处的目标目录为目标备份机/etc/rsyncd.conf配置文件中定义的别名,对应的具体目录为path
logdir=/var/log/rsync
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
do
/usr/bin/rsync -zrtopg --delete --progress --password-file=/etc/server.passwd $src $user@$host::$dst
echo "${files} was rsynced" >>$logdir/rsync_$(date +%F).log 2>&1
done
[ -d $logdir ] && find $logdir -type f -mtime +30 -delete
# 创建rsyncd服务同步日志目录
[root@localhost ~]# mkdir -p /var/log/rsync
#赋予inotifywait.sh监控脚本执行权限,然后放入后台运行
[root@localhost ~]# chmod 755 /usr/local/sbin/inotifyrsync.sh
[root@localhost ~]# /usr/local/sbin/inotifyrsync.sh &
将inotifywait.sh监控脚本加入到服务器的定时任务中:
[root@localhost ~]# crontab -e
*/1 * * * * /usr/local/sbin/inotifyrsync.sh
问题:
在使用 inotify 监控目录和文件时 inotify报如下错误:
cat /proc/sys/fs/inotify/max_user_watches 一下这个文件,默认值是8192。
然后:
echo 8192000 >> /proc/sys/fs/inotify/max_user_watches
即可~
在inotify 的时候经常遇到 建议写入/etc/sysctl.conf
fs.inotify.max_user_watches=8192000
sysctl -p
留言评论