Rsync+Inotify实现文件自动同步

使用Rsync进行数据同步前要对所有文件进行对比,然后进行差异数据同步,有时可能数据只是1TB数据中的1KB数据发生了改变,在不知道什么时候会发生数据改变的情况下,为了同步1KB的数据,需要不停地进行Rsync连接,对比客户端与服务器之间的数据差异,这样往往是很低效的。然而数据的变化随时都有可能发生,如果多台主机之间要求数据发生变化后进行实时同步,就需要结合Inotify工具。目前Inotify已经被集成到Linux内核中,Inotify为用户态应用程序提供了文件系统事件通告机制,比如当发生文件的访问、修改、以及删除等事件时,可以立刻通告给用户态应用程序,通过Inotify可以实时了解文件系统发生的所有变化。

Inotify可以监控的部分常见文件系统事件如下表:

事件名称 描述
IN_ACCESS 文件访问事件
IN_MODIFY 文件修改事件
IN_ATTRIB 文件属性修改事件
IN_OPEN 文件打开事件
IN_CLOSE_WRITE 可写文件被关闭事件
IN_CLOSE_NOWRITE 不可写文件被关闭事件
IN_MOVED_FROM

IN_MOVED_TO

文件移动或重命名事件
IN_DELETE 文件或目录删除事件
IN_CREATE 文件或目录创建事件
IN_DELETE_SELF 自删除事件

利用Inotify的这种事件通知机制,用户态的应用程序就可以实时监控文件系统变化,然而Inotify仅是内核提供的一种系统功能,用户如果需要使用该功能,还需要安装用户态软件。可以使用inotify-tools来实现文件系统的实时监控。

源码安装软件

yum install -y automake libtool

cd inotify-tools-3.14

./configure

make && make install

监控数据

inotify-tool提供了连个应用程序,分别为inotifywait与inotifywatch。其中,inotifywait命令的描述和用法如下:

描述:使用inotify机制等待文件系统事件,该命令非常适合实时监控文件系统的变化。

用法:inotifywait [-hcmrq] [-e <event>] [-t <seconds>] [–format <fmt>] [–timefmt <fmt>] <file> …

选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-h,--help 显示帮助信息
@ 指定监控路径中的例外文件,应用于不需要监控的文件
--fromfile 从文件中读取需要监控与例外的文件名称,每行一个文件名,如果文件名称以@开头,则表示例外文件
-m,--monitor 接收到事件后不退出,默认程序在接收一个事件信息后会退出
-d,--daemon 与--monitor类似,但程序会进入后台执行,需要通过--outfile指定事件信息的输出文件
-o,--outfile 将事件信息输出至文件,默认输出至标准输出
-s,--syslog 将错误信息输出至syslog系统日志,默认输出至标准错误输出
-r,--recursive 递归监控
-q,--quiet 静默模式,不输出信息
--exclude 使用正则表达式匹配例外文件,区分大小写
--excludei 使用正则表达式匹配例外文件,不区分大小写
-t,--timeout 在指定的时间没有发生事件,则退出程序
-e,--event 仅监控指定的事件
-c,--csv 使用CSV格式输出
--timefmt 设置时间格式,即--format指定的%T格式
--format 指定输出格式信息

Rsync与Inotify结合使用

单一的Rsync工具仅可以进行数据同步,单一的Inotify仅可以实现实时文件监控,两者的结合能满足对实时数据同步的要求。

接收端配置(IP:192.168.77.101):

yum install -y rsync

mkdir -p /var/www/001

chmod 750 /var/www/001

chown nobody.nobody /var/www/001

