共计 5735 个字符,预计需要花费 15 分钟才能阅读完成。
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 开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动 / 重命名、删除、创建或者改变属性。
实验
拓扑
服务器端(数据接收方)的配置
[root@backupserver ~]# vim /etc/sysconfig/selinux #关闭 selinux
SELINUX=disabled
[root@backupserver ~]#reboot #重启
[root@backupserver ~]# yum -y install rsync #安装 rsync, 默认情况下已经安装
[root@backupserver ~]# vim /etc/rsyncd.conf #编辑 rsync 配置文件
log file = /var/log/rsyncd.log #日志文件位置,启动 rsync 后自动产生这个文件,无需提前创建
pid file = /var/run/rsyncd.pid #pid 文件的存放位置
lock file = /var/run/rsync.lock #支持 max connections 参数的锁文件
secrets file = /etc/rsync.password #用户认证配置文件,里面保存用户名称和密码
motd file = /etc/rsyncd.motd #启动时欢迎信息页面文件位置(文件内容自定义)
[web_log] #定义模板,自定义名称
path = /rsydata/ #rsync 服务端数据目录路径, 自定义
comment = web_log #模块名称与 [web_log] 自定义名称相同
uid = root #设置 rsync 运行权限为 root
gid = root #设置 rsync 运行权限为 root
port=873 #默认端口
use chroot = false #默认为 true,修改为 false,增加对目录文件软连接的备份
read only = false #设置 rsync 服务端文件为只读权限
list = false #不显示 rsync 服务端资源列表
max connections = 200 #最大连接数
timeout = 600 #设置超时时间
auth users = backuser #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = ip 地址 #允许进行数据同步的客户端 IP 地址,可以设置多个,用英文状态下逗号隔开
hosts deny = IP 地址 #禁止数据同步的客户端 IP 地址,可以设置多个
[root@backupserver ~]# mkdir /rsydata #创建备份目录
[root@backupserver ~]# vim /etc/rsync.password #编辑用户认证配置文件
backuser:RedHat
root@backupserver ~]# chmod 600 /etc/rsync.password #一定要把用户认证配置文件的权限改成 600
[root@backupserver ~]# /usr/bin/rsync –daemon & #后台运行 rsync 服务
[1] 3392
[root@backupserver ~]# systemctl enable rsyncd.service #设置 rsync 服务开机自启
[root@backupserver ~]# firewall-cmd –permanent –add-port=873/tcp #配置防火墙
[root@backupserver ~]# firewall-cmd –reload
客户端(数据发送方)的配置
[root@backupclient ~]# yum -y install rsync #安装 rsync, 默认情况下已经安装
[root@backupclient ~]# vim /etc/rsync.password #编辑认证文件,只保存密码
redhat
[root@backupclient ~]# chmod 600 /etc/rsync.password #一定要把认证文件权限修改成 600
[root@backupclient~]#wget
http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz #下载 inotify 源码包
[root@backupclient ~]# tar -xzvf inotify-tools-3.14.tar.gz -C /usr/local/ #解压到 /usr/logcal 目录
[root@backupclient ~]# mkdir /usr/local/inotify #创建安装目录
[root@backupclient ~]# cd /usr/local/inotify-tools-3.14/
[root@backupclient inotify-tools-3.14]# ./configure –prefix=/usr/local/inotify #指定安装目录为 /usr/local/inotify
[root@backupclient inotify-tools-3.14]# make &&make install #编译安装
[root@backupclient ~]# systemctl restart rsyncd
[root@backupclient ~]# systemctl enable rsyncd
验证
[root@backupclient ~]# mkdir /tmp/test
[root@backupclient ~]# cd /tmp/test
[root@backupclient test]# touch a{1..9}
[root@backupclient test]# ls
a1 a2 a3 a4 a5 a6 a7 a8 a9
[root@backupclient~]#rsync -vzrtopg –progress /tmp/test/ backuser@192.168.23.134::web_log –password-file=/etc/rsync.password# 把客户端 /tmp/test 目录下的文件同步到服务器端的 /rsydata 目录下
[root@backupserver ~]# cd /rsydata/
[root@backupserver rsydata]# ls
a1 a2 a3 a4 a5 a6 a7 a8 a9 #数据已经同步
写一个脚本实现当客户端 /tmp/test/ 下的文件有变化时,把此目录下的数据自动同步到服务器端的 /rsydata 下
[root@backupclient ~]# vim inotify.sh
#!/bin/bash
/usr/local/inotify/bin/inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f’ -e modify,delete,create,attrib /tmp/test | while read file
do
/usr/bin/rsync -vzrtopg –delete /tmp/test/ backuser@192.168.23.134::web_log –password-file=/etc/rsync.password
echo “${files} was rsynced” >> /var/log/rsync.log 2>&1
done
[root@backupclient ~]# chmod +x inotify.sh
[root@backupclient ~]# sh inotify.sh & #后台运行脚本
[1] 15435
[root@backupclient ~]# jobs #查看后台作业
[1]+ Running sh inotify.sh &
[root@backupclient ~]# echo “/root/inotify.sh” >> /etc/rc.local #把脚本写到开机自启动文件里面
为了防止 inotify 服务由于意外情况停止服务,编写监控 inotify 进程的脚本
[root@backupclient ~]# vim /root/inotify_status.sh
#!/bin/bash
ps -elf | grep inotify &> /dev/null
if [-z $?]
then
echo “inotify service is running”
else
/root/inotify.sh &
echo “inotify service is activing”
fi
[root@backupclient ~]# chmod +x /root/inotify_status.sh
[root@backupclient ~]# crontab -e #编写一个计划任务,每时每刻执行这个脚本
* * * * * /root/inotify_status.sh & > /dev/null
附:
参数说明
语法: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 文件系统取消挂载,之后不再监听此文件系统。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/141996.htm