乐趣区

rsync+inotify实时同步

数据实时同步
在生产中有一种需求是,当目录下的文件数据发生变化时,就将数据备份到备份服务器上。实现这样的需求需要做到以下两点:

利用监控服务 (inotify),监控到要同步服务器的目录文件的变化
发现目录数据发生变化就利用 rsync 服务将数据发送到备份服务器

因此,利用 rsync+inotify 可实现数据的实时同步。
Inotify 介绍
Inotify 是一种强大的,细粒度的。异步的文件系统事件监控机制,linux 内核从 2.6.13 起,加入了 Inotify 支持,通过 Inotify 可以监控文件系统中添加、删除,修改、移动等各种事件, 利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施这样监控的软件。
Inotify 实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如 cron 等的轮询机制来获取事件。cron 等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify 基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界事件机制相符合。
Inotify 安装
环境介绍
[root@moli-linux03 ~] uname -r
3.10.0-862.2.3.el7.x86_64
[root@moli-linux03 ~] cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
安装前提需要 2.6.13 以后内核版本才能支持 inotify 软件。2.6.13 内核之后版本,在没有安装 inotify 软件之前,应该有这三个文件。
[root@moli-linux03 ~] ll /proc/sys/fs/inotify/
总用量 0
-rw-r–r–. 1 root root 0 2 月 3 12:24 max_queued_events
-rw-r–r–. 1 root root 0 2 月 3 12:24 max_user_instances
-rw-r–r–. 1 root root 0 2 月 3 12:24 max_user_watches
[root@moli-linux03 ~]
三个文件的说明

文件
默认值
作用说明

max_user_watches
8192
设置 inotifywait 或 inotifywatch 命令可以监视的文件数量(单进程)

max_user_instances
128
设置每个用户可以运行的 inotifywait 或 inotifywatch 命令的进程数

max_queued_events
16384
设置 inotify 实例事件(event)队列可容纳的事件数量

注:可以将三个文件的数值调大,监听更大的范围
安装方式可选择 yum 安装或者编译安装,yum 安装需要配置有 epel 源,编译安装需要到 github 下载源码包。yum 安装
yum install -y inotify-tools

