系统:Ubuntu 16.04.1 工具:rsync 3.1.1 、inotify -tools 3.14 作者:jevtse 本文除了软件安装部分,其他内容同样适用其他linux系统;
同步目标主机:172.16.250.141;rsync服务端,只需搭建rsync服务;
同步源主机:172.16.250.142;rsync客户端,只需安装inotify -tools工具包;
1、rsync传输方式 0%
2、rsync命令 10%
3、rsync服务端配置 40%
4、rsync服务端配置 50%
5、inotify-tools 50%
6、inotifywait+rsync实现数据实时同步 60%
7、inotify+rsync双机同步脚本 80%
rsync是一个远程文件同步(备份)工具,使用Rsync算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快,常用小规模网络或局域网文件同步传输;
由于rsync每次同步需要将整个目录扫描一次,当文件数量较大时,整个过程非常耗时耗性能,同时rsync不能实时监控文件的变化;而inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
所以我们可以通过inotify -tools工具包实现对 Linux 文件实时监控,当文件发生变化时,实时将变化的文件通过rsync同步到远端备份服务器;
本文以把客户端/data/rsyncy下的文件同步备份到服务端的/data/backup目录下为例;
Ubuntu默认自带rsync工具,不需要安装;
1、rsync传输方式
基于SSH协议传输:类似于scp命令,可实现PUSH本地文件至远程,或PULL远程文件到本地,只需主机安装rsync程序即可,无需开启rsync服务;
基于rsync协议传输:基于C/S模型的rsyncd服务端与rsync客户端命令完成单向数据传输,远程端需开启rsync服务,本文同步方案就是使用该协议传输数据;
2、rsync命令
Usage: rsync [OPTION]... SRC [SRC]... DEST #本地文件拷贝 or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST #拷贝本地数据到远端主机(ssh、rsh等工具) or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST #拷贝本地数据到远程rsync服务器 or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST #拷贝本地数据到远程rsync服务器,URL模式 or rsync [OPTION]... [USER@]HOST:SRC [DEST] #拷贝远端主机数据到本地(ssh、rsh等工具) or rsync [OPTION]... [USER@]HOST::SRC [DEST] #拷贝远程rsync服务器数据到本地 or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] #拷贝远程rsync服务器数据到本地,URL模式 #HOST后面为单冒号( : )时表示使用shell远程工具连接(如ssh、rsh等);HOST后面为双冒号时( :: )或rsync://时表示使用rsync协议传输,此时服务器端的[SRC]或[DEST]为rsyncd.conf中定义的模块名称; -v, --verbose:详细输出模式 -q, --quiet 精简输出模式 -c, --checksum:对传输完成的文件进行校验 -b, --backup:不覆盖原有文件,为其重命名~file -u, --update:仅更新旧文件,判断mtime,不同步相同的文件 -z, --compress:压缩传输 -r, --recursive:递归子目录 -a, --archive:归档且递归,保留所有属性,相当于 -rltogpD (不包括 -HAX) -l, --links:保留软链接 -H, --hard -links:保留硬链结 -A, --acls:保留ACL权限 -X, --xattrs:保留扩展属性 -t, --times:保留时间戳 -o, --owner:保留属主信息 -g, --group:保留属组信息 -p, --perms:保留文件权限 -D, --devices:保留设备文件属性 --delete:删除目标主机多余的文件 --delete -after:传输完成后再删除多余的文件 --force:强制删除目录,即使不为空 --password -file=login.passwd:从文件读取密码 --progress:显示备份过程,进度条 --ignore -errors:忽略IO错误进行删除 --partial:保留未完全传输的文件,恢复后断点续传 --compare -dest=DIR 比较DIR中的文件来决定是否需要同步 --exclude=PATTERN:指定排除的文件或目录,可模式匹配 --include=PATTERN:指定不排除的文件或目录 --bwlimit=Kbps:限制传输带宽,KBytes per second
3、rsync配置
可以从/usr/share/doc/rsync/examples/拷贝rsync自带的模板文件rsyncd.conf到/etc目录下修改,或直接在创建/etc/rsyncd.conf
root@jev -u1:~# cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/
服务端常用配置如下:
root@jev -u1:~# cat /etc/rsyncd.conf # GLOBAL OPTIONS #全局配置段 use chroot = no #是否chroot strict modes = yes #严格模式 lock file = /var/lock/rsyncd #程序锁文件存放位置 pid file = /var/run/rsyncd.pid #pid文件位置 log file = /va/log/rsyncd.log #日志文件位置 # MODULE OPTIONS #局部配置段 [backup] #模块名称 path = /data/backup #同步文件存放目录 max connections=10 #最多并发数 read only = no #开启读取 list = false #是否允许查看列表 # exclude = lost+found/ #不同步的文件 # exclude from = #指定一个包含exclude模式定义的文件名 # include = #类似exclude # include from = #指定一个包含include模式定义的文件名 uid = root #以谁的身份运行rsync gid = root #运行rsync的组 auth users = jevtse #虚拟用户名(非linux用户),同步登录用 secrets file = /etc/rsyncd.secrets #虚拟用户的密码存放文件 hosts allow = 172.16.250.142 #白名单 hosts deny = * #黑名单 ignore errors = yes #忽略I/O错误 ignore nonreadable = yes #忽略没有访问文件权限的用户 transfer logging = no #使用ftp格式独立记录日志 # log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #日志格式 timeout = 600 #超时时间 refuse options = checksum dry -run #客户端不能使用的命令 dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #不进行压缩传输的文件
创建虚拟用户的密码文件,格式为”auth_name:passwd”
root@jev -u1:~# echo jevtse:jevtsepass >> /etc/rsyncd.secrets
给予密码文件最小权限
root@jev -u1:~# chmod 600 /etc/rsyncd.secrets
创建数据备份目录,需于配置文件一致,如果存在无需创建
root@jev -u1:~# mkdir /data/backup -pv
确保selinux与iptables不会成为阻碍;
4、rsync客户端配置
创建虚拟用户认证密码文件,密码需与服务端对应;
root@jev -u2:~# echo jevtsepass > /etc/rsyncd.login.secrets
给予密码文件最小权限
root@jev -u2:~# chmod 660 /etc/rsyncd.login.secrets
创建数据源目录
root@jev -u2:~# mkdir /data/rsync -pv
5、inotify-tools
在客户端安装inotify-tools工具包
root@jev-u2:~# apt install inotify-tools -y root@jev-u2:~# dpkg -L inotify-tools 。 。 。 /usr/bin/inotifywait /usr/bin/inotifywatch
可以看到工具包包含inotifywait与inotifywatch俩个工具,inotifywait命令用于监视文件系统的细微变化;inotifywatch用于收集关于被监视的文件系统的统计数据。
inotifywait命令
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ] inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ] -m, --monitor:持续保持监听, -d, --daemon:以守护进程方式在后台监听 -r, --recursive:递归监听所有目录 -o, --outfile <file> :将events信息保存向到指定文件 -s, --syslog:将错误信息写进系统日志文件 -q, --quiet:静默模式,只输出events -qq :静默模式,不输出任何信息 -e, --event <event1> [ -e|--event <event2> ... ]:指定监控的events(access,modify,attrib,close,move,delete,……) --timefmt <fmt>:指定时间格式,相等于将时间格式赋值给%T --format:指定输出文件events变化的信息格式, %T时间,%w触发事件文件所在绝对路径,%f触发事件文件名称,%e触发的事件名称…
6、inotifywait+rsync实现数据实时同步
通过inotifywait实时监控172.16.250.142:/date/rsync目录下文件的修改、删除、创建、移动、属性变化情况,如有变动,将发生变化的文件通过管道传送给rsync,触发rsync实时同步到172.16.250.141上srync服务器的[backup]模块对应的备份目录下:
root@jev-u2:~# inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete,create,move,attrib /data/rsync/ | while read line ; do rsync -avz --delete --password-file=/etc/rsyncd.login.secrets /data/rsync/ jevtse@172.16.250.141::backup ; done
注意[SRC]即(/data/rsync/)后面必须带分隔符(/),否则会在目标服务器重新创建目录;
再开启一个终端,在/date/rsync下面创建多级目录测试是否能正常触发数据同步:
root@jev-u2:~# mkdir /data/rsync/test0/test1/test2 -pv mkdir: created directory '/data/rsync/test0' mkdir: created directory '/data/rsync/test0/test1' mkdir: created directory '/data/rsync/test0/test1/test2'
查看刚刚运行同步命令的终端的输出:
root@jev-u2:~# inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete ,create,move,attrib /data/rsync/ | while read line ; do rsync -avz --delete --password-file=/etc/rsyncd.login.secrets /data/rsync/ jevtse@172.16.250.141::backup ; done sending incremental file list ./ test0/ test0/test1/ test0/test1/test2/ sent 128 bytes received 39 bytes 334.00 bytes/sec total size is 0 speedup is 0.00 sending incremental file list sent 112 bytes received 23 bytes 270.00 bytes/sec total size is 0 speedup is 0.00 sending incremental file list sent 112 bytes received 23 bytes 270.00 bytes/sec total size is 0 speedup is 0.00
可以看到,已经正常触发rsync传输部分文件到rsync服务端;
在rsync服务端172.16.250.141查看对应目录是否创建成功
root@jev-u1:~# tree /data/backup/ /data/backup/ └── test0 └── test1 └── test2 3 directories, 0 files
初步测试成功
7、inotify+rsync双机同步脚本
root@jev-u2:~# cat inotify-rsync.sh #!/bin/bash #Version 2.0 #Auther: jevtse SRC=/data/rsync/ #备份源目录# DEST=jevtse@172.16.250.141::backup #目标目录# PASS_FILE=/etc/rsyncd.login.secrets #密码文件位置# LOG=/var/log/inotify-rsync.log #成功日志# ERR_LOG=/var/log/inotify-rsync-error.log #错误日志# TEMP=`mktemp /tmp/rsync.XXX` inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete,create,move,attrib $SRC | while read line ; do > $TEMP rsync -avz --delete --password-file=$PASS_FILE $SRC $DEST 2>> $TEMP [ -s $TEMP ] && ( echo $line >> $ERR_LOG ; cat $TEMP >> $ERR_LOG ) || echo $line >> $LOG ; done unset SRC DEST PASS_FILE LOG ERR_LOG TEMP
脚本使用:
root@jev-u2:~# chomd u+x inotify-rsync.sh root@jev-u2:~# ./inotify-rsync.sh &
客户端事件同步成功日志示例:
root@jev-u2:~# cat /var/log/inotify-rsync.log 17-03-05 14:46 /data/rsync/test0/test1/test2/ txt1 MODIFY
客户端事件同步失败日志示例:
root@jev-u2:~# cat /var/log/inotify-rsync-error.log 17-03-05 14:54 /data/rsync/test0/test1/test2/ txt1 MODIFY rsync: failed to connect to 172.16.250.141 (172.16.250.141): Connection refused rsync error: error in socket IO (code 10) at clientserver.c(128) [sender=3.1.1]
【本文完】
原创文章,作者:Jev Tse,如若转载,请注明出处:http://www.178linux.com/70527