数据的实时同步
数据实时同步
-
实现实时同步
- 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
- 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
-
实现实时同步的方法
- inotify+rsync 方式实现数据同步
- sersync :在inotify软件基础上进行开发的,功能更加强大
-
inotify:
异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件 -
实现inotify软件:
inotify-tools,sersync,lrsyncd
inotify和rsync实现实时同步
- inotify+rsync使用方式
- inotify 对同步数据目录信息的监控
- rsync 完成对数据的同步
- 利用脚本进行结合
inotify
-
查看服务器内核是否支持inotify
- Linux支持inotify的内核最小版本为2.6.13
- ls -l /proc/sys/fs/inotify #列出下面的文件,说明服务器内核支持inotify
-rw-r–r-- 1 root root 0 Dec 7 10:10 max_queued_events
-rw-r–r-- 1 root root 0 Dec 7 10:10 max_user_instances
-rw-r–r-- 1 root root 0 Dec 6 05:54 max_user_watches
-
inotify内核参数
- 参数说明:参看man 7 inotify
- max_queued_events:inotify事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384
- max_user_watches:可以监视的文件数量(单进程),默认值:8192
- max_user_instances:每个用户创建inotify实例最大值,默认值:128
- 参数说明:参看man 7 inotify
-
inotify参考文档
- https://github.com/rvoicilas/inotify-tools/wiki
-
安装:基于epel源
- yum install inotify-tools
-
inotify-tools包主要文件:
- inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控
- inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
inotifywait 命令常见选项
-
-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
指定监听指定的事件,如果省略,表示所有事件都进行监听
【2.–timefmt <fmt>时间格式】
- %Y 年份信息,包含世纪信息
- %y 年份信息,不包括世纪信息
- %m 显示月份,范围 01-12
- %d 每月的第几天,范围是 01-31
- %H 小时信息,使用 24小时制,范围 00-23
- %M 分钟,范围 00-59
示例:
--timefmt "%Y-%m-%d %H:%M"
【3.–format <fmt> 格式定义】
- %T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
- %w 事件出现时,监控文件或目录的名称信息
- %f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
- %e 显示发生的事件信息,不同的事件默认用逗号分隔
- %Xe显示发生的事件信息,不同的事件指定用X进行分隔
示例:
--format "%T %w%f event: %;e"
--format '%T %w %f'
【4. -e 选项指定的事件类型】
- create 文件或目录创建
- delete 文件或目录被删除
- modify 文件或目录内容被写入
- attrib 文件或目录属性改变
- close_write 文件或目录关闭,在写入模式打开之后关闭的
- close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
- close 文件或目录关闭,不管读或是写模式
- open 文件或目录被打开
- moved_to 文件或目录被移动到监控的目录中
- moved_from 文件或目录从监控的目录中被移动
- move 文件或目录不管移动到或是移出监控目录都触发事件
- access 文件或目录内容被读取
- delete_self 文件或目录被删除,目录本身被删除
- unmount 取消挂载
示例: -e create,delete,moved_to,close_write, attrib
【5.inotify示例】
监控一次性事件
inotifywait /data
持续监控
inotifywait -mrq /data
持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event: %e"
持续后台监控特定事件
inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib
实验部分
使用rsync实现数据同步
- hostA centos7 192.168.38.17
- hostB centos8 192.168.38.8
- 将centos8的/data目录下的所有文件同步至centos7的/data/backup目录
- 因为centos8上执行rsync -av 192.168.38.17:/data/* /data/backup莫名报错
1.在centos7上实现基于key验证
[root@centos7-17 ~]# ssh-keygen
[root@centos7-17 ~]# ssh-copy-id 192.168.38.8
2.[root@centos7-17 ~]# rsync -a 192.168.38.8:/data/* /data/backup
3.可以结合计划任务,每10分钟执行一次数据同步,但是这样将导致可能丢失10分钟的数据
4.解决办法:数据实时同步,监控目录数据变化,文件发生更改,就立即实现数据同步。
==>inotify 可实现实时监控某个目录下的文件变化,然后结合rsync同步,可实现数据实时同步。
确定内核支持inotify功能
- 确定内核具有的功能
- 调整内核参数的方法
1.inotify属于内核级的功能,查看内核支持的功能:
[root@centos7-17 ~]# grep -i inotify /boot/config-3.10.0-957.el7.x86_64
CONFIG_INOTIFY_USER=y
2.属于编译内核时需要添加的内核功能。上述也介绍从kernel 2.6.13开始支持inotify功能,centos6也支持inotify
3.centos6的内核版本
[root@centos6 ~]#uname -r
2.6.32-754.el6.x86_64
4.支持inotify之后,在/proc/sys/fs/inotify 中有三个与inotify相关的文件
[root@centos7-17 ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Oct 18 10:36 max_queued_events
-rw-r--r-- 1 root root 0 Oct 18 10:36 max_user_instances
-rw-r--r-- 1 root root 0 Oct 18 10:36 max_user_watches
[root@centos7-17 ~]# cat /proc/sys/fs/inotify/*
16384
128
8192
5.修改inotify的内核参数
/proc/目录的参数的配置文件均可以在/etc/sysctl.conf下设置
临时配置:
[root@centos7-17 ~]# echo 256 > /proc/sys/fs/inotify/max_user_instances
写入配置文件:
[root@centos7-17 ~]# vim /etc/sysctl.conf
fs.inotify.max_user_instances = 512
生效:
[root@centos7-17 ~]# sysctl -p
fs.inotify.max_user_instances = 512
查看内核参数:
[root@centos7-17 ~]# sysctl -a
安装inotify
1.启用epel:
[root@centos7-17 ~]# epel
epel定义的别名:alias epel='sed -ir '\''s/^enabled=0/enabled=1/'\'' /etc/yum.repos.d/base.repo'
2.安装inotify-tools
[root@centos7-17 ~]# yum install inotify-tools
3.[root@centos7-17 ~]# rpm -ql inotify-tools
/usr/bin/inotifywait 就是使用这个工具监控目录下文件变化,inotifywait在被监控文件或目录上等待特定文件系统事件发生
/usr/bin/inotifywatch inotifywatch:收集被监控的文件系统使用的统计数据
4.不过上述好像结合后面实时同步的规划应该在centos8上安装inotify-tools
[root@centos8-8 ~]# dnf install inotify-tools
5.简单测试inotifywait的使用
[root@centos8-8 ~]# inotifywait /data/www/
Setting up watches.
Watches established.
/data/www/ CREATE f4.txt
[root@centos8-8 ~]#
inotifywait的使用
- 在上述inotifywait的选项中有详细介绍
[root@centos8-8 www]# inotifywait -mrq --format "%T %w%f Event;%;e" --timefmt "%Y-%m-%d %H:%M" /data/www/
2019-10-18 11:10 /data/www/f2.txt Event;OPEN
2019-10-18 11:10 /data/www/f2.txt Event;MODIFY
2019-10-18 11:10 /data/www/f2.txt Event;CLOSE_WRITE;CLOSE
[root@localhost www]# echo >> f2.txt 当对f2.txt文件追时,出现上述输出
- 使用inotifywait可以实现对特定目录的文件进行状态监控。
rsync服务
-
以rsync命令的方式同步数据需要实现key验证
-
但是rsync还可以以服务的方式实现。
- rsync以独立服务的方式运行可以实现网络监控的作用,即rsync client端可以直接使用网络资源将数据发送至rsync server端
-
此处实现是测试rsync以服务的方式进行文件同步
-
规划:
centos7 192.168.38.17 rsync server
centos6 192.168.38.16 rsync client -
注:文件同步的方向:server端同步client端数据,即客户端发送数据给server端。
-
1.rsync包:
[root@centos7-17 ~]# rpm -qf `which rsync`
rsync-3.1.2-4.el7.x86_64
[root@centos7-17 ~]# rpm -ql rsync
/etc/rsyncd.conf
/etc/sysconfig/rsyncd
/usr/bin/rsync
/usr/lib/systemd/system/rsyncd.service 提供rsync服务
2.启动rsync服务
[root@centos7-17 ~]# systemctl status rsyncd 默认未启动
[root@centos7-17 ~]# systemctl start rsyncd
3.查看监听端口: TCP 873
[root@centos7-17 ~]# ss -tnlu
==> rsync监听tcp的873端口
4.配置 rsync 服务器端的配置文件
[root@centos7-17 ~]# vim /etc/rsyncd.conf
uid = root 定义rsync以root身份
gid = root
use chroot = no 不允许根切换
max connections = 0 最大连接数0,0表示不限制
ignore errors 忽略错误
exclude = lost+found/ 针对lost+found/不检查
log file = /var/log/rsyncd.log 记录日志
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no 对ip进行反向解析,no表示不解析
hosts allow = 192.168.38.8/24 允许的客户端访问列表
[backup] [backup]模块名,表示下面的模块属于[backup]模块
path = /data/backup/
comment = backup
read only = no
auth users = rsyncuser 不需要ssh服务,使用rsync提供的用户
secrets file = /etc/rsync.pass 密码建议存放至另一个文件,保证安全
5.服务器端生成验证文件
[root@centos7-17 ~]# echo "rsyncuser:centos" >/etc/rsync.pass
[root@centos7-17 ~]# chmod 600 /etc/rsync.pass
6.重启服务
[root@centos7-17 ~]# systemctl restart rsyncd
centos6启动rsync服务
[root@centos6 ~]#rpm -ql rsync
/etc/xinetd.d/rsync centos6的rsync是非独立服务
非独立服务的启动:
[root@centos6 ~]#yum install xinetd 先要保证xinetd服务的存在
[root@centos6 ~]#chkconfig rsync on
[root@centos6 ~]#service xinetd start
7.客户端配置密码文件
[root@centos6 ~]#echo centos>/etc/rsync.pass
[root@centos6 ~]#chmod 600 /etc/rsync.pass
7.客户端测试同步数据
~]# rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@rsync服务器IP::backup
利用此命令将 rsync client端的/data/目录的数据同步到rsync server端backup模块指定的路径中
[root@centos6 data]#rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@192.168.38.17::backup
注:rsync命令的源目录即数据目录/data
加不加/data/最后的斜线是由区别的。
注意:
-
rsync -a 192.168.38.8:/data/ /data/backup
- 加了目录末尾的斜线,只拷贝目录下的文件 等价于:/data/*
-
rsync -a 192.168.38.8:/data /data/backup
- 不加末尾的斜线,同步时会将/data目录一起同步
实时同步
- hostA centos7 192.168.38.17
- hostB centos8 192.168.38.8
- 将centos8的/data/www/目录下的所有文件同步至centos7的/backup/www/目录
- 只有centos8的/data/www/目录下的文件发生定义的变化,centos7自动同步
文件发生变化:文件内容变化、文件的创建删除、文件属性变化等等
centos7上部署:
rsync的服务器端,部署rsync服务即可
1.更改配置文件
[root@centos7-17 ~]# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 0
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
hosts allow = 192.168.38.0/24
[backup]
path = /backup/www/
comment = backup
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pass
2.创建文件传输时使用的rsyncuser用户
[root@centos7-17 ~]# cat /etc/rsync.pass
rsyncuser:centos
[root@centos7-17 ~]# chmod 600 /etc/rsync.pass 基于安全将目录权限设为600
3.创建同步目录
[root@centos7-17 ~]# mkdir /backup/www/ -pv
mkdir: created directory ‘/backup’
mkdir: created directory ‘/backup/www/’
centos8上部署:inotify-tools工具和作为rsync的客户端
即使用inotifywait监控需要监控的目录(生产中可能是基于文件共享的目录),有定义的文件变化,就触发数据同步
脚本准备阶段:
1.安装inotify-tools
[root@centos8-8 ~]# dnf install inotify-tools
2.生成rsyncuser用户使用的密码文件
[root@centos8-8 data]# echo centos > /etc/rsync.pass
[root@centos8-8 data]# chmod 600 /etc/rsync.pass
3.使用脚本实现
[root@centos8-8 data]# vim inotify_rsync.sh
#!/bin/bash
SRC='/data/www/'
DEST='rsyncuser@192.168.38.17::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
4.将脚本放置于后台并且与终端无关
[root@centos8-8 ~]# ( bash inotify_rsync.sh & )
[root@centos8-8 ~]# nohup /data/inotify_rsync.sh &>/dev/null &
还可以利用screen实现...
inotify+rsync实现文件同步总结:
-
1)rsync的同步机制是基于文件级别,即如果一个大文件中只是增加了一个字符,rsync会将整个文件重新拷贝一次。
- rsync只能知道文件发生了变化,但是不能具体文件内容哪部分变化。
-
2)基于脚本实现,在同步速率上,对于比较大的文件,同步时间可能较长。


被折叠的 条评论
为什么被折叠?



