📖 介绍
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
|
$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
|
安装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
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
$ 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 gid = nobody use chroot = yes 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/
|