一、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开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
三、实验配置:
1、服务端安装并配置rsync
[[email protected] ~]# yum -y install rsync #安装rsync,默认情况下已经安装
[[email protected] ~]# vim /etc/rsyncd.conf #编辑rsync配置文件
pid file = /var/run/rsyncd.pid #pid文件的存放位置
lock file = /var/run/rsync.lock #支持max connections参数的锁文件
port = 873 #监听端口
address = 192.168.192.130 #rsyncd服务监听端口
uid = root #设置rsync运行用户权限为root
gid = root #设置rsync运行组权限为root
use chroot = yes #默认为true,修改为false,增加对目录文件软连接的备份
read only = no #是否设置rsync服务端文件为只读权限
hosts allow = 192.168.0.0/16 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = * #禁止数据同步的客户端IP地址,可以设置多个
max connections = 5 #最大连接数
#motd file = /etc/rsyncd.motd #启动时欢迎信息页面文件位置(文件内容自定义)
log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
log format = %t %a %m %f %b #日志格式
syslog facility = local3 #日志级别{系统日志}
timeout = 300 #设置超时时间
[postgres] #定义模板,自定义名称
path = /data/rsync #rsync服务端数据目录路径,自定义
list = yes #显示rsync服务端资源列表
ignore errors #忽略错误
#auth users = backuser #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开(如果是匿名备份,可注释)
#secrets file = /etc/rsyncd.secrets #用户认证配置文件,里面保存用户名称和密码
comment = this is pgsql xlog arive #模块名称信息
#exclude = arch #同步时所保留archive_status目录或文件
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 #指定类型的文件不在压缩传输
[[email protected] ~]# mkdir /rsydata #创建备份目录
[[email protected] ~]# vim /etc/rsync.password #编辑用户认证配置文件
backuser:redhat #格式: 用户名:密码
[[email protected] ~]# chmod 600 /etc/rsync.password #一定要把用户认证配置文件的权限改成600
[[email protected] ~]# vi /etc/rsyncd.motd
------------welcome use rsyncd backup data----------
[[email protected] ~]# /usr/bin/rsync --daemon & #后台运行rsync服务
[[email protected] ~]# systemctl enable rsyncd.service #设置rsync服务开机自启
[[email protected] ~]# firewall-cmd --permanent --add-port=873/tcp #配置防火墙
[[email protected] ~]# firewall-cmd --reload
2、客户端配置
[[email protected] ~]# yum -y install rsync #安装rsync软件包。提供rsync客户端相关命令
[[email protected] test]# touch {1..9} #在测试目录创建测试文件/data/test
[[email protected] test]# ls
1 2 3 4 5 6 7 8 9
[[email protected] test]# rsync -azv /data/test/ 192.168.192.130::postgres #使用rsync客户端命令执行手动同步
------------welcome use rsyncd backup data---------- #服务端设置的欢迎语
sending incremental file list
./
1
2
3
4
5
6
7
8
9
sent 407 bytes received 182 bytes 1178.00 bytes/sec
total size is 0 speedup is 0.00
命令选项注释:
-a #归档模式备份,相当于-rlptgoD的组合
-v #在终端显示同步过程的详细信息
-z #压缩传输
/data/test #本地文件位置
192.168.192.130::postgres #rsync命令格式。服务器::模块名称
更多注释:
-r #递归模式,包含目录及子目录的所有文件
-l #对于符号链接文件仍复制为符号链接文件
-p #保留文件的权限标记
-t #保留文件的时间标记
-H #保留硬链接文件
-A #保留ACL属性信息
-D #保留设备文件及其他特殊文件
--delete #使备份服务器文件与本地文件保持一直
--checksum #根据校验和(而不是文件大小、修改时间)来决定是否跳过该文件
3、客户端配置inotify实时同步
[[email protected] ~]# yum -y install inotify-tools #安装inotify-tools,提供inotify相关命令 inotifywait、inotifywatch
编写inotify脚本:
[[email protected] ~]# vi inotify.sh
#!/bin/bash
/usr/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f%e‘ -e create /var/lib/pgsql/bac kups/ | while read file
do
DATE=`date +%Y%m%d%H%M%S`
event=$(echo $file | awk ‘{print $3}‘)
echo "------------$DATE-------------"
if [[ $event =~ ‘CREATE‘ ]] ; then
/usr/bin/rsync -avzP --progress /var/lib/pgsql/backups/ 192.168.192.134::postgres &>> /var/log/r sync/rsync-$DATE.log
fi
done
[[email protected] ~]# chmod +x inotify.sh #添加脚本的执行权限
[[email protected] ~]# sh inotify.sh & #让脚本在后台终端运行
[1] 2631
[[email protected] ~]# echo "/root/inotify.sh" >> /etc/rc.local #将脚本添加到开机执行的文件中
4、创建文件进行测试
[[email protected] test]# touch test{1..5} #创建测试文件
------------welcome use rsyncd backup data---------- #脚本自动在此终端输出内容
sending incremental file list
./
test1
test2
test3
test4
test5
sent 228 bytes received 8 bytes 472.00 bytes/sec
total size is 1088 speedup is 4.61
5、防止inotify异常运行,编写检测脚本
[[email protected] ~]# vi inotify_status.sh
#!/bin/bash
ps -ef | grep -w inotify.sh | grep -v $$
if [ $? -eq 0 ]
then
echo "inotify service is running"
else
/root/inotify.sh &
echo "inotify service is activing"
fi
[[email protected] ~]# crontab -e #编写计划任务,每分钟检测一遍服务的运行情况
*/1 * * * * /root/inotify_status.sh
四、附加选项
参数说明
语法:inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
-h,–help 输出帮助信息
@ 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-m, –monitor 接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
-d, –daemon 跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
-o, –outfile 输出事情到一个文件而不是标准输出。
-s, –syslog 输出错误信息到系统日志
-r, –recursive 递归监视,目录下的所有子目录。
-q, –quiet 指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude 正则匹配需要排除的文件,大小写敏感。
–excludei 正则匹配需要排除的文件,忽略大小写。
-t , –timeout 设置超时时间,如果为0,则无限期地执行下去。
-e , –event 指定监视的事件。
-c, –csv 输出csv格式。
–timefmt 指定时间格式,如(“%”后面的大小写代表不同的格式,如%y表示2位的年)
%Y-%M-%D 日期:2012-10-13
%H:%M:%S 时间:15:45:05
是否显示该参数指定的时间,取决于–format选项中是否指定了“%T”。
–format 指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分
%T 显示由–timefmt定义的时间格式
参数说明
语法: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 文件系统取消挂载,之后不再监听此文件系统。