rsync+inotify 实现数据实时同步

  • Rsync(远程同步,Remote Sync)是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具,并且可以不进行改变原有数据的属性信息,实现数据的备份迁移特性。
  • Rsync软件适用于unix/linux/windows等多种操作系统平台。支持本地复制,或者与其他SSH、Rsync主机同步。
  • rsync第一次会全量传输,后续会对比两个文件的不同,只传输文件更新的部分,传输速度比一般工具快。

rsync与cp、scp对比

cp 命令

cp(copy)是最基础的文件复制命令,用于在本地文件系统内复制文件或目录。它将源文件或目录完整地复制到指定的目标位置。cp 不支持远程文件操作,仅限于同一台机器上的文件操作。

特点:

  • 全量复制 :每次执行 cp 命令时都会将整个文件或目录完全复制一遍。
  • 本地操作:只能在当前机器上的文件系统内部工作。
  • 简单易用:提供了基本的文件管理功能。

scp 命令

scp(secure copy)是一个基于 SSH 协议的安全文件复制工具,用于在两台机器之间安全地传输文件。scp 通常用于远程文件复制,但它也可以在本地文件系统间使用。

特点:

  • 安全性:使用 SSH 协议进行加密传输,保证数据安全。
  • 全量复制 :类似于 cp,每次执行都会完整地复制文件。
  • 远程操作:支持通过网络在不同主机之间传输文件。
  • 较慢的增量复制 :虽然可以实现远程文件复制,但对于大文件或频繁更新的文件集来说,效率不如 rsync

rsync 命令

rsync 是一种高级的文件同步工具,它不仅支持本地文件复制,还支持远程文件复制。rsync 的最大特点是它的增量数据传输能力,这意味着它只会传输自上次同步以来发生变化的部分数据。

特点:

  • 增量更新:仅传输文件变化的部分,而不是整个文件。
  • 本地与远程操作:既可以用于本地文件系统的操作,也可以用于远程文件系统之间的同步。
  • 高效性:特别适合用于频繁更新的大文件集的同步,因为只需要传输变化的数据。
  • 可配置性强:提供了丰富的选项来控制同步行为,如排除某些文件、保持权限等。

对比总结

  • 性能方面 :对于首次同步或文件较小的情况,scp 可能会更快,因为它不需要进行额外的压缩或计算差异;但对于重复同步或文件较大的情况,rsync 由于采用了增量同步机制,效率更高。
  • 安全性方面scp 自动通过 SSH 提供加密传输,而 rsync 需要通过 -e ssh 参数来实现相同的安全级别。
  • 灵活性方面rsync 提供了更多的配置选项,使其更加灵活,适用于更多复杂的同步场景。
  • 应用场景cp 适用于简单的本地文件复制;scp 适用于需要安全传输的场合;rsync 则更适合需要高效、增量同步的环境,尤其是在处理大量数据或频繁更新的文件系统时表现优异。

rsync详解

rsync 监听端口:873

默认情况下,rsync 服务在 TCP 端口 873 上监听连接请求。

rsync 运行模式:C/S

在 C/S 模式中,服务器端持续运行并等待客户端的同步请求。客户端则主动发起同步操作。

复制代码
在远程同步任务中,负责发起 rsync 同步操作的客户机称为发起端,而负责响应来自客户机的 rsync 同步操作的服务器称为同步源。
rsync同步源:指备份操作的远程服务器,也称备份源。

下行同步:下行同步是将文件从远程或源端同步到本地或目标端。
在下行同步(下载)中,同步源负责提供文档的原始位置,发起端应对该位置有读取权限。
​
上行同步:上行同步是将文件从本地或源端同步到远程或目标端。
在上行同步(上传)中,同步源负责提供文档的目标位置,发起端应对该位置具有写入权限。

适用语法

Matlab 复制代码
rsync [选项] 原始位置 目标位置
       rsync [OPTION]... SRC [SRC]... DEST
  或   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
  或   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  或   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
  或   rsync [OPTION]... [USER@]HOST:SRC [DEST]
  或   rsync [OPTION]... [USER@]HOST::SRC [DEST]
  或   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
常用选项:
-r  递归模式,包含目录及子目录中的所有文件
-l  对于符号链接文件仍然复制为符号链接文件
-v  显示同步过程的详细信息
-z  在传输文件时进行压缩
-a  归档模式,保留文件的权限、属性等信息,等同于组合选项"-rlptgoD"
-p  保留文件的权限标记
-t  保留文件的时间标记
-g  保留文件的数组标记 (仅超级用户使用)
-o  保留文件的属主标记(仅超级用户使用)
-H  保留硬链接文件
-A  保留ACL属性信息
-D  保留设备文件及其他特殊文件
--delete 删除目标位置有而原始位置没有的文件
--checksum   根据校验和(而不是文件大小,修改时间)来决定是否跳过文件
--progress 显示备份过程

配置源的两种表达方法

