实时同步技术 = inotify(监控) + rsync(远程同步)

130 阅读7分钟

1、实时同步技术

实现实时同步的方法:inotify + rsync 的方式实现数据同步

工作原理:

  • 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
  • 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上

inotify+rsync使用方式

  • inotify 对同步数据目录信息的监控
  • rsync 完成对数据的同步
  • 利用脚本进行结合

2、inotify 监控

inotify是 内核里面的功能

实现inotify软件:

  • inotify-tools
  • sersync
  • lrsyncd

2.1 inotify 内核参数说明

参数含义备注说明
max_queued_eventsinotify 事件队列最大长度默认值:16384,生产环境建议调大,比如:327679
max_user_instances每个用户创建inotify实例最大值默认值:128
max_user_watches可以监视的文件的总数量默认值:8192,建议调大

示例:

 [root@data-centos7 ~]#vim /etc/sysctl.conf 
 fs.inotify.max_queued_events=66666
 fs.inotify.max_user_watches=100000    
 [root@centos7 ~]#sysctl -p

2.2 inotify-tools 工具

inotify-tools参考文档:github.com/rvoicilas/i…

inotify 作用: 监控文件夹的变更,如果发生了变更,就可以使用rsync命令进行同步。

 安装:基于epel源
 yum install inotify-tools -y

inotify-tools包 主要工具:

  • inotifywait:用的比较多, 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控。前台执行的命令。
  • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

2.2.1 inotifywait 命令

 格式:
 inotifywait [ 选项 ] 文件1 [ 文件2 ] [ 文件3 ] [ ... ]

常用选项:

选项含义
-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类似于处理动作。 指定监听指定的事件,如果省略,表示所有事件都进行监听

示例:规定输出的格式

 inotify -mr /data --timefmt "%y-%m-%d %H:%M:%S" --format "%T %w%f event: %;e"    //--timefmt和--format组合使用

image.png

2.2.1.1 --timefmt 时间格式
时间格式含义
%y#年份信息,不包括世纪信息
%m#显示月份,范围 01-12
%d#每月的第几天,范围是 01-31
%H#小时信息,使用 24小时制,范围 00-23
%M#分钟,范围 00-59
%Y#年份信息,包含世纪信息
%S#秒,范例 0-60

示例:

 --timefmt "%Y-%m-%d %H:%M:%S"
2.2.1.2 --format

规定后面输出的格式。

 %T #输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
 %w #事件出现时,监控文件或目录的名称信息,相当于dirname
 %f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename
 %e #显示发生的事件信息,不同的事件默认用逗号分隔
 %Xe #显示发生的事件信息,不同的事件指定用X进行分隔  x表示分隔符

示例:

 --format "%T %w%f event: %;e"
 --format '%T %w %f'
2.2.1.3 inotifywait -e

指定的事件类型,类似于处理动作

 create              #文件或目录创建
 delete              #文件或目录被删除
 modify              #文件或目录内容被写入
 attrib              #文件或目录属性改变
 close_write         #文件或目录关闭,在写入模式打开之后关闭的
 close_nowrite       #文件或目录关闭,在只读模式打开之后关闭的
 close               #文件或目录关闭,不管读或是写模式
 open                #文件或目录被打开
 lsdir               #浏览目录内容
 moved_to            #文件或目录被移动到监控的目录中
 moved_from          #文件或目录从监控的目录中被移动
 move                #文件或目录不管移动到或是移出监控目录都触发事件
 access              #文件或目录内容被读取
 delete_self         #文件或目录被删除,目录本身被删除
 unmount             #取消挂载

3、rsync 同步

rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时数据同步

官方网站: rsync.samba.org/

软件包:rsync,rsync-daemon(CentOS 8)

服务文件:/usr/lib/systemd/system/rsyncd.service

配置文件:/etc/rsyncd.conf

端口:873/tcp

rsync的两种工作模式:

  • 基于ssh协议,将本机目录发送给对面
  • 通过rsync协议,发给对面 服务程序 873端口

rsync运行逻辑:

7-1数据服务器上,运行脚本;

7-2备份服务器上,开启rsync服务进程

3.1 rsync 命令

 命令格式:
 rsync [选项] src源地址  dest目的地址

常用选项:

选项含义
-a ,--archive-a选项功能非常强大。归档模式,表示递归传输并保持文件属性
-v显示rsync过程中详细信息
-P显示文件传输的进度信息
-n --dry-run仅测试传输,而不实际传输
-r --recursive递归到目录中去
-t --times保持mtime属性
-o --owner保持owner属性(属主)
-g --group保持group属性(属组)
-p --perms保持perms属性(权限,不包括特殊权限)
-D是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件
-l --links软链接文件
-z传输时进行压缩提高效率
--delete以SRC为主,对DEST进行同步。多则删之,少则补之,保持一致。

示例:

 rsync -av /etc/passwd root@192.168.125.120:/mnt   //使用的ssh协议

3.2 rsync 配置文件

 /etc/rsyncd.conf    //d是daemon的意思,也就是守护进程

3.2.1 实现验证功能

上述实验没有验证功能不安全

修改配置文件添加验证功能等

配置解释
uid = root规定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认为nobody
gid = root默认为nobody
port = 874可指定非标准端口,默认873/tcp
use chroot = nochroot禁锢。限制在指定的模块路径来增强安全性,限制目录。只能在指定的文件夹中操作,不能切换文件夹
max connections = 0最大连接数,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密码文件位置
3.2.1.1 修改配置文件
 [root@node2 ~]#vi /etc/rsyncd.conf
 uid=root     //超级管理员
 gid=root     //root组
 max connections = 0      //最大连接数,0代表不限制;如果是2,代表最大允许是2,超过2的话,就会把文件锁起来
 ignore errors      //忽略错误
 exclude = lost+found/
 log file = /var/log/rsyncd.log
 pid file = /var/run/rsyncd.pid
 lock file = /var/run/rsyncd.lock
 reverse lookup = no          //上面这些都是全局配置
 ​
 [backup]           //下面这些是模块的配置
 path = /data/
 read only = no     //不开启只读
 auth users = rsyncuser      //用户必须叫rsyncuser
 secrets file = /etc/pass    //密码必须在指定路径
3.2.1.2 客户端设置密码文件
 [root@localhost data]# vim /etc/pass
 rsyncuser:123456
 [root@localhost data]# chmod  600 /etc/pass  //注意:一定一定不要忘记修改权限!!!这是规定动作!!!改成600 别的用户连看都不能看,只有拥有者才可以查看!!!
 ​
 #非交互式查看共享目录
 [root@data-server ~]#rsync --password-file=/etc/pass  rsync://rsyncuser@192.168.125.120/backup

小拓展:rsync和NFS的区别

  • rsync是不论谁都压榨,无论是超级管理员还是普通用户
  • NFS是只压榨超级管理员,不压榨普通用户

4、附:脚本

 #!/bin/bash
 SRC='/data/'
 DEST='rsyncuser@192.168.91.101::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