Rsync远程同步及inotify自主监控
Rsync远程同步
概述
Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。并且可以不进行改变原有数据的属性信息,实现数据的备份迁移特性。Rsync软件适用于unix/linux/windows等多种操作系统平台。
Rsync是一个快速和非常通用的文件复制工具。它能本地复制,远程复制,或者远程守护进程方式复制。它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制。它以其delta-transfer算法闻名。
支持本地复制,或者与其他SSH、rsync主机同步。
rsync监听端口:873
rsync运行模式:C/S
备份
全量备份
所有数据全部传送
把原来的文件和新的文件一起统一传送
全量复制,效率低
假设客户端上有 file1 file2 file3 文件,服务端上有 file1 文件,现要将客户端上的数据备份至服务端
增量备份
在传输数据之前通过一些算法通过你有的数据和我有的数据进行对比,把不一样的数据通过网络传输
增量复制,效率较高
假设客户端上有 file1 file2 file3 文件,服务端上有 file1 文件,现要将客户端上的数据备份至服务端
应用场景
“推”
即由客户端推送数据至服务器,比如个人电脑上传数据至云盘。
“拉”
即由客户端拉取服务器上的数据,比如利用个人电脑下载云盘文件。
一些特性
能更新整个目录树和文件系统
有选择性的保持符号链链、硬链接、文件属性、权限、设备以及时间等
传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用
能用rsh、ssh 或直接端口做为传输端口
支持匿名rsync 同步文件,是理想的镜像工具
Rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时Rsync server会打开一个873端口,等待客户端去连接。
在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客机的rsync同步操作的服务器称为备份源。
配置Rsync远程同步
思路
修改rsyncd.conf配置文件、独立的密码文件
启用rsync的–daemon模式
示例
用户backuper,允许下行同步
操作的目录为/var/www/html
配置文件rsyncd.conf
语法类似于Samba配置
认证配置auth users、secrets file,不加则为匿名(nobody)
rsync账号文件
采用“用户名:密码”的记录格式,每行一个用户记录
独立的账号数据,不依赖于系统账号(安全)
如何启动和关闭rsync
启动rsync:rsync --daemon
关闭rsync:kill $(cat /var/run/rsyncd.pi
rsync命令的用法
rsync [选项] 原始位置 目标位置
常用选项
-a:归档模式,递归并保留对象属性,等同于-rlptgoD
-v:显示同步过程的详细信息
-z:在传输文件时进行压缩
-H:保留硬连接文件
-A:保留ACL属性信息
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据对象的校验和来决定是否跳过文件
环境
源地址 192.168.1.30
客户端地址 192.168.1.40
同步目录 /var/www/html
过程
rpm -qa rsync #确认rsync是否安装
vi /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes #禁锢家目录
address = 192.168.1.30 #提供同步服务的地址
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.1.0/24 #允许同步的网段
[wwwroot]
path = /var/www/html #同步的目录
comment = www.aa.com #描述信息
read only = yes #只读模式开启
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 #这些结尾的文件同步时不再压缩
auth users = backuper #指定来访用户
secrets file = /etc/rsyncd_users.db #用户密码存放在secrets file中
vi /etc/rsyncd_users.db #创建backuper用户的密码文件
backuper:123456
chmod 600 /etc/rsyncd_users.db #服务端的密码文件要600权限
启动服务查看状态
rsync --daemon #启动rsync守护进程
netstat -anpt | grep rsync
yum -y install httpd #安装apache
cd /var/www/html/
vi index.html
<h1>this is 111!</h1>
cd ..
chmod 777 html/ #给/var/www/html所有权限
客户端验证
常用选项:
-r:递归模式,包含目录及子目录中的所有文件
-l:对于符号链接文件仍然复制为符号链接文件
-v:显示同步过程的详细信息
-a:归档模式,保留文件的权限、属性等信息,等同于组合选项“-rlptgoD”
-z:在传输文件时进行压缩
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户使用)
-o:保留文件的属主标记(仅超级用户使用)
-H:保留硬连接文件
-A:保留ACL属性信息
-D:保留设备文件及其他特殊文件
方法一
yum -y install httpd
rsync -avz backuper@192.168.1.30::wwwroot /var/www/html
Password: #输入密码,不显示
方法二
rsync -avz rsync://backuper@192.168.1.30/wwwroot /opt
cd /opt
ll
免密方式同步文件
要先在客户端本地创建密码文件/etc/server.pass
vi /etc/server.pass
123456
mkdir /backup
cd /backup
chmod 600 /etc/server.pass
rsync -az --password-file=/etc/server.pass backuper@192.168.1.30::wwwroot /backup
ll
Rsync实时同步
原因
定期同步的不足
执行备份的时间固定,延迟明显,实时性差
当同步源长期不变化时,密集的定期任务是不必要的
实时同步的优点
一旦同步源出现变化,立即启动备份
只要同步源无变化,则不执行备份
关于inotify
Linux内核的inotify机制
从版本2.6.13开始提供
可以监控文件系统的变动情况,并做出通知响应
辅助软件: inotify-tools
调整inotify内核参数
max_queue_events:监控事件队列大小
max_user_instances:最多监控实例数
max user watches:每个实例最多监控文件数
安装inotify-tools辅助工具
inotifywait:用于持续监控,实时输出结果
inotifywatch:用于短期监控,任务完成后再出结果
inotify命令
#m:持续监听
#-r:使用递归形式监视目录
#-q:减少冗余信息,只打印出需要的信息
#-e指定要监视的事件,多个时间使用逗号隔开
Rsync+inotify实时同步
客户端调整inotify内核参数
vi /etc/sysctl.conf
fs.inotify.max_queued_events = 16384 #监控事件队列大小
fs.inotify.max_user_instances = 1024 #最多监控实例数
fs.inotify.max_user_watches = 1048576 #每个实例最多监控文件数
sysctl -p
源站修改配置文件
vi /etc/rsyncd.conf
read only = no
安装inotify-tools辅助工具
tar zxf inotify-tools-3.14.tar.gz -C /opt
cd /opt/inotify-tools-3.14/
./configure
make && make install
开启监控
inotifywait -mrq -e modify,create,move,delete /var/www/html
inotifywait:用于持续监控,实时输出结果
inotifywatch:用于短期监控,任务完成后再出结果
-m:持续进行监控
-r:递归监控所有子对象
-q:简化输出信息
-e:指定要监控哪些事件类型
modify:修改;create:创建;move:移动;delete:删除
再开一个客户端终端会话,测试监控
cd /var/www/html/
touch abc
rm -rf abc
可以看到记录
客户端上编写脚本,将inotify监控和rsync远程同步结合起来
vi inotify.sh
#!/bin/bash
INOTIFY="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html"
RSYNC="rsync -avz --delete --password-file=/etc/server.pass /var/www/html backuper@192.168.1.30::wwwroot/" #本地路径在前为源与本地同步
$INOTIFY | while read DIRECTORY EVENT FILE #逐条读取监控记录
do
if [ $(pgrep rsync | wc -l) -le 0 ];then
$RSYNC
fi
done
同步两边目录权限都为777
chmod 777 /var/www/html
ls -lh /var/www #同步源,发起端
运行脚本,在客户端/var/www/html目录下创建文件,查看源端/var/www/html目录是否同步到
客户端
sh inotify.sh
cd /var/www/html/
echo '<h1>this is 222</h1>' > index.html
客户端监控:
源站
cd /var/www/html/
ll
cd html/
ll
cat index.html