vi /etc/rsyncd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#/etc/rsync.conf
#开启Rsync数据传输日志功能
transfer logging = yes
#设置日志文件名称,可以通过log format参数设置日志格式
log file = /var/log/rsyncd.log
#设置Rsync进程号保存文件名称
pid file = /var/run/rsyncd.pid
#设置锁文件名称
lock file = /var/run/rsync.lock
#设置进行数据传输时使用的账户名称或ID号,默认使用nobody
uid = nobody
#设置进行数据传输时使用的组名称或GID号,默认使用nobody
gid = nobody
#设置user chroot为yes后,rsync会首先进行chroot设置,将根映射到path参数路径下,对客户端而言,系统的根就是参数所指定的路径。这样设置需要root权限,并且在同步符号连接资料时仅会同步名称,而内容将不会同步。
use chroot = no
#忽略一些IO错误
ignore errors
#是否允许客户端上传数据
read only = no
#模块,Rsync通过模块定义同步的目录,模块以[name]的形式定义
[web1]
#comment定义注释说明字段
comment = Web content
#同步目录的真实路径通过path指定
path = /var/www/001
#设置允许连接服务器的账户,账户可以是系统中不存在的用户
auth users = tom
#设置密码验证文件名称,该文件权限要求为只读,建议权限600,仅在设置auth users参数后有用
secrets file = /etc/rsyncd.secrets
#设置允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP与网段之间用空格分隔
hosts allow = 192.168.77.100
#设置拒绝所有(除hosts allow定义的主机外)
hosts deny = *
#客户端请求显示模块列表时,本模块名称是否显示,默认为true
list = false

echo “tom:pass” > /etc/rsyncd.secrets

chmod 600 /etc/rsyncd.secrets

rsync –daemon

echo “/usr/src/rsync –daemon” >> /etc/rc.local

iptables -I INPUT -p tcp –dport 873 -j ACCEPT

service iptables save

发送端配置(IP:192.168.77.100):

安装inotify和rsync

yum install -y rsync

yum install -y automake libtool

cd inotify-tools-3.14

make && make install

echo “pass” > /root/rsync.pass

chmod 600 /root/rsync.pass

mkdir /web/

vi Inotify_Rsync.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
export PATH=/bin:/usr/bin:/usr/local/bin
src=/web/
dest=web1
client=192.168.77.101
user=tom
passfile=/root/rsync.pass
[ ! -e $passfile ] && echo "passfile no exist" && exit 2
inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %w%f %e' --event modify,create,move,delete,attrib $src|while read line
do
echo "$line" >> /var/log/inotify_rsync 2>&1
/usr/bin/rsync -avz --delete --progress --password-file=$passfile $src ${user}@${client}::$dest >>/var/log/rsync_web 2>&1
done &

rsync命令用法详述如下:

rsync是一个快速、多功能的远程(或本地)数据复制工具

选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-v,--verbose 显示详细信息
-q,--quiet 静默模式,无错误信息
-a,--archive 归档模式,主要保留文件属性,等同于-rlptgoD
-r,--recursive 递归
-b,--backup 如果目标路径已经存在同名文件,将旧的文件重命名为~filename,可以使用--suffix指定不同的备份前缀
--back-dir 将备份文件保存至指定目录
--suffix 指定备份文件前缀
--u,--update 如果目标地址中的文件比将要下载的文件新,则不执行同步,也就是说,不会用旧文件覆盖新文件
-l,--links 保留符号链接
-p,--perms 保留文件权限属性
-H,--hard-links 保留硬链接
-A,--acls 保留ACL权限
-X,--xattrs 保留文件附加属性
-o,--owner 保留文件所有者属性
-g,--group 保留文件所属组属性
--device 保留设备文件
--specials 保留特殊文件
-D 等同于--devices --specials
-t 保留修改时间属性
-w,--whole-file 不做增量检查,直接复制全部文件
-e,--rsh=COMMAND 指定远程shell
--existing 仅同步目标路径中已经有的文件,不下载源路径下的新的文件
--delete 删除那些仅在目标路径中存在的文件(源路径中不存在)
-z,--compress 传输过程中对数据进行压缩
--include=PATTERN 匹配不排除的文件
--exclude=PATTERN 匹配需要排除的文件
--progress 显示数据传输的进度信息
--partial 保留因故障未传输完成的信息
-P 等同于--progress --partial
--password-file=FILE 指定密码文件,将密码写入文件,实现非交互式数据同步
--list-only 仅列出服务器模块列表,需要rsync服务器设置list=true

发表评论

电子邮件地址不会被公开。 必填项已用*标注

😉😐😡😈🙂😯🙁🙄😛😳😮:mrgreen:😆💡😀👿😥😎😕