使用rsync来实现实时同步文件

0    66    1

👉 本文共约9306个字,系统预计阅读时间或需35分钟。

俗话说一个好汉三个帮,rsync 也是需要帮手才能更好的工作。

使用rsync来实现实时同步

使用rsync来实现实时同步


1. 两款工具对比

没有对比,就没有伤害!

Rsync 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份、保持链接和权限、采用优化的同步算法、传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。

使用rsync来实现实时同步

使用rsync来实现实时同步

  • [1] inotify

inotify 是一个 Linux 特性,它异步监控文件系统操作,比如读取、写入和创建。利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施这样监控的软件。

inotify 反应非常灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。将 rsync 工具与 inotify 机制相结合,可以实现实时同步,只要原始位置发生变化,就立即启动增量备份操作,否则处于静默等待状态,这样避免了按固定周期备份时存在的延时性、周期过密性等问题。

使用rsync来实现实时同步

使用rsync来实现实时同步

  • [2] sersync

国人周洋在金山公司也开发了类似的实时同步软件 sersync,该软件实际上就是在 inotify 软件基础上进行开发的,功能要更加强大些 ,多了定时重传机制,过滤机制了提供接口做 CDN,支持多线程橾作。

sersync 项目利用 inotifyrsync 技术实现对服务器数据实时同步的解决方案,其中 inotify 用于监控 sersync 所在服务器上文件系统的时间变化。rsync 是目前广泛使用的本地及异地数据同步工具,其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行同步,所以其优势大大超过使用挂接文件系统或 scp 等方式进行镜像同步。

使用rsync来实现实时同步

使用rsync来实现实时同步

  • [3] 同步方式

单向同步: 如果仅需单向同步,只需要在服务端启动 rsyncd 服务,客户端无需启动服务,可直接执行 rsync 命令。
双向同步: 如需双向同步,则需要在两台服务器启动 rsyncd 服务,两台服务器互为 C/S 关系。

  • [4] 使用总结

inotify-tools 只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来。而 sersync 可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字。

当同步的目录数据量不大时,建议使用rsync+inotify-tools模式。当数据量很大(几百 G 甚至 1T 以上)文件很多时,建议使用 rsync+sersync 模式。


2. inotify 工具介绍

工具官方地址: https://github.com/rvoicilas/inotify-tools

Inotify 是一种文件变化通知机制,Linux 内核从 2.6.13 开始引入。在 BSDMac OS 系统中比较有名的是 kqueue,它可以高效地实时跟踪 Linux 文件系统的变化。近些年来,以 fsnotify 作为后端,几乎所有的主流 Linux 发行版都支持 Inotify 机制。如何知道你的 Linux 内核是否支持 Inotify 机制呢?很简单,执行下面这条命令。

inotify-tools 提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件,除了要求内核支持 inotify 外不依赖于其他。inotify-tools 提供两种工具,第一个命令是 inotifywait,它是用来监控文件或目录的变化;第二个命令是 inotifywatch,它是用来统计文件系统访问的次数。

使用rsync来实现实时同步

使用rsync来实现实时同步

  • [1] inotifywait

排序命令参数解释说明
1-r监视一个目录下的所有子目录
2-m接收到一个事情而不退出,无限期地执行;默认的行为是接收到一个事情后立即退出
3-e指定监视的事件
4-s输出错误信息到系统日志
5-q设置之后不显示输出的详细信息
6–exclude正则匹配需要排除的文件,大小写敏感
7–excludei正则匹配需要排除的文件,忽略大小写
8-t/timeout设置超时时间,如果为 0 则表示无限期地执行下去
9–timefmt指定时间格式,用于–format 选项中的%T 格式
10–format指定事件监听输出格式;%w/%f/%e/%T
11–csv输出 csv 格式
12-d/–daemon已后台方式运行服务;需要指定–outfile 把事情输出到一个文件
13-o/–outfile输出事件到一个文件而不是标准输出
14@排除不需要监视的文件,可以是相对路径,也可以是绝对路径
  • [2] inotifywatch

排序命令参数解释说明
1-r监视一个目录下的所有子目录
2-e指定监视的事件
3-t设置超时时间,如果为 0 则表示无限期地执行下去
4–exclude正则匹配需要排除的文件,大小写敏感
5–excludei正则匹配需要排除的文件,忽略大小写
6–fromfile从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
7@排除不需要监视的文件,可以是相对路径,也可以是绝对路径
8-z/–zero输出表格的行和列,即使元素为空
9-a/–ascending以指定事件升序排列
10-d/–descending以指定事件降序排列
  • [3] 可监听事件
排序可监听事件解释说明
1access文件读取
2modify文件更改
3attrib文件属性更改,如权限,时间戳等
4close_write以可写模式打开的文件被关闭,不代表此文件一定已经写入数据
5close_nowrite以只读模式打开的文件被关闭
6close文件被关闭,不管它是如何打开的
7open文件打开
8moved_to一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发
9moved_from一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发
10move包括moved_tomoved_from
11move_self文件或目录被移除,之后不再监听此文件或目录
12create文件或目录创建
13delete文件或目录删除
14delete_self文件或目录移除,之后不再监听此文件或目录
15unmount文件系统取消挂载,之后不再监听此文件系统