复制代码
格式一:
用户名@主机地址::共享模块名
rsync -avz user_name@192.168.209.22::www /opt/
​
格式二:
rsync://用户名@主机地址/共享模块名
rsync -avz rsync://user_name@192.168.209.22/www /opt/

更多的rsync参数

Matlab 复制代码
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输 #断点续传
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息

rsync手动同步数据

准备两台机器

角色 主机
master-A 192.168.209.168
master-B 192.168.209.169

将master-A上面的数据实时的同步到master---B上面去做到异地备份

先操作目标主机

Matlab 复制代码
[root@master-b ~]# rpm -qa | grep rsync 
[root@master-b ~]# yum provides rsync
[root@master-b ~]# yum install -y rsync-3.1.2-12.el7_9.x86_64
[root@master-b ~]# mv /etc/rsyncd.conf /etc/rsyncd.conf.bak
[root@master-b ~]# vim /etc/rsyncd.conf #注意行尾不要有空格!
log file = /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
secrets file = /etc/rsync.pass  #用户的认证文件
[data]   #共享模块的名称,rsync默认调用模块,自定义默认调用路径
path = /var/lib/mysql  ##同步目录(同步过来后的目标路径)
auth users = jack   #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开(认证用户)
uid = root     #工作中指定用户(可以不指定为0)
gid = root     #工作中指定用户(可以不指定为0)
port = 873     #默认端口号为873
ignore errors   #表示出现错误忽略错误
use chroot = yes    #开启禁锢在源目录,允许在访问备份目录或文件时,使用root角色,访问本地目录时拥有root权限
read only = no   #关闭只读模式,否则将不可写入
max connections = 200   #自定义同时传文件客户端数量
timeout = 300           #超时时间
hosts allow = 192.168.157.0/24 #允许数据同步的客户端IP或网络,
可以设置多个,用英文状态下逗号隔开,类似白名单
复制代码
创建认证用户
Matlab 复制代码
[root@master-b ~]# useradd jack 
[root@master-b ~]# passwd jack 
创建用户认证文件
[root@master-b ~]# vim /etc/rsync.pass
jack:123456 
#格式,用户名:密码,可以设置多个,每行一个用户名:密码
设置文件权限
[root@master-b ~]# chmod 600 /etc/rsync.pass 
[root@master-b ~]# chmod 600 /etc/rsyncd.conf
[root@master-b ~]# systemctl start rsyncd
[root@master-b ~]# systemctl enable rsyncd

在源机器上面操作

Matlab 复制代码
[root@master-a ~]# rpm -qa | grep rsync
[root@master-a ~]# yum install -y rsync-3.1.2-12.el7_9.x86_64
[root@master-a ~]# vim /etc/rsync.password
1    # 这里是服务器端jack用户的密码
[root@master-a ~]# chmod 600 /etc/rsync.password 
            #文件需要600的权限
[root@master-a ~]# systemctl start rsyncd
[root@master-a ~]# systemctl enable rsyncd

测试

Matlab 复制代码
[root@master-a ~]# mysql -uroot -p'Yunjisuan@666'
mysql> create database db2;
Query OK, 1 row affected (0.00 sec)
​
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db4                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)
​
mysql> \q
​
[root@master-a ~]# rsync -arvH --port=873 --delete --progress /var/lib/mysql/* jack@192.168.157.133::data --password-file=/etc/rsync.password
​
验证
[root@master-b mysql]# fg
mysql -uroot -p'Yunjisuan@666'
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db4                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

​ 以上rsync同步成功!下面结合inotify实现实时同步。

inotify

监控文件系统的变动情况,并做出通知响应,在源服务器上面执行。安装Inotify-tools工具,实时触发rsync进行同步,查看服务器内核是否支持inotify。

复制代码
实时同步的优点:一旦同步源出现变化,立即启动备份;只要同步源无变化,则不执行备份。

inotifywait

用于持续监控,实时输出结果(常用)

bash 复制代码
格式:inotifywait -mrq -e 监控动作1,监控动作2  /监控目录 &
示例:inotifywait -mrq -e create,delete /filesrc &
参数:
    -m:始终保持事件监听状态
    -r:递归查询目录
    -q:只打印监控事件的信息
-e create,move,delete,modify,attrib 监听 "创建 移动 删除 写入 权限" 事件

inotify安装

一共安装了2个工具(命令),即inotifywait和inotifywatch。

inotifywait和inotifywatch的作用

inotifywait : 可监控modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果 执行后处于阻塞状态,适合在shell脚本中使用。

inotifywatch :收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。

