📖 介绍

rsync优势

rsync具有可 使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似ssh 带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷 贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类 似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。

rsync缺点

rsync 在同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。

其次,rsync 不能实时的去监测、同步数据,虽然它可以通过 linux 守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。

基于以上两种情况,可以使用rsync+inotify的组合来解决,可以实现数据的实时同步。

inotify 是一种强大的、细粒度的、异步的文件系统事件控制机制。linux 内核从 2.6.13 起,加入了 inotify 支持。通过 inotify 可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施监控的软件。在使用 rsync 首次全量同步后,结合 inotify 对源目录进行实时监控,只要有文件变动或新文件产生,就会立刻同步到目标目录下,非常高效实用。

本次实现目的

服务器IP 用途 机器类型
10.77.77.161(Master) 同步/data/project/下数据目录到slave节点,只同步不做删除操作 Centos7
10.77.77.253(Slave) 线上环境发Jenkins布服务器 Centos7

由于公司Jenkins使用Maven打包的时候都是在测试环境下先进行打包,线上环境不做打包操作,每次发布需要先在测试环境下发布测试,确认发布正常以后在把测试环境的jar包拷贝到线上服务器,非常麻烦

所以使用rsync+inotify 进行实时同步,而且对远程服务器只有创建动作没有删除动作

🧰 部署

rsync部署

Master 161节点操作(安装rsync和inotify)

安装rsync

1
2
3
4
5
6
7
8
9

# rsync的默认端口是 `873` ,由于我是内网设置的比较简单,rsync支持防火墙操作,由于要可以根据需求添加
$yum -y install rsync lsyncd && systemctl enable --now rsyncd.service && systemctl status rsyncd.service

$ egrep -v "^$|#" /etc/rsyncd.conf
[jenkins] # 模块,可以配置多个
path=/data/project/ # 模块的根目录,同步目录,要注意权限
log file=/var/log/rsync.log # 指定日志文件
read only = false # 关闭只写,或者修改为no

安装inotify

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
可以直接yum安装,不过可能版本比较老,我这里使用的二进制安装 ,yum安装方式`yum install -y inotify-tools`
$ cd /usr/local/src
`百度网盘下载我的inotify包,或者自己github下载`
链接:https://pan.baidu.com/s/1O0jqdiTmQaOffbIuCPlkjg
提取码:6666
$ cd inotify-tools-3.14/ && ./configure --prefix=/usr/local/inotify
$ make && make install


## 编写自动推送脚本 ,备份服务器配置文件写好以后就可以测试是否可以推送
$ cat /data/script/rsync.sh
#!/bin/bash
host=10.77.77.253
src=/data/project/
des=jenkins
password=/etc/rsyncd/rsync.password
user=root
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
do
/usr/bin/rsync -vzrtopg --delete --progress /data/project/ root@10.77.77.253::jenkins
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done




# 实现只推送不删除目标服务器的文件
删除脚本中 --delete 参数 /usr/bin/rsync -vzrtopg --progress /data/project/ root@10.77.77.253::jenkins

# 最后脚本放在后台执行即可,然后zabbix可以进行监控脚本进程,如果进程不在就进行zabbix告警,这个就不写了,脚本日志可以在定义的日志目录里面看到所有操作
$ nohub bash /data/script/rsync.sh &

Slave 253节点操作 安装rsync

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ yum -y install rsync lsyncd && systemctl enable --now rsyncd.service && systemctl status rsyncd.service
$ egrep -v "^$|#" /etc/rsyncd.conf
uid = nobody # rsync 守护进程的用户
gid = nobody # 运行 rsync 守护进程的组
use chroot = yes #允许 chroot,提升安全性,客户端连接模块,首先 chroot 到模块 path 参数指定的目录下,chroot 为 yes 时必须使用 root 权限,且不能备份 path 路径外的链接文件
max connections = 10 # 允许的客户端最大连接数
ignore nonreadable = yes # 设置不需要压缩的文件
read only = no # 取消只读
list = false # 是否允许列出模块内容
[jenkins]
path=/data/project/
uid = root
gid = root

- 测试rsync是否可以连接到rsync服务,-a 获取同步目录标签,出现Jenkins代表已经获取
$ rsync -a root@10.77.77.161::
jenkins

- 测试下载文件到本地,当然也可以结合crontab下载代码到本地
$ rsync -av root@10.77.77.161::jenkins /data/project/