参考链接: zhuanlan.zhihu.com/p/488029990
一、简介
rsync(remote synchronize)是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。
Linux 之间同步文件一般有两种方式,分别是 rsync 与 scp 。scp 相当于复制,粘贴,文件不存在则新建,若存在则覆盖,而 rsync 则是比较两边文件是否相同,不相同才进行更新。所以 rsync 和 scp 在文件夹存在的情况下差异很大,因为 scp 是复制和覆盖,从执行性能来说 rsync 更胜一筹。而且 rsync 能将文件夹、文件的权限等信息也保存下来。
但是 rsync 也有一定的缺点,在同步数据时,需要扫描所有文件后进行比对,如果文件数量相当大时,扫描文件就非常耗费时间和性能。其次,rsync 不能够实时监测、同步数据,这就可能导致一些时间段数据不一致。解决这个问题的方法就是实时同步,所以需要使用 rsync+inotify 组合。
inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux 内核从2.6.13版本起,加入了对 inotify 的支持。通过 inotify 可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,inotify-tools 便可以监控文件系统下文件的各种变化情况了。
二、查看机器是否支持
- 查看机器是否安装了rsync
rsync --help
- 查看机器是否支持inotify
ll /proc/sys/fs/inotify
如果出现以下3个文件, 说明支持
-rw-r--r-- 1 root root 0 2月 22 15:45 max_queued_events
-rw-r--r-- 1 root root 0 2月 22 15:45 max_user_instances
-rw-r--r-- 1 root root 0 2月 22 15:45 max_user_watches
三、整体架构
四、同步节点部署
-
配置rsync , 先修改配置文件, 在etc 目录下有一个rsyncd.conf 的文件
vim /etc/rsyncd.conf
-
修改内容如下
uid = root
gid = root
use chroot = yes
max connections = 10
strict mode=yes
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[backup] # 这个是模块的名称
path = /hdd/pictures/ # 这里的文件夹一定要和那个节点保持一致
comment = backup image
ignore errrors
read only=no
write only=no
hosts allow=192.168.2.18 # 这个是配置允许进行文件同步的ip
hosts deny=*
list=false
uid=root
gid=root
auth users=root
secrets file=/etc/rsync.password # 这个文件里面存储的是当其他端传递文件时的验证用户和密码
其中需要用到一个密码文件,也就是上面配置的 secrets file 的值 /etc/rsync.password,在 rsync3.1.3 版本中默认没有密码文件,需要手动创建,内容格式为:user:password,user 就是上面配置的 yxc,password 就是密码,如下所示。
echo "root:123456" > /etc/rsync.password
- 然后需要给密码文件600权限
chmod 600 /etc/rsync.password
- 启动 rsync 守护进程
/usr/local/bin/rsync --daemon
- 启动之后可查看 rsync 进程,如下
ps -ef | grep rsync
如有需要可加入系统自启动文件
echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local
- rsync 默认端口为873,所以开放873端口
firewall-cmd --add-port=873/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
五、源节点部署
源服务器节点,也就是 node1 192.168.157.129,需要部署 rsync 和 inotify。
1、安装rsync
rsync 安装方式和上面相同,就不详细讲解了。
解压
tar zxvf rsync-3.1.3.tar.gz
cd rsync-3.1.3/
配置
./configure
编译及安装
make && make install
2、配置rsync
源服务器节点中只需要配置认证密码文件,首先在 etc 文件夹下创建文件 rsync.password,只需要密码,不需要用户,密码需要和同步节点 node2 中的一致,我这里也就是123456。
vim /etc/rsync.password
修改密码文件权限
需要给密码文件600权限
chmod 600 /etc/rsync.password
启动 rsync 守护进程
/usr/local/bin/rsync --daemon
如有需要可加入系统自启动文件
echo "/usr/bin/rsync --daemon" >> /etc/rc.local
同样开放873端口,如下所示
firewall-cmd --add-port=873/tcp --permanent --zone=public
重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
3、手动同步测试
先在源服务器节点的 /root/data/backuptest/ 目录下新建一个 test 文件夹
mkdir /hdd/pictures/test
然后使用如下命令进行同步测试,其中一些参数要和同步节点配置文件中相对应,比如下面的认证模块名 backup、用户名 yxc 等
rsync -avH --port 873 --delete /hdd/pictures/ root@192.168.157.130::backup --password-file=/etc/rsync.password
可以看到 node1 中文件夹 test 已经发送,查看同步节点 node2 中,如下
test 文件夹已经同步到 node2,所以我们的 rsync 配置成功,可以进行文件同步,接下来就是部署 inotify 实现实时同步,通过inotify监听文件或文件夹,如果有变动就进行同步。
(1)下载安装
inofity-tools下载地址:github.com/downloads/r…
inotify-tools 的详细介绍可以看:github.com/rvoicilas/i…
下载完成后,进行解压安装,如下
解压
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14/
配置
./configure
编译及安装
make && make install
(2)创建rsync同步的shell脚本
安装完成之后需要创建用于 rsync 同步的 shell 脚本,如果添加、修改、删除了文件或文件夹,inotify 可以监控到,然后通过 rsync 进行同步,这里我们就在需要进行监控的目录创建这个脚本
#!/bin/bash
host1=192.168.2.32
src=/hdd/pictures/
dst1=backup
user1=root
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src \
| while read files
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user1@$host1::$dst1 > /dev/null 2>&1
echo "${files} was rsynced." >> /tmp/rsync.log 2>&1
done
其中 host 是 client 的 ip,src 是 server 端要实时监控的目录,des 是认证的模块名,需要与 client 一致,user 是建立密码文件里的认证用户。
然后给这个脚本赋予权限
chmod 755 /root/data/backuptest/inotifyrsync.sh
后台运行这个脚本
/root/data/backuptest/inotifyrsync.sh &
有需要可以将脚本加入系统自启动文件中
echo "/root/data/backuptest/inotifyrsync.sh &" >> /etc/rc.local
七、 遇到的问题
- rsync遇到的问题
- inotify 遇到的问题
/usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory
解决方法:
[root@db zzh]# ll /proc/sys/fs/inotify (如果有下列三项则支持inotifytools)
total 0
-rw-r--r-- 1 root root 0 Sep 20 16:52 max_queued_events
-rw-r--r-- 1 root root 0 Sep 20 16:52 max_user_instances
-rw-r--r-- 1 root root 0 Sep 20 16:52 max_user_watches
解决:
ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0
八、自启动部署
使用了一些手段后发现不能在机器重启后进行部署, 所以进行了定时任务部署
定时任务脚本
ProcNumber=`ps -ef | grep "/usr/bin/rsync --daemon" | grep -v grep | wc -l`
if [ $ProcNumber -le 1 ];then
for((i=$ProcNumber; i<1; i++))
do
/usr/bin/rsync --daemon
done
fi
fi