Linux服务器间文件实时同步的实现
使用场景
现有服务器A和服务器B,如果服务器A的指定目录(例如 /home/paul/rsync/
)中的内容发生变更(增删改和属性变更),实时将这些变更同步到服务器B的目标目录中(例如 /home/paul/rsync/
)。
数据镜像备份工具Rsync
Rsync是一个非常快速和灵活的文件复制工具。它支持本机或者是和远程服务器间的文件复制。Rsync使用了delta-transfer算法,它只需要传送源端和目标端的文件差异部分,大大减少了网络带宽的消耗和复制耗费的时间。Rsync多用于数据备份和镜像。
Rsync使用了快速检查算法,通过比较文件大小或最后修改时间的变化来判断文件是否需要同步。
Rsync连接远程主机有两种方式:使用ssh或rsync daemon。这里使用Rsync方式来实现远程文件备份。
Rsync的安装与操作
安装Rsync
sudo yum install rsync
安装完毕后,会发现rsync的配置文件位于 etc/rsyncd.conf 。该文件使用daemon方式同步时需要使用,此处暂不介绍。
配置服务器A和B之间的免密登录
服务器A执行:
ssh-keygen
ssh-copy-id 服务器B的IP地址
创建源端目录和目标端目录
在服务器A中:
mkdir /home/paul/rsync
在服务器B中:
mkdir /home/paul/rsync
在服务器A创建测试文件
echo "Hello from Server A" /home/paul/rsync/demo.txt
执行文件传送命令
在服务器A运行:
# (1)
rsync -avPz --progress /home/paul/rsync 192.168.100.130:/home.paul/rsync
# (2)
rsync -avPz --delete --progress /home/paul/rsync 192.168.100.130:/home.paul/rsync
会发现在demo.txt也出现在了服务器B中/home/paul/rsync目录。
命令解析:
(1) 将服务器A中的/home/paul/rsync目录内的文件复制到服务器B(192.168.100.130)的/home.paul/rsync中。
(2) 比较目标端和源端的文件,如果目标端的文件在源端不存在,在目标端删除该文件。
Rsync存在的问题
Rsync仅是一个文件复制工具,它无法对源端文件的增删改操作进行监听。在源端做出更改后,需要执行rsync命令才能将变更同步到目标端。
Rsync在每次同步前需要扫描整个目录。如果源目录内的文件数量比较多,扫描可能需要耗费较多的时间。 为了满足实时监听的要求,我们需要引入另一个工具:inotify。
文件系统事件监听工具inotify
inotify-tools为inotify提供一个简单接口。它是一个c语言编写的库,同时也包含命令行工具。
inotify-tools的详细介绍请点击: https://github.com/rvoicilas/inotify-tools/wiki
inotify-tools的安装
对于centos7系统,依次执行:
yum install -y epel-release
yum --enablerepo=epel install inotify-tools
使用inotifywait命令进行事件监听
监听脚本如下(inotifywait-rsync.sh):
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib /home/paul/rsync/ | while read file
do
rsync -avPz --progress /home/paul/rsync/ 192.168.100.130:/home/paul/rsync/
rsync -avPz --delete /home/paul/rsync/ 192.168.100.130:/home/paul/rsync/
echo "${file} was synchronized"
done
参数解析
- -m 保持持续监听状态,如果不写该参数,inotifywait会在监听到一次事件之后退出。
- -r 递归方式监听目录。
- -q 安静模式,打印输出较少的内容。
- –timefmt 指定时间的输出格式。
- –format 指定事件输出的格式。
- -e 设置监听的事件类型。这里监听增删改和metadata的变更。
对于每次触发的监听时间,inotifywait会执行do和done之间的代码。在这里,我们调用之前所说的rsync命令进行文件同步。
监听脚本加入crontab
crontab -e
* * * * * sh /home/paul/inotifywait-rsync.sh
参考资料 https://rsync.samba.org https://github.com/rvoicilas/inotify-tools/wiki
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网站事(zalou.cn)。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- web基础随笔
- 一次完整的JVM堆外内存泄漏故障排查记录
- ToughRADIUS 结合 Ldap 实现动态密码认证和MAC认证
- coscmd的应用
- scheduler-设计与实现
- 3分钟短文:太爽了,用Laravel写API接口!
- Spring mvc文件上传实现
- 「Mysql优化大师三」查询执行计划explain详解,含案例
- flutter BottomAppBar实现不规则底部导航栏
- Yarr:一个UI很漂亮的RSS阅读器
- kotlin Standard中的内联函数示例详解
- 解决react-native软键盘弹出挡住输入框的问题
- flutter编写精美的登录页面
- Flutter实现App功能引导页
- Flutter底部不规则导航的实现过程