一、数据的实时同步
在生产环境,需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实现同步到备份服务器的特定目录中。
实现同步技术
实现实时同步的方法:
- inotify + rsync 方式实现数据同步。
- sersync :前金山公司周洋(花椒直播)在 inotify 软件基础上进行开发的,功能更加强大。
工作原理:
- 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化。
- 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上。
inotify 实时监控
内核支持
Linux支持inotify的内核最小版本为 2.6.13。
inotify内核参数说明:
- max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384,生产环境建议调大,比如:327679。
- max_user_instances:每个用户创建inotify实例最大值,默认值:128。
- max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大。
vim /etc/sysctl.conf
fs.inotify.max_queued_events = 66666
fs.inotify.max_user_watches = 100000
cat /proc/sys/fs/inotify/*
inotify-tools工具
安装inotify-tools。基于epel源。
inotify-tools包主要工具:
- inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控。
- inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。
inotifywait命令
格式:
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
选项 | 解释 |
---|---|
-m, --monitor | 始终保持事件监听 |
-d, --daemon | 以守护进程方式执行,和-m相似,配合-o使用 |
-r, --recursive | 递归监控目录数据信息变化 |
-q, --quiet | 输出少量事件信息 |
–exclude <pattern> | 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现 |
–excludei <pattern> | 和exclude相似,不区分大小写 |
-o, --outfile <file> | 打印事件到文件中,相当于标准正确输出,注意:使用绝对路径 |
-s, --syslogOutput | 发送错误到syslog相当于标准错误输出 |
–timefmt <fmt> | 指定时间输出格式 |
–format <fmt> | 指定的输出格式;即实际监控输出内容 |
-e | 指定监听指定的事件,如果省略,表示所有事件都进行监听 |
inotifywait的 --timefmt 时间格式
选项 | 解释 |
---|---|
%y | #年份信息,不包括世纪信息 |
%m | #显示月份,范围 01-12 |
%d | #每月的第几天,范围是 01-31 |
%H | #小时信息,使用 24小时制,范围 00-23 |
%M | #分钟,范围 00-59 |
%S | #秒,范例 0-60 |
--timefmt "%Y-%m-%d %H:%M:%S"
inotifywait的–format格式定义
选项 | 解释 |
---|---|
%T | 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息 |
%w | 事件出现时,监控文件或目录的名称信息,相当于dirname |
%f | 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename |
%e | 显示发生的事件信息,不同的事件默认用逗号分隔 |
%Xe | 显示发生的事件信息,不同的事件指定用X进行分隔 x表示分隔符 |
inotifywait -e 选项指定的事件类型
名称 | 含义 |
---|---|
create | 文件或目录创建 |
delete | 文件或目录被删除 |
modify | 文件或目录内容被写入 |
attrib | 文件或目录属性改变 |
close_write | 文件或目录关闭,在写入模式打开之后关闭的 |
close_nowrite | 文件或目录关闭,在只读模式打开之后关闭的 |
close | 文件或目录关闭,不管读或是写模式 |
open | 文件或目录被打开 |
lsdir | 浏览目录内容 |
moved_to | 文件或目录被移动到监控的目录中 |
moved_from | 文件或目录从监控的目录中被移动 |
move | 文件或目录不管移动到或是移出监控目录都触发事件 |
access | 文件或目录内容被读取 |
delete_self | 文件或目录被删除,目录本身被删除 |
unmount | 取消挂载 |
-e create,delete,moved_to,close_write,attrib
实际演示
使用inotifywait 命令监控
inotifywait /data/
开启另一个终端,新建删除文件可以看到变化,有操作就会退出。
持续监听
使用inotifywait命令持续监控/data
inotifywait -m /data/
开启另一个终端,新建删除文件可以看到变化,不会主动退出。
递归监听
-r选项
不加入-r选项无法监听子目录。
持续后台监控,并记录日志
inotifywait -mr /data/ --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %;e"
--timefmt 指定时间格式 "%Y-%m-%d %H:%M:%S" 年:月:日 时:分:秒。
--format 日志输出格式 "%T %w%f event: %;e" 时间格式 %w监控的文件夹 %f监控的文件 event: 添加输出信息 %;e 多个事件用;号隔开。
inotifywait -mr /data/ --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib
二、rsync
rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时数据同步。
格式
rsync [OPTION...] SRC... [DEST]
rsync -av /etc 192.168.232.20:/opt
复制目录和目录下文件
-a 约等于cp命令中的a
v 显示过程
rsync -av /etc/ 192.168.232.20:/opt
只复制目录下文件
-v 显示 过程
加/和不加/的区别。
rsync -av /data/ --delete 192.168.232.20:/opt
常见选项
选项 | 含义 |
---|---|
-v | 显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。 |
-P | 显示文件传输的进度信息。(实际上"-P"=“–partial --progress”,其中的"–progress"才是显示进度信息的)。 |
-n --dry-run | 仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。 |
-a --archive | 归档模式,表示递归传输并保持文件属性。 |
-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 | 要求只更新目标端不存在的文件。 |
–remove-source-files | 要求删除源端已经成功传输的文件 |
rsync有三种工作方式
- 本地模式(Local Mode):
在同一台机器上复制文件。
语法:rsync [options] source destination
示例:rsync -av /home/user/docs /backup/
特点:
- 不涉及网络传输
- 可以在本地文件系统间快速同步
- 通常用于本地备份
- 远程Shell模式(Remote Shell Mode):
通过SSH或RSH协议在远程机器间传输文件。
语法:
推送:rsync [options] source [user@]host:destination
拉取:rsync [options] [user@]host:source destination
示例:
推送:rsync -avz /local/docs user@remotehost:/remote/docs
拉取:rsync -avz user@remotehost:/remote/docs /local/docs
特点:
- 使用SSH进行加密传输,安全性高
- 不需要在远程主机上运行rsync守护进程
- 适用于大多数需要远程传输的场景
- 守护进程模式(Daemon Mode):
使用rsync协议直接连接到远程rsync守护进程。
语法:rsync [options] source [user@]host::module
示例:rsync -av /local/docs rsync://user@host/module/path
特点:
- 需要在远程主机上运行rsync守护进程
- 可以设置更细粒度的访问控制
- 通常比远程Shell模式更快
- 可以设置匿名访问
- 适用于需要频繁同步或对大量客户端提供同步服务的场景
每种模式的选择取决于具体的使用场景:
本地模式适用于在同一台机器上进行文件同步或备份。
远程Shell模式是最常用的远程同步方式,特别是在需要安全传输时。
守护进程模式适用于需要高性能、细粒度控制或服务多个客户端的场景。
实际演示
开启服务进程,控制传递文件的属性。
需要更改配置文件。
这样即可。
验证功能
配置 | 解释 |
---|---|
uid = root | 提定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认为nobody |
gid = root | 默认为nobody |
port = 874 | 可指定非标准端口,默认873/tcp |
use chroot = no | 限制在指定的模块路径来增强安全性,限制目录 |
max connections = 0 | 最大连接数 |
ignore errors | 忽略错误 |
exclude = lost+found/ | 不同步的文件 |
log file = /var/log/rsyncd.log | 日志文件位置 |
pid file = /var/run/rsyncd.pid | pid 文件位置 |
lock file = /var/run/rsyncd.lock | 锁文件如果 max connections 设置为 4,则 rsync 将使用锁文件来确保同时只有 4 个连接。 |
reverse lookup = no | 不使用反向解析 |
hosts allow = 10.0.0.0/24 | 允许同步的网段 |
[backup] | 每个模块名对应一个不同的path目录,如果同名后面模块生效 |
path = /data/backup/ | 指明文件的真实存放路径 |
comment = backup dir | 备注描述 |
read only = no | 默认是yes,即只读 no表示可写 |
auth users = rsyncuser | 验证默认anonymous可以访问rsync服务器 ,修改成rsyncuser 用户 只有 rsyncuser 可以访问 |
secrets file = /etc/rsync.pas | 密码文件位置 |
设置传输账户和密码
uid=root
gid=root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
reverse lookup = no
[backup]
path = /data/
read only = no
auth users = rsyncuser
secrets file = /etc/pass
这个文件要指明,而且需要改权限。
chmod 600 /etc/pass
rsync /etc/issue rsyncuser@192.168.232.20::backup
测试客户端就行。
非交互式查看共享目录
rsync --password-file=/etc/pass rsync://rsyncuser@192.168.232.20/backup
把密码写下/etc/pass下
客户端设置密码文件
客户端配置密码文件
也可将密码赋值给环境变量RSYNC_PASSWORD变量,但不安全
vim /etc/pass
123456
chmod 600 /etc/pass ## 必须
使用脚本实时同步
inotify+rsync+shell脚本实现实时数据同步
搭建好 rsyncd的备份服务器,在数据服务器上创建inotify_rsync.sh脚本。
注意: 此脚本执行前先确保两主机初始数据处于同步状态,此脚本实现后续的数据同步
vim inotify_rsync.sh
#!/bin/bash
SRC='/data/'
DEST='rsyncuser@192.168.232.20::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e attrib,create,delete,moved_to,close_write ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done