【云原生】rsync+inotify数据实时同步介绍与k8s实战应用
一、rsync概述
rsync(remote sync)
远程同步,rsync
是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。已支持跨平台,可以在Windows与Linux间进行数据同步。 rsync监听端口:873
,rsync运行模式:C/S
。
官网:https://rsync.samba.org/
官方文档:https://www.samba.org/ftp/rsync/rsync.html
GitHub地址:https://github.com/WayneD/rsync
二、rsync优缺点
1)优点
- 可以镜像保存整个目录树和文件系统;
- 可以做到保持原来文件的权限、时间、软硬链接等等;
- 无须特殊权限即可安装;
- 可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能;
- 可以使用rcp、ssh等方式来传输文件,rsync本身不对数据加密;
- 支持匿名传输,可以实现方便安全的进行数据备份和镜像;
- 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高;
- 可以通过socket(进程方式)传输文件和数据。
2)缺点
- 同步数据,需要扫描所有文件进行对比,才进行差量传输。如果文件数量达到百万甚至千万级,扫描文件对比文件将非常耗时,降低了rsync效率;
- rsync不能实时地区监测、同步数据。虽然可以通过守护进程方式触发同步,但两次动作间有时间差,导致数据不一致,无法应对出现故障时完全恢复数据。
解决方法:rsync+inotify
三、rsync+inotify配置与安装
IP | 主机名 | 角色 |
---|---|---|
192.168.0.113 | k8s-master-168-0-113 | rsync、 inotify-tools【数据源】 |
192.168.0.116 | k8s-master2-168-0-116 | rsync【备份节点】 |
1)rsync安装
yum -y install rsync
2)rsync配置
cat >/etc/rsyncd.conf<<EOF
uid = root
gid = root
#禁锢在源目录
use chroot = yes
#监听地址,在另外的机器上,记得修改
address = 192.168.0.113
#监听地址tcp/udp 873,可通过cat /etc/services | grep rsync查看
port 873
#日志文件位置
log file = /var/log/rsyncd.log
#存放进程 ID 的文件位置
pid file = /var/run/rsyncd.pid
#允许访问的客户机地址
hosts allow = 192.168.0.0/16
#共享模块名称
[nfsdata]
#源目录的实际路径
path = /opt/nfsdata
comment = Document Root of www.kgc.com
#指定客户端是否可以上传文件,默认对所有模块为 true
read only = false
#同步时不再压缩的文件类型
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
#授权账户,多个账号以空格分隔,不加则为匿名,不依赖系统账号
auth users = backuper
#存放账户信息的数据文件
secrets file = /etc/rsyncd_users.db
EOF
rsyncd.conf 常用参数详解
rsyncd.conf 参数 | 参数说明 |
---|---|
uid=root | rsync 使用的用户。 |
gid=root | rsync 使用的用户组(用户所在的组) |
use chroot=no | 如果为 true,daemon 会在客户端传输文件前“chroot to the path”。这是一种安全配置,因为我们大多数都在内网,所以不配也没关系 |
max connections=200 | 设置最大连接数,默认 0,意思无限制,负值为关闭这个模块 |
timeout=400 | 默认为 0,表示 no timeout,建议 300-600(5-10 分钟) |
pid file | rsync daemon 启动后将其进程 pid 写入此文件。如果这个文件存在,rsync 不会覆盖该文件,而是会终止 |
lock file | 指定 lock 文件用来支持“max connections”参数,使得总连接数不会超过限制 |
log file | 不设或者设置错误,rsync 会使用 rsyslog 输出相关日志信息 |
ignore errors | 忽略 I/O 错误 |
read only=false | 指定客户端是否可以上传文件,默认对所有模块为 true |
list=false | 是否允许客户端可以查看可用模块列表,默认为可以 |
hosts allow | 指定可以联系的客户端主机名或和 ip 地址或地址段,默认情况没有此参数,即都可以连接 |
hosts deny | 指定不可以联系的客户端主机名或 ip 地址或地址段,默认情况没有此参数,即都可以连接 |
auth users | 指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在。默认为所有用户无密码访问 |
secrets file | 指定用户名和密码存放的文件,格式;用户名;密码,密码不超过 8 位 |
[backup] | 这里就是模块名称,需用中括号扩起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护 |
path | 这个模块中,daemon 使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题 |
配置/etc/rsyncd_users.db,跟auth users对应 |
cat >/etc/rsyncd_users.db<<EOF
backuper:123456
EOF
#官方要求,必须赋权600,要不然会有问题
chmod 600 /etc/rsyncd_users.db
rsync常用命令参数详解
rsync --help
rsync [选项] 原始位置 目标位置
常用选项 说明
-r 递归模式,包含目录及子目录中的所有文件
-l 对于符号链接文件仍然复制为符号链接文件
-v 显示同步过程的详细信息
-z 在传输文件时进行压缩goD
-p 保留文件的权限标记
-a 归档模式,递归并保留对象属性,等同于-rlpt
-t 保留文件的时间标记
-g 保留文件的属组标记(仅超级用户使用)
-o 保留文件的属主标记(仅超级用户使用)
-H 保留硬链接文件
-A 保留ACL属性信息
-D 保留设备文件及其他特殊文件
--delete 删除目标位置有而原始位置没有的文件
--checksum 根据对象的校验和来决定是否跳过文件
3)启动rsync服务
rsync --daemon --config=/etc/rsyncd.conf
netstat -tnlp|grep :873
4)测试验证
# 在192.168.0.116节点上测试手动同步
# 从远端【拉取】数据
rsync -avz root@192.168.0.113:/opt/nfsdata/* /opt/nfsdata/
# 在192.168.0.113节点上测试手动同步
# 从【推送】数据
rsync -avz /opt/nfsdata/* root@192.168.0.116:/opt/nfsdata/
### 在192.168.0.116节点上测试手动同步,通过【拉取】数据,配置文件配置的模块,这里走的是rsync协议,上面走的是ssh协议,只要做了免密就直接推送或拉取数据了。这里就会用到配置文件里配置的users用户了,也是secrets file文件里配置的其中一个用户。
#【方式一】
rsync -avz backuper@192.168.0.113::nfsdata /opt/nfsdata/
# 【方式二】
rsync -avz rsync://backuper@192.168.0.113/nfsdata /opt/nfsdata/
# 在192.168.0.113节点上执行
###【推送】
#【方式一】非交互式,/opt/backuper.pass文件是backuper用户的密码,且文件权限600
rsync -avz --password-file=/opt/backuper.pass /opt/nfsdata/* backuper@192.168.0.113::nfsdata
# 【方式二】
rsync -avz /opt/nfsdata/* rsync://backuper@192.168.0.113/nfsdata
5)编译安装 inotify-tools
1、inotify-tools概述
-
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。
-
linux内核从 2.6.13 起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
-
inotify可用于检测单个文件,也可以检测整个目录。当检测的对象是一个目录的时候,目录本身和目录里的内容都会成为检测的对象。
在192.168.0.113机器上安装
2、优化inotify内核参数
在/proc/sys/fs/inotify
目录下有max_queued_events、max_user_instances、max_user_watches
这三个文件
-
max_queued_events
:表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件; -
max_user_instances
:表示每一个用户可创建的inotify instatnces的数量上限,默认128; -
max_user_watches
:表示同一用户同时可以添加的watch数量。
echo 65535 > /proc/sys/fs/inotify/max_user_instances
echo 99999999 > /proc/sys/fs/inotify/max_queued_events
echo 99999999 > /proc/sys/fs/inotify/max_user_watches
3、inotify-tools下载
# 安装inotify-tools之前,先安装一下automake和libtool这两个依赖,不然编译安装inotify-tools的时候会报错。
yum install automake libtool -y
# 当然也得安全编译工具
yum -y install gcc gcc-c++ make wget
mkdir /opt/software ; cd /opt/software
wget --no-check-certificate https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
# 解压
tar -zxvf inotify-tools-3.14.tar.gz
4、inotify-tools编译安装
cd /opt/software/inotify-tools-3.14
# 编译安装
./configure && make && make install
5、编写触发式同步脚本
vi /opt/software/inotify-tools-3.14/inotify_rsync.sh
#!/bin/bash
#监听/opt/nfsdata/ 目录:
#INOTIFY_CMD变量:持续监控 /opt/nfsdata/ 目录中的创建,删除,移动,修改,改变时间的操作
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /opt/nfsdata"
# 注意/tmp/user.pass文件里只有backuper对应的密码,而且文件权限只能是600
RSYNC_CMD="rsync -avzH --delete --password-file=/opt/backuper.pass /opt/nfsdata/* backuper@192.168.0.116::nfsdata"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
$RSYNC_CMD
done
inotifywait命令常用参数:
执行
cd /opt/software/inotify-tools-3.14/
chmod +x inotify_rsync.sh
# 启动脚本
nohup ./inotify_rsync.sh &
rsync+inotify数据实时同步介绍与实战就到这里了,有疑问的小伙伴欢迎给我留言哦~