在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份的服务器特定目录中
实现实时同步的方法
inotify + rsync 方式实现数据同步
- 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
- 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
inotify 文件监控介绍
- 查看内核是否支持
[root@localhost ~]#ll -l /proc/sys/fs/inotify/
total 0
-rw-r–r--. 1 root root 0 Dec 20 19:20 max_queued_events
-rw-r–r--. 1 root root 0 Dec 20 19:20 max_user_instances
-rw-r–r--. 1 root root 0 Dec 20 19:20 max_user_watches
-
几个重要参数
max_queued_events:inotify事件队列最大长度,如值太小会出现 Event Queue Overflow 错
误,默认值:16384 —>100000
max_user_instances:每个用户创建inotify实例最大值,默认值:128
max_user_watches:可以监视的文件数量(单进程),默认值:8192---->1000000 -
修改方法
tips: 内存参数写入变量时/etc/systc.cof中以.代替路径/[root@centos7 ~]#vim /etc/sysctl.conf fs.inotify.max_queued_events=66666 fs.inotify.max_user_watches=100000 [root@centos7 ~]#sysctl -p fs.inotify.max_queued_events = 66666 fs.inotify.max_user_watches = 100000 [root@centos7 ~]#cat /proc/sys/fs/inotify/* 66666 128 100000
inotifywait安装与常用参数
[root@centos7 ~]yum -y install inotify-tools
- -m, --monitor 始终保持事件监听
- -d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
- -r, --recursive 递归监控目录数据信息变化
- -q, --quiet 输出少量事件信息
inotifywait 的–timefmt 时间格式
- 参考 man 3 strftime
- %Y 年份信息,包含世纪信息
- %m 显示月份,范围 01-12
- %d 每月的第几天,范围是 01-31
- %H 小时信息,使用 24小时制,范围 00-23
- %M 分钟,范围 00-59
范例:
--timefmt "%Y-%m-%d %H:%M"
inotifywait 的 --format 格式定义
- %T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
- %w 事件出现时,监控文件或目录的名称信息
- %e 显示发生的事件信息,不同的事件默认用逗号分隔
- %Xe显示发生的事件信息,不同的事件指定用X进行分隔
范例:
--format "%T %w%f event: %;e"
--format '%T %w %f'
inotifywait -e 选项指定的事件类型
- create 文件或目录创建
- delete 文件或目录被删除
- modify 文件或目录内容被写入
- attrib 文件或目录属性改变
- close_write 文件或目录关闭,在写入模式打开之后关闭的
- close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
- moved_to 文件或目录被移动到监控的目录中
- moved_from 文件或目录从监控的目录中被移动
- move 文件或目录不管移动到或是移出监控目录都触发事件
rsync服务端介绍
rsync 常用于做为 linux系统下的数据镜像备份工具,实现实现远程同步,支持本地复制,或者与其他
SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify
或sersync,可以实现触发式的实时数据同步
- 官方网站: http://rsync.samba.org/
- 软件包:rsync,rsync-daemon(CentOS 8)
- 服务文件:/usr/lib/systemd/system/rsyncd.service
- 配置文件:/etc/rsyncd.conf
- 端口:873/tcp
- 在centos7中,rsync包集成了服务文件
[root@localhost ~]#rpm -ql rsync | grep service
/usr/lib/systemd/system/rsyncd.service
/usr/lib/systemd/system/rsyncd@.service
rsync常用选项
- -a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
- -v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
- –delete #:以SRC为主,对DEST进行同步。多则删之,少则补之。注意"–delete"是在接收端执行的,所以它是在:exclude/include规则生效之后才执行的。
- –password-file #daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程
shell认证的密码,而是rsync模块认证的密码。 - –existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如
果上层目录不存在也不会传输。
inotify + rsync实现同步
客户端:192.168.30.10
服务器:192.168.30.11
客户端运行脚本实时监控本地文件变化并推送至服务器端
- 10客户端:
yum -y install inotify-tools
yum -y install rsync -->873/tcp
[root@10 ~]#vim inotify.sh
#!/bin/bash
SRC='/data/'
#从本机拷贝至于服务器的源目标
DEST='lee@192.168.30.11::backup'
#拷贝数据至服务器的目标IP和文件夹/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
#考本文件并记录日志
#将验证用户名密码写入配置文件
echo "123123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass #此为必要项
systemctl reastart rsyncd #启动服务
ss -nlt #873端口开启
mkdir /data #新建源数据文件夹
- 11服务器端配置:
yum -y install rsync#安装服务
useradd lee ; echo 123123 |passwd --stdin lee#新建用户lee,设置密码123123
[root@11 ~]#vim /etc/rsyncd.conf
uid = root #守护进程ID
gid = root
use chroot = no #必要项目可备份符号链接不需要root权限,缺点安全性低
max connections = 0 # 最大连接数,0代表不控制
ignore errors #备份时忽略没有权限文件
exclude = lost+found/ #指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中
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.30.10/32 #同步客户端网段
[backup]
path = /backup/ #自定义备份目录
comment = backup #自定义模块名
read only = no #允许客户上传文件
auth users = lee # 用户名
secrets file = /etc/rsync.pass #定义包含定义用户名:密码对的文件
#服务器端准备目录
mkdir /backup
#服务器端生成验证文件
echo "lee:123123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
#启动服务
systemctl start rsyncd #CentOS 7 以上版本
ss -nlt #873端口开启
以上配置完成,接下来进行验证:
客户端
bash inotify.sh #运行监控复制脚本
cd /data
touch 1.txt #新建测试文件
服务器端:
watch -n1 ls /backup/
#启动服务
systemctl start rsyncd #CentOS 7 以上版本
以上配置完成,接下来进行验证:
客户端
bash inotify.sh #运行监控复制脚本
cd /data
touch 1.txt #新建测试文件
服务器端:
watch -n1 ls /backup/
监控文件有变化则同步成功