1、实时同步技术
实现实时同步的方法:inotify + rsync
的方式实现数据同步
工作原理:
- 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
- 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
inotify+rsync使用方式
- inotify 对同步数据目录信息的监控
- rsync 完成对数据的同步
- 利用脚本进行结合
2、inotify 监控
inotify是 内核里面的功能
实现inotify软件:
- inotify-tools
- sersync
- lrsyncd
2.1 inotify 内核参数说明
参数 | 含义 | 备注说明 |
---|---|---|
max_queued_events | inotify 事件队列最大长度 | 默认值: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组合使用
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 = no | chroot禁锢。限制在指定的模块路径来增强安全性,限制目录。只能在指定的文件夹中操作,不能切换文件夹 |
max connections = 0 | 最大连接数,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 | 密码文件位置 |
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