编译安装 (源码包地址:https://github.com/rvoicilas/…
tar -zxf tar -zxf inotify-tools-3.13.tar.gz
./configure
make
make install
inotify 主要安装的两个软件 inotifywait:(主要)在被监控的文件或目录上等待特定文件系统事件(open close delete 等)发生,执行后处于阻塞状态,适合在 shell 脚本中使用 inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。说明:在实时实时同步的时候,主要是利用 inotifywait 对目录进行监控
inotifywait 重要命令参数说明

参数
说明

-m
始终保持事件监听

-r
递归监控目录数据信息变化

-q
输出信息少(只打印事件信息)

-timefmt
指定时间输出格式

-format
打印使用指定的输出类似格式字符串;即实际监控输出内容

-e
指定监听指定的事件,如果省略,表示所有事件都进行监听

-e[参数] 可以指定的事件类型

事件名称
说明

close_write
文件或目录关闭,在写入模式打开之后关闭的。

move
文件或目录不管移动到或是移出监控目录都触发事件

create
文件或目录创建在监控目录中

delete
文件或目录被删除在监控目录中

示例测试对一个服务器打开两个终端窗口,终端 1 执行创建,删除,修改,移动文件等操作,终端 2 执行 inotifywait 命令。创建事件
[root@终端 2 ~] inotifywait -mrq /root/rsync_test –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e create
[root@终端 1 rsync_test]# touch 1.txt
下面显示出事件信息,在终端一执行创建文件操作之后终端二才显示的事件
03-02-19 12:48 /root/rsync_test/1.txt 事件信息: CREATE
删除事件
[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e delete
[root@moli_data ~]# rm -f 1.txt

修改事件
[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e close_write
[root@moli_data ~]# echo “hahaha” > 2 .txt

移动事件 move_to 把其他目录文件移动到监控目录
[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e moved_to
[root@moli_data ~]# mv /etc/passwd .

移动事件 move_from 把监控目录文件移到其他目录
[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e moved_from
[root@moli_data ~]# mv 2.txt /tmp

inotifywait –timefmt 时间参数说明

命令参数
说明

%y
年份信息,显示信息为十进制,并且没有世纪信息

%m
显示月份,显示信息为十进制(范围 01-12 )

%d
每月的第几天,显示倍息为十进制数(范围是 01-31 )

%H
小时信息,显示信息为十进制,使用 24 小时制(范围 00-23 )

%M
显示分钟,显示信息为十进制(范围 00-59 )

inotifywait –format 参数说明

命令参数
说明

%w
事件出现时,监控文件或目录的名称信息

%f
事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空

%e
显示发生的事件信息,不同的事件信息用逗号进行分隔

%T
输出时间格式中定义的时间格式信息,通过 –timefmt option 语法格式指定时间信息这个格式是通过 strftime 函数进行匹配时间格式信息的

Linux 文件同步工具 rsync
介绍
rsync 是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。
在同步备份时,默认情况下,rsync 通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。
提示:传统的 cp,scp 工具拷贝每次均为完整拷贝,而 rsync 除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。
Rsync 的特性 1)支持拷贝特殊文件如链接,设备等 2)可以有排除指定文件或目录同步的功能,相当于打包命令 tar3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高 5)可以使用 rcp,rsh,ssh 等方式来配合传输文件,也可以通过直接的 socker 链接 6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。
核心算法介绍假定在名为 α 和 β 的两台计算机之间同步相似的文件 A 与 B,其中 α 对文件 A 拥有访问权,β 对文件 B 拥有访问权。并且假定主机 α 与 β 之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:

β 将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
β 对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。
β 将这些校验结果发给 α。
α 通过搜索文件 A 的所有大小为 S 的数据块 (偏移量可以任选,不一定非要是 S 的倍数),来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
α 发给 β 一串指令来生成文件 A 在 β 上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。

结论:rsync 就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以 rsync 在备份,同步上就会较为快速。rsync 命令常用选项

选项
说明

-a(重要)
包含 -rtplgoD 选项

-r(重要)
同步目录时要加上,类似 cp 命令的 - r 选项

-v(重要)
同步时显示一些信息,让我们知道同步的过程

-l
保留软链接

-L
同步软链接时会把源文件给同步

-p
保持文件的权限属性

-o
保持文件的属主

-g
保持文件的属组

-D
保持设备文件信息

-t
保持文件的时间属性

–delete
删除 DEST 中 SRC 没有的文件

–exclude
过滤指定文件,如 –exclude “logs” 会把文件名包含 logs 的文件或者目录过滤掉,不同步

-p
显示同步过程,比如速率,比 - v 更加详细

-u
如果 DEST 中的文件比 SRC 新,就不会同步

-z
传输时压缩

rsync 的简单示例
示例 1 将目录下 1.txt 拷贝到本目录下的 2.txt 在本地里使用 rsync 就类似于 cp 命令
[root@moli-linux03 rsync_test]# ls
1.txt
[root@moli-linux03 rsync_test]# rsync -av 1.txt 2.txt
sending incremental file list
1.txt

sent 87 bytes received 35 bytes 244.00 bytes/sec
total size is 0 speedup is 0.00
[root@moli-linux03 rsync_test]# ls
1.txt 2.txt
示例 2 把 /etc/passwd 文件拷贝到远程主机的 /tmp 目录下,并改名叫 1.txt
rsync -av /etc/passwd root@192.168.199.7:/tmp/1.txt

示例 3 通过 ssh 同步,指定端口号
rsync -av -e “ssh -p 22” /etc/passwd 192.168.199.3:/tmp/test

示例 4 通过服务进行同步 (休息一下 …)

退出移动版