3. rsync+inotify-tools

值的注意的是,inotify-tools 工具至今还在持续有人维护,可以方式使用。

  • [1] 调整 inotify 内核参数

  • [2] 安装 inotify-tools 工具

  • [3] 使用 inotifywait 命令进行监控测试

  • [4] 编写触发式上行同步脚本

  • [5] 定时进行全量同步

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

4. sersync 工具介绍

官方项目地址: https://code.google.com/archive/p/sersync

sersync 项目利用 inotifyrsync 技术实现对服务器数据实时同步的解决方案,其中 inotify 用于监控所在服务器上文件系统的时间变化,rsync 是目前广泛使用的本地及异地数据同步工具,其优点是只对变化的目录数据操作。

目前使用的比较多的同步程序版本是 inotify-tools,另外一个是 google 开源项目 Openduckbill (依赖于 inotify-tools 工具),这两个都是基于脚本语言编写的,其设计思路同样是采用 inotifyrsync 命令。该项目的优点有以下优点,这是国人研发的呦。

  • [1] 工具特点
  1. 使用 C++ 编写,对于 Linux 系统文件产生的临时文件和重复的文件操作会进行过滤,再结合了 rsync 同步的时候,会减少运行时消耗的本地及网络资源,因此速度会更快;
  2. 相比较上面两个项目,sersync 配置起来很简单,其中 bin 目录下是已经编译好的二进制文件,配合 bin 目录下的 xml 文件直接使用即可;
  3. 使用多线程进行同步(即可以并发同步多个不同文件),尤其在同步较大文件时,能够保证多个服务器实时保持同步状态;
  4. sersync 自带出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则每 10 个小时对同步失败的文件再重新同步;
  5. sersync 自带 crontab 功能,只需在 xml 配置文件中开启,即可按预先的配置,隔一段时间整体同步一次;
  6. sersync 自带 sockethttp 的协议拓展,可以满足有特殊需求的公司二次开发;

使用rsync来实现实时同步

使用rsync来实现实时同步

  • [2] 设计要点
  1. 线程组线程是等待线程对立的守护线程,当事件队列中有数据产生的时候,线程组守护线程就会逐个唤醒同步线程,当队列中 inotify 事件较多的时候,同步线程就会被全部唤醒一起工作。这样设计的目的是能够同时处理多个 inotify 事件,从而提升服务器的并发同步能力。之所以称之为线程组线程,是因为每个线程在工作的时候,会根据服务器上新写入文件的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步,当要同步的文件较大的时候,这样的设计可以保证各个远程服务器可以同时获得要同步的文件。
  2. 服务器线程的作用有三个(保证主服务器和从服务器数据一致且实时):第一就是,处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成 rsync_fail_log.sh 脚本,记录失败的事件。第二就是,同时每个 10 小时执行脚本一次,同时清空脚本。第三就是,还有就是 crontab 功能,可以每隔一定事件,将所有路径整体同步一次。
  3. 过滤队列的建立是为了过滤短时间内产生的重复的 inotify 信息,例如在删除文件夹的时候,inotify 就会同时产生删除文件夹里的文件与删除文件夹的事件,通过过滤队列,当删除文件夹时间产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹事件,从而减轻了同步的负担。同时对于修改文件的操作的时候,会产生临时文件的重复操作。
  • [3] sersync 同步参数说明
排序Sersync 参数说明
1-r作用是在开启实时监控之前对主服务器目录与远程目标机目录进行一次整体同步;如果需要将 sersync 运行前,主服务器目录下已经存在的所有文件或目录全部同步到远端,则需要指定-r 参数运行 sersync,将本地与远程整体同步一次;如果设置了过滤器,即在 xml 配置文件中 filter 为 true,则暂时不能使用-r 参数进行整体同步
2–o confxml.xml不指定-o 参数时,sersync 可执行文件目录下的默认配置文件 confxml.xml;如果需要使用其他的配置文件,可以使用-o 参数指定其他配置文件,通过-o 参数,我们可以指定多个不同的配置文件,从而实现 sersync 多进行多实例的数据同步
3–n number该参数为指定默认的线程池的线程总数;如果不指定,默认启用线程池数量为 10 个
4-d该参数为后台启动服务,在通常情况下,使用-r 参数对本地到远程整体同步一遍后,在后台运行此参数启动守护进程实时同步,在第一次整体同步时,-d 和-r 参数经常会联合使用
5-m pluginName该参数为不进行同步,只运行插件;例如 sersync –m command,则在监控到时间后,不对远程目标服务器进行同步,而是直接运行 command 插件

5. rsync+sersync

在同步主服务器上开启 sersync 服务,sersync 负责监控配置路径中的文件系统事件变化,然后调用 rsync 命令把更新的文件同步到目标服务器。

  • [1] 备份服务器开启 rsyncd 服务

  • [2] 备份服务器开启配置权限认证

  • [3] 备份服务器开启 rsync 守护进程

  • [4] 同步服务器配置相关权限

  • [5] 同步服务下载 sersync 工具

  • [6] 设置 sersync 的配置文件

xml

  • [7] 开启 sersync 守护进程同步数据


参考

https://www.escapelife.site/posts/1bab7aab.html

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

7 + 17 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部