Rsync与Inotify监控与同步
一、Rsync远程同步
1、概述
1.1 介绍
Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快;Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试;此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具
1.2 原理
rsync 是一个常用的 Linux 应用程序,用于文件同步,是用于替代rcp的一个工具,目前由rsync.samba.org
维护,所以rsync.conf
文件的格式类似于samba的主配 置文件;它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp
和mv
命令。它名称里面的r
指的是 remote,rsync 其实就是"远程同步"(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
Rsync可以通过rsh或ssh使用,也能以daemon模式去运行 ,在以daemon方式运行时Rsync server会打开一个873 端口,等待客户端去连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。
1.3 特点
- 可以镜像保存整个目录树和文件系统;
- 可以很容易做到保持原来文件的权限、时间、软硬链接等;
- 无须特殊权限即可安装;
- 优化的流程,文件传输效率高;
- 可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接;
- 支持匿名传输
1.4 安装
1 | # 注意该软件传输的两台机器都需要安装 |
Rsync有两种模式:
- SSH模式:包括本地模式(类似于cp命令)远程模式(类似于scp命令)
- daemon模式:守护进程(socket进程:是rsync的重要功能)
2、Rsync基本用法
2.1 基本参数
1 | # -r 参数 |
2.2 远程同步
首先介绍SSH协议
1 | # rsync 除了支持本地两个目录之间的同步,也支持远程同步。它可以将本地内容,同步到远程服务器 |
rsync 协议
1 | # 除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用rsync://协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔:: |
2.3 增量备份
rsync 的最大特点就是它可以完成增量备份,也就是默认只复制有变动的文件。除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。
具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。
1 | # --link-dest参数用来指定同步时的基准目录 |
2.4 其他配置项
-a
、--archive
参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去--append
参数指定文件接着上次中断的地方,继续传输--append-verify
参数跟--append
参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件-b
、--backup
参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix
参数指定的文件后缀名,默认是~
--backup-dir
参数指定文件备份时存放的目录,比如--backup-dir=/path/to/backups
--bwlimit
参数指定带宽限制,默认单位是 KB/s,比如--bwlimit=100
-c
、--checksum
参数改变rsync
的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输--delete
参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像-e
参数指定使用 SSH 协议传输数据--exclude
参数指定排除不进行同步的文件,比如--exclude="*.iso"
--exclude-from
参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行--existing
、--ignore-non-existing
参数表示不同步目标目录中不存在的文件和目录-h
参数表示以人类可读的格式输出-h
、--help
参数返回帮助信息-i
参数表示输出源目录与目标目录之间文件差异的详细情况--ignore-existing
参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件--include
参数指定同步时要包括的文件,一般与--exclude
结合使用--link-dest
参数指定增量备份的基准目录-m
参数指定不同步空目录--max-size
参数设置传输的最大文件的大小限制,比如不超过200KB(--max-size='200k'
)--min-size
参数设置传输的最小文件的大小限制,比如不小于10KB(--min-size=10k
)-n
参数或--dry-run
参数模拟将要执行的操作,而并不真的执行。配合-v
参数使用,可以看到哪些内容会被同步过去-P
参数是--progress
和--partial
这两个参数的结合--partial
参数允许恢复中断的传输。不使用该参数时,rsync
会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append
或--append-verify
配合使用--partial-dir
参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial
。一般需要与--append
或--append-verify
配合使用--progress
参数表示显示进展-r
参数表示递归,即包含子目录--remove-source-files
参数表示传输成功后,删除发送方的文件--size-only
参数表示只同步大小有变化的文件,不考虑文件修改时间的差异--suffix
参数指定文件名备份时,对文件名添加的后缀,默认是~
-u
、--update
参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件-v
参数表示输出细节。-vv
表示输出更详细的信息,-vvv
表示输出最详细的信息--version
参数返回 rsync 的版本-z
参数指定同步时压缩数据
3、rsync服务器搭建
3.1 daemon模式启动
1 | # Ubuntu已经默认安装rsync的,只是不是默认启动而已,需要修改/etc/default/rsync |
3.2 配置文件详解
全局参数
- 在全局参数部分也可以定义模块参数,这时该参数的值就是所有模块的默认值
address
—在独立运行时,用于指定的服务器运行的 IP 地址;由 xinetd 运行时将忽略此参数,使用命令行上的 –address 选项替代。默认本地所有IPport
—指定 rsync 守护进程监听的端口号。由 xinetd 运行时将忽略此参数,使用命令行上的 –port 选项替代。默认 873motd file
—指定一个消息文件,当客户连接服务器时该文件的内容显示给客户pid file
—rsync 的守护进程将其 PID 写入指定的文件log file
—指定 rsync 守护进程的日志文件,而不将日志发送给 syslogsyslog facility
—指定 rsync 发送日志消息给 syslog 时的消息级别socket options
—指定自定义 TCP 选项lockfile
—指定rsync的锁文件存放路径timeout = 600
—超时时间
模块参数
模块参数主要用于定义 rsync 服务器哪个目录要被同步。模块声明的格式必须为 [module] 形式,这个名字就是在 rsync 客户端看到的名字,类似于 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的
基本模块参数
path
—指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的comment
—给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户
模块控制参数
use chroot =
—默认为 true,在传输文件之前首先 chroot 到 path 参数所指定的目录下;优点,安全;缺点,需要 root 权限,不能备份指向 path 外部的符号连接所指向的目录文件uid =
—指定该模块以指定的 UID 传输文件;默认nobodygid =
—指定该模块以指定的 GID 传输文件;默认nobodymax connections
—最大并发连接数,0为不限制lock file
—指定支持 max connections 参数的锁文件。默认 /var/run/rsyncd.locklist
—指定当客户请求列出可以使用的模块列表时,该模块是否应该被列出。默认为 true,显示read only =
—只读选择,也就是说,不让客户端上传文件到服务器上。默认truewrite only =
—只写选择,也就是说,不让客户端从服务器上下载文件。默认falseignore errors
—忽略IO错误。默认trueignore nonreadable
—指定 rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些不应该被备份者获得的文件时是有意义的。falsetimeout =
—该选项可以覆盖客户指定的 IP 超时时间。从而确保 rsync 服务器不会永远等待一个崩溃的客户端。对于匿名 rsync 服务器来说,理想的数字是 600(单位为秒)。0 (未限制)dont compress
—用来指定那些在传输之前不进行压缩处理的文件。该选项可以定义一些不允许客户对该模块使用的命令选项列表。必须使用选项全名,而不能是简称。当发生拒绝某个选项的情况时,服务器将报告错误信息然后退出。例如,要防止使用压缩,应该是:"dont compress = "。 .gz .tgz .zip .z .rpm .deb .iso .bz2 .tbz
模块文件筛选参数
exclude
—指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式exclude from
—指定一个包含 exclude 规则定义的文件名,服务器从该文件中读取 exclude 列表定义include
—指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 include 列表中。这等同于在客户端命令中使用 –include 来指定模式include from
—指定一个包含 include 规则定义的文件名,服务器从该文件中读取 include 列表定义
模块用户认证参数
auth users
—指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块(和系统用户没有任何关系)。用户名和口令以明文方式存放在 secrets file 参数指定的文件中。默认为匿名方式secrets file
—指定一个 rsync 认证口令文件。只有在 auth users 被定义时,该文件才起作用。文件权限必须是 600strict modes
—指定是否监测口令文件的权限。为 true 则口令文件只能被 rsync 服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认为true
模块访问控制参数
hosts allow
—用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝。默认值为hosts deny
—用一个主机列表指定哪些主机客户不允许连接该模块
模块日志参数
-
transfer logging
—使 rsync 服务器将传输操作记录到传输日志文件。默认值为false -
log format
—指定传输日志文件的字段。默认为:"%o %h [%a] %m (%u) %f %l"设置了"log file"参数时,在日志每行的开始会添加"%t [%p]";可以使用的日志格式定义符如下所示:
%o —操作类型:"send"或 “recv”
%h —远程主机名
%a —远程IP地址
%m —模块名
%u —证的用户名(匿名时是 null)
%f —文件名
%l —文件长度字符数
%p —该次 rsync 会话的 PID
%P —模块路径
%t —当前时间
%b —实际传输的字节数
%c —当发送文件时,记录该文件的校验码
3.3 配置文件举例
例子一
1 | # sample rsyncd.conf configuration file |
例子二
1 | #rsync_config |
例子三
1 | ###全局配置 |
3.4 实战demo
本次测试样例,首先配置服务端,vim /etc/rsyncd.conf
,注意一行后面不能有注释否则会出错
1 | #rsync运行权限为root |
创建好服务端相关配置
1 | # 创建基础目录 |
然后进行客户端的配置和测试
1 | # 创建需要同步的文件夹 |
二、Rsync+Notify实时同步
1、概述
rsync
与传统的cp
、tar
备份方式相比,rsync
具有安全性高、备份迅速、支持增量备份等优点,通过rsync
可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync
在高端业务系统中也逐渐暴露出了很多不足,首先,rsync
同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync
不能实时的去监测、同步数据,虽然它可以通过linux
守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync
+inotify
组合出现了!
Inotify
是一种强大的、细粒度的、异步的文件系统事件监控机制,linux
内核从2.6.13
起,加入了Inotify
支持,通过Inotify
可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools
就是这样的一个第三方软件。在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab
守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify
可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync
同步,这样刚好解决了同步数据的实时性问题。
2、Notify配置与运行
2.1 环境配置
1 | # 自行下载最新版本 |
2.2 常用参数介绍
-m
—始终保持监听状态,默认触发事件即退出-r
—递归查询目录-q
—打印出监控事件-e
—定义监控的事件,可用参数:access
—访问文件modify
—修改文件attrib
—属性变更open
—打开文件delete
—删除文件create
—新建文件move
—文件移动
—fromfile
—从文件读取需要监视的文件或者排除的文件,一个文件一行,排除的文件以@开头—timefmt
—时间格式—format
—输出格式—exclude
—正则匹配需要排除的文件,大小写敏感—exclude
—正则匹配需要排除的文件,忽略大小写%y%m%d %H%M
—年月日时钟%T%w%f%e
—时间路径文件名状态
3、测试运行
1 | # 运行,当监控的目录发送改变时,会发生变化 |
编写脚本自动同步,两台机器需要做好 ssh 免密登录
1 | # dest机器 |
参考文章:
https://www.ruanyifeng.com/blog/2020/08/rsync.html