数据实时同步


一、数据的实时同步

在生产环境,需要两台主机的特定目录实现实时同步。比如,将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-filedaemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-filersync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
–existing要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
–ignore-existing要求只更新目标端不存在的文件。
–remove-source-files要求删除源端已经成功传输的文件

rsync有三种工作方式

  1. 本地模式(Local Mode):
    在同一台机器上复制文件。
    语法:rsync [options] source destination
    示例:rsync -av /home/user/docs /backup/
    特点:
  • 不涉及网络传输
  • 可以在本地文件系统间快速同步
  • 通常用于本地备份
  1. 远程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守护进程
  • 适用于大多数需要远程传输的场景
  1. 守护进程模式(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.pidpid 文件位置
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

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值