一、前言


在分布式系统中通常要用到文件同步功能,一是为了备份,另一个原因则是用于代码的一致性。
(一)rsync
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
(二)inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加 入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利 用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这 样的一个第三方软件。

二、rsync安装及配置

(一)备份服务器【172.26.1.189】

(需要备份的文件将同步到此服务器上,即从该主服务器上同步过来进行备份)
1.安装rsync (ubuntu 18是默认安装的,检查/etc/default/rsync是否存在,不存在在安装)
sudo apt-get install rsync

2.修改 /etc/default/rsync
sudo vim /etc/default/rsync

可以看到对于服务的默认配置,修改以下配置
RSYNC_ENABLE=true
3.为了方便管理,添加rsync 文件同步的账户目录(目录可以自定义,没有规定)
sudo mkdir -p /etc/rsync/

4.建立同步时的密码文件rsyncd.secrets,并设置为600权限(必须),在里面放用户名和密码
复制下面语句在shell命令行执行:
cat > /etc/rsync/rsyncd.secrets << EOF
#/etc/rsync/rsyncd.secrets
qif:qif123.,
EOF

设置权限(必须的)
chmod 600 /etc/rsync/rsyncd.secrets
修改配置文件/etc/rsync/rsyncd.conf
cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/

sample rsyncd.conf configuration file
# GLOBAL OPTIONS
#motd file=/etc/motd
log file=/var/log/rsyncd
fake super = yes
# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
# The init.d script does its own pid file handling,
# so omit the “pid file” line completely in that case.
pid file=/var/run/rsyncd.pid
#syslog facility=daemon
#socket options=

MODULE OPTIONS

[qif]

comment = public archive
path = /usr/local/ftp/root
use chroot = yes
# max connections=10
lock file = /var/lock/rsyncd
# the default for read only is yes…
read only = no
list = yes
uid = ftpuser
gid = ftpuser
# exclude =
# exclude from =
# include =
# include from =
auth users = qif
secrets file = /etc/rsync/rsyncd.secrets
strict modes = yes
hosts allow = 172.26.1.77
# hosts deny =
ignore errors = no
ignore nonreadable = yes
transfer logging = yes
# log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
timeout = 600
refuse options = checksum dry-run
dont compress = .gz .tgz .zip .z .rpm .deb .iso .bz2 *.tbz

示例文件:
image.png

5.启动服务
/etc/init.d/rsync restart
/etc/init.d/rsync status

(二)主服务器【172.26.1.77】

(重要文件的原文件在此服务器上。将同步到172.26.1.189服务器上,进行备份)
1.安装rsync
sudo apt-get install rsync

2.修改 /etc/default/rsync
sudo vim /etc/default/rsync

可以看到对于服务的默认配置,修改以下配置
RSYNC_ENABLE=true

3.为了方便管理,添加rsync 文件同步的密码目录(目录可以自定义,没有规定)
sudo mkdir -p /etc/rsync/

4.建立密码文件rsyncd.secrets,并设置为600权限(必须),在里面只放密码
复制下面语句在shell命令行执行:
cat > /etc/rsync/rsyncd.secrets << EOF
qif123.,
EOF

设置权限(必须要这样设定)
chmod 600 /etc/rsync/rsyncd.secrets

5.验证主从连接状态(在172.26.1.77上运行)
rsync -vzrtopg —progress qif@172.26.1.189::qif —password-file=/etc/rsync/rsyncd.secrets
6.测试拉取的同步效果 (方向从主用172.26.1.77到备用172.26.1.189)主推向备
在172.26.1.77服务器上,执行同步语句
rsync -avzP —progress /usr/local/qif/synctest —password-file=/etc/rsync/rsyncd.secrets qif@172.26.1.189::qif

7.测试拉取的同步效果 (方向从备用172.26.1.189到备用172.26.1.77)主拉取备
在172.26.1.77服务器上,执行同步语句
rsync -avzPt —password-file=/etc/rsync/rsyncd.secrets qif@172.26.1.189::qif /usr/local/ftp/root

