【云原生】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数据实时同步介绍与实战就到这里了,有疑问的小伙伴欢迎给我留言哦~

posted @ 2022-08-23 22:13  大数据老司机  阅读(739)  评论(0编辑  收藏  举报