使用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 14 15 16 17 18 19 20 21 22 23 24 25 | #!/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 |