三、rsync+inotify实时同步配置

(一)安装inotify

inotify将安装在主服务器【172.26.1.77】上。之后与rsync配合一起使用
1.查看是否安装inotify
ls /proc/sys/fs/inotify
如果能看到max_queued_events max_user_instances max_user_watches,三个值的话说明已经安装了

2.安装inotify
apt-get update
apt-get install inotify-tools

安装完成后,inotifywait默认路径为
/usr/bin/inotifywait
3.其他

(二)创建rsync复制脚本

脚本放到/etc/rsync下面 脚本如下。修改其中配置
image.png
1.修改脚本权限:
chmod +x /etc/rsync/rsync.init.sh
2. 执行脚本
sh /etc/rsync/rsync.init.sh &

(三)设置/etc/rsync/rsync.init.sh随服务器自动启动

编辑/etc/rc.local文件,在 exit0 的前面一行,加入如下语句
/bin/bash /etc/rsync/rsync.init.sh > /dev/null 2>&1 &
特别申明:
/etc/rc.local 文件在ubuntu18系统里,默认是没有的。!!!
随机启动的功能是需要自己手动设置才会有的,方法如下:
复制如下五句,每一句单独在shell命令行执行:
1.创建软连接
ln -sf /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

添加一句命令行
cat >>/etc/systemd/system/rc-local.service<[Install]
WantedBy=multi-user.target
Alias=rc-local.service
EOF
2.创建rc.local文件并 赋权
touch /etc/rc.local && chmod 755 /etc/rc.local

3.导入必要的语句
cat >>/etc/rc.local<#!/bin/bash
/bin/bash /etc/rsync/rsync.init.sh > /dev/null 2>&1 &
exit 0
EOF

4.重新加载服务:q
systemctl daemon-reload

四、rsync命令说明

(一)rsync 选项说明和示例
-v:显示rsync过程中详细信息。可以使用”-vvvv”获取更详细信息。
-P:显示文件传输的进度信息。(实际上”-P”=”–partial —progress”,其中的”–progress”才 是显示进度信息的)。
-n —dry-run :仅测试传输,而不实际传输。常和”-vvvv”配合使用来查看rsync是如何工作的。
-a —archive :归档模式,表示递归传输并保持文件属性。等同于”-rtopgDl”。
-r —recursive:递归到目录中去。
-t —times:保持mtime属性。强烈建议任何时候都加上”-t”,否则目标文件mtime会设置为系 统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o —owner:保持owner属性(属主)。
-g —group:保持group属性(属组)。
-p —perms:保持perms属性(权限,不包括特殊权限)。
-D :是”–device —specials”选项的组合,即也拷贝设备文件和特殊文件。
-l —links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R —relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送 给服务端,包括它们的属性。用法见下文示例。
–size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u —update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判 断的,不会影响删除行为。
-d —dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为”dir1/file1”,则不会拷贝 dir1目录,使用该选项将拷贝dir1但不拷贝file1。
–max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如: “–max-size=1.5m”)
–min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
–exclude :指定排除规则来排除不需要传输的文件。
–delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意”–delete”是在接收端 执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b —backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用”~“做后缀。
–backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
–port :连接daemon时使用的端口号,默认为873端口。
–password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是 远程shell认证的密码,而是rsync模块认证的密码。
-W —whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该 选项比增量传输更高效。
–existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相 对路径时如果上层目录不存在也不会传输。
–ignore-existing:要求只更新目标端不存在的文件。和”–existing”结合使用有特殊功能, 见下文示例。
–remove-source-files:要求删除源端已经成功传输的文件。
rsync的选项非常多,能够实现非常具有弹性的功能,以上选项仅仅只是很小一部分常用的选项, 关于更完整更详细的选项说明,见我的rsync man手册翻译。

虽然选项非常多,但最常用的选项组合是”avz”,即压缩和显示部分信息,并以归档模式传输。