Matlab 复制代码
[root@master-a ~]# ll /proc/sys/fs/inotify/
#列出文件目录,出现下面的内容,说明服务器内核支持inotify,
注:Linux下支持inotify的内核最小为2.6.13
total 0
-rw-r--r-- 1 root root 0 Jul 28 21:03 max_queued_events
-rw-r--r-- 1 root root 0 Jul 28 21:03 max_user_instances
-rw-r--r-- 1 root root 0 Jul 28 21:03 max_user_watches
[root@master-a ~]# rpm -qa inotify-tools
# 安装阿里扩展源
[root@master-a ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 
[root@master-a ~]# yum install -y inotify-tools
# 查看inotify安装上的两个命令(inotifywait,inotifywatch)
[root@master-a ~]# rpm -ql inotify-tools
/usr/bin/inotifywait
/usr/bin/inotifywatch
...

inotify默认参数

/proc/sys/fs/inotify目录下有三个文件,记录inotify的内核参数的文件,inotify默认内核参数值太小。

临时更改用echo 命令加上值给重定向到这个文件中。永久修改需要修改编辑/etc/sysctl.conf。

文件 默认值 作用说明
max_user_watches 8192 inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances 128 每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events 16384 inotify实例事件队列可容纳的最大事件数量
Matlab 复制代码
修改参数:
[root@master-a ~]# vim /etc/sysctl.conf
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
[root@master-a ~]# sysctl -p
参数说明:
max_queued_events:
inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
max_user_watches:要同步的文件包含多少目录,find /home_test -type d | wc -l 统计,
必须保证max_user_watches值大于统计结果(这里/home_test为同步文件目录)
max_user_instances:每个用户创建inotify实例最大值

rsync+inotify单向实时同步

bash 复制代码
vim /root/sync-inotify/inotify.sh  #编写脚本
#!/bin/bash
Path="/var/lib/mysql/"
backup_Server="192.168.157.133"
#excludedir="/root/exclude.list"
user="jack"
pass_file="/etc/rsync.password"
module="data"

/usr/bin/inotifywait -mrq -e create,modify,delete,close_write "$Path" | while read line
do
    if [ -f "$line" ]; then
        /usr/bin/rsync -arH --port=873 --delete --progress "$line" "$user@$backup_Server::$module" --password-file="$pass_file"
    else
        cd /var/lib/mysql && \
        /usr/bin/rsync -arH --port=873 ./ --delete --progress "$user@$backup_Server::$module" --password-file="$pass_file"
    fi
done

测试

Matlab 复制代码
​[root@master-a sync-inotify]# sh -x inotify.sh # 检查语法
#启动同步脚本,放入后台运行,并且输出执行变量。
​[root@master-a sync-inotify]#nohup bash -x src.sh &  
​[root@master-a sync-inotify]# crontab -e
*/1 * * * * /bin/bash /root/sync-inotify/inotify.sh >/dev/null 2>&1 &
​[root@master-a sync-inotify]# tailf /var/log/cron #可以看到执行
Sep  9 15:11:01 java-web-2 CROND[2357]: (root) CMD (/bin/bash /root/inotify.sh > /dev/null 2>&1 &)

当然,这里测试只需要在master-a服务器上创建一个库,登录matser-b可以查看到新建的库,
即成功

脚本参数解释

Matlab 复制代码
rsync -azH $line --delete --progress --exclude-from=$excludedir $user@$backup_Server::$module --password-file=$pass_file
脚本参数参数详解:
excludedir=/root/exclude.list   
#不需要同步的目录,如果有多个,每一行写一个目录,使用相对于同步模块的路径;
#例如:不需要同步/home_test目录下的a目录和b目录下面的b1目录,exclude.list文件可以这样写
a/
b/b1/
--exclude-from=FILE 排除FILE中指定模式的文件

面试

支持断点续传的服务(命令)

wget,curl,rsync

Matlab 复制代码
(1) wget
wget -c http://example.com/largefile.iso
支持通过 -c 或 --continue 选项从上次中断的地方继续下载。
(2)curl
curl -C - -O http://example.com/largefile.iso
-C - 或 --continue-at - 选项从上次断开的位置继续下载。
-O 选项用于保存文件名为远程文件名。
(3)rsync
在文件传输过程中如果网络中断或者由于其他原因导致传输失败,
rsync 可以通过对比源文件和目标文件的差异来完成断点续传。
rsync -avz --partial source:/path/to/file destination:/path/to/
--partial 保留部分下载的文件,下次传输时会继续。
(4)scp(Secure Copy):
scp 实际上并不支持真正的断点续传,但它可以通过 -r 或 --recursive 选项递归复制目录。
如果用户需要在 scp 中实现类似的功能,通常的做法是先停止传输,然后重新启动,
利用文件系统的特性来完成未完成的部分。这并不是真正的断点续传,而是依赖于文件系统的一致性。
示例:
scp -r user@remote:/path/to/source /local/path/to/destination
(5)lftp
lftp 是一个功能强大的 FTP 和 HTTP 客户端,它支持多种协议,包括 FTP、HTTP、HTTPS 等。
支持通过 mirror 命令的 --continue 选项来恢复未完成的下载。
示例:
lftp -c "open ftp.example.com; mirror --continue /remote/path /local/path"
相关推荐
SelectDB20 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉6 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造