一、rsync+inotify-tools与rsync+sersync架构解析
####用rsync+sersync架构原因?
1、sersync是基于inotify开发的,类似于inotify-tools的工具
2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录
####rsync+inotify-tools与rsync+sersync架构的区别?
1、rsync+inotify-tools
a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低
2、rsync+sersync
a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;
b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。
同步过程:
1. 在同步服务器上开启sersync服务,sersync负责监控配置路径中的文件系统事件变化;
2. 调用rsync命令把更新的文件同步到目标服务器;
3. 需要在主服务器配置sersync,在同步目标服务器配置rsync server(注意:是rsync服务)
同步过程和原理:
1. 用户实时的往sersync服务器上写入更新文件数据;
2. 此时需要在同步主服务器上配置sersync服务;
3. 在另一台服务器开启rsync守护进程服务,以同步拉取来自sersync服务器上的数据;
通过rsync的守护进程服务后可以发现,实际上sersync就是监控本地的数据写入或更新事件;然后,在调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器
本次配置参考服务器为:源服务器A 192.168.100.150 备份同步服务器B 192.168.100.151 均匀设置免密登陆用户均为root
服务器A 免密通过ssh的秘钥对方式认证登陆 服务器B,免密配置参考如下:
.ssh的密钥对方式验证登录:
a.密钥对必须在客户端上生成,拷贝公钥到服务端对应的目录下。注:客户端用户必须要有私钥,服务端用户必须要有公钥;
b.服务器A-150配置如下命令:
ssh-keygen -t rsa ##客户端创建密钥对,一路回车,密钥对存放在~/.ssh目录中,id_rsa为私钥、 id_rsa.pub为公钥;
ssh-copy-id root@192.168.100.151 ##上传公钥到目标主机中,切导入到目标主机的用户家目录中,~/.ssh/authorized_keys文件中,如若上传失败,使用scp进行拷贝并导入: scp .ssh/id_rsa.pub 用户@目标主机ip地址;
ssh root@192.168.100.151 ##验证不需要密码可直接进行登陆
注:同一台客户端实现无密码登陆服务器的多个用户时,只需将公钥上传至服务端的多个用户的家目录下即可;
分别在服务器A和服务器B的terminal执行:yum
install
rsync -y
二、Rsync本地、远程同步
1.rsync的角色:
发起端:使用rsync的主机就是发起端;
备份源:响应发起端的主机就是备份源;
2.rsync同步方向:
上行同步:上传,数据在发起端,备份源提供目录,远程用户必须对备份源目录拥有写入权限,发起端登陆的用户必须要对数据拥有读取权限;
下行同步:下载,数据在备份源上,发起端提供目录,发起端登陆的用户必须对目录拥有写入权限,远程用户必须对备份源的数据有读取权限;
3.语法:rsync 选项 原始位置 目标位置
常用选项:-a 归档模式、保留文件权限、时间、链接、归属、特殊文件
-v 输出详细信息
-z 压缩传输
-H 保持硬链接
-r 递归模式,递归子文件及子文件夹
--delete 删除目标目录有,原始位置没有的文件
常用选项组合:-av -avzH --delete
4.本地同步复制文件语法:rsync -av /源文件 /目标目录/
注:当源文件为例/tmp时,那么将复制tmp整个目录及目录下的文件;
当源文件为例/tmp/时,那么将复制tmp目录下的所有文件,不包含tmp目录本身;
可同时复制多个文件,中间用空格隔开;
示例:
rsync -av /etc /data #同步etc下所有文件到 /data目录下(包括etc目录本身)
rsync -av /etc/ /data #同步etc下所有文件到 /data目录下(不包括etc目录本身)
5.清空本地目录语法:rsync -av --delete /空目录/ /目标目录/
注:删除目标目录有,空目录中没有的目标目录中的文件,空目录可以自己创建,则此就达到了删除的目的;
6.远程同步复制文件语法:
上行同步(上传):rsync -avzH 本地数据 用户@备份源ip地址:备份目录
示例:rsync -avzH /etc root@192.168.100.151:/data/ ## #root用户免密登陆92.168.100.151服务器B同时同步当前etc下所有文件到 /data目录下(包括etc目录本身)
示例:如果有端口 rsync -e 'ssh -p 2222' -avzH /etc root@192.168.100.151:/data/ ###root用户通过端口2222免密登陆92.168.100.151服务器B同时同步当前etc下所有文件到 /data目录下(包括etc目录本身)
下行同步(下载):rsync -avzH 用户@备份源ip地址:备份目录 本地备份目录
示例:rsync -avzH root@192.168.100.151:/data/ /etc/ ## #root用户免密登陆92.168.100.151服务器B同时/data目录下所有文件到 本机/etc目录下
三、Rsync+inotify实时同步
Rsync仅是一个文件复制工具,它无法对源端文件的增删改操作进行监听。在源端做出更改后,需要执行rsync命令才能将变更同步到目标端。
Rsync在每次同步前需要扫描整个目录。如果源目录内的文件数量比较多,扫描可能需要耗费较多的时间。
为了满足实时监听的要求,我们需要引入另一个工具:inotify。
文件系统事件监听工具inotify
inotify-tools为inotify提供一个简单接口。它是一个c语言编写的库,同时也包含命令行工具。
inotify-tools的详细介绍请点击: https://github.com/rvoicilas/inotify-tools/wiki
inotify-tools的安装
对于centos7系统,依次执行:
1 2 |
yum install -y epel-release
yum --enablerepo=epel install inotify-tools
|
使用inotifywait命令进行事件监听
1.inotify作用:内核模块,监控文件和目录的变化,通过inotify-tools工具提供inotify-wait(持续监控)和inotify-watch(短期监控)两个模块进行监控;
2.优化内核参数:
max_queued_events ##最大的时间列队
max_user_instances ##最大的实例
max_user_watchs ##最大的监控文件数量
注:实时同步是基于监控文件的,所以需要在文件所在端,并且rsync只能在发起端发出;
总结:实时同步只能处理上行,不能实现下行;
3.inotify+rsync实时同步案例:上行同步
a.安装inotify-tools;发起端192.168.100.150
tar zxvf inotify-tools-*.tar.gz -C /usr/src/
cd /usr/src/inotify-tools-*/
./configure &&make &&make install
ls /usr/local/bin/inotify*
b.inotify的使用:发起端192.168.100.150
vi /etc/sysctl.conf
fs.inotify.max_queued_events = 16384 ##监控事件队列数
fs.inotify.max_user_instances = 1024 ##监控实例数
fs.inotify.max_user_watches = 1048576 ##监控的文件数量
:wq
sysctl -p
c.测试inotify命令;发起端192.168.100.150
mkdir /root/data
inotifywait -mrq -e modify,create,attrib,move,delete /root/data
选项注解:-m持续监控,r递归目录,q简化输出,-e指定监控事件:modify修改、create创建、attrib权限修改、move移动、delete删除;在其他终端操作文件,查看变化
参数解析
- -m 保持持续监听状态,如果不写该参数,inotifywait会在监听到一次事件之后退出。
- -r 递归方式监听目录。
- -q 安静模式,打印输出较少的内容。
- --timefmt 指定时间的输出格式。
- --format 指定事件输出的格式。
- -e 设置监听的事件类型。这里监听增删改和metadata的变更。
d.编写监听脚本1如下(inotifywait-rsync.sh):
1 2 3 4 5 6 |
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' -- format '%T %w%f' -e modify,delete,create,attrib /root/data/rsync/ | while read file
do
rsync -avPz --progress /root/data/rsync/ root@192.168.100.151:/root/data/rsync/
rsync -avPz --delete /root/data/rsync/ root@192.168.100.151:/root/data/rsync/
echo "${file} was synchronized"
done
|
编写脚本2:发起端192.168.100.150
vim rsync_inotify.sh ##实时同步脚本
#!/bin/bash
RSYNC="rsync -avzH /root/data/ root@192.168.100.151:/tmp/ --delete"
INT_CMD="inotifywait -mrq -e modify,create,move,delete,attrib /root/data/"
$INT_CMD |while read DIRECOTRY EVENT FILE;do
$RSYNC
done
:wq
chmod +x rsync_inotify.sh
./rsync_inotify.sh & ##启动脚本后台运行
对于每次触发的监听时间,inotifywait会执行do和done之间的代码。在这里,我们调用之前所说的rsync命令进行文件同步。
e.监听脚本加入crontab
1 2 |
crontab -e
* * * * * sh /root/data/ inotifywait-rsync .sh
|
f.测试验证,发起端创建测试文件。发起端192.168.100.150
cd /root/data
touch 1.txt
g.备份源验证文件是否同步;备份端192.168.100.151
ls /tmp/
在服务器A运行下面命令详解:
1 2 3 4 |
# (1)
rsync -avPz --progress /root/data/rsync/ root@192.168.100.151:/root/data/rsync/
# (2)
rsync -avPz --delete --progress /root/data/rsync/ root@192.168.100.151:/root/data/rsync/
|
会发现在demo.txt也出现在了服务器B中/root/data/rsync/目录。
上面两条命令解析:
(1) 将服务器A中的/root/data/rsync目录内的文件复制到服务器B(192.168.100.151)的/root/data/rsync中。
(2) 比较目标端和源端的文件,如果目标端的文件在源端不存在,在目标端删除该文件。
四、Rsync+sersync实时同步