实战经验分享,一招教你Linux下实时同步
在程序员的日常场景中经常会经常碰到文件共享同步的问题,比如:
- 集群,提供高可用服务(需要网站代码或者目录实时同步,保证数据的一致性)
- 迁移数据 (实时增量传输)
- 文件备份(实时将数据备份到其他设备,防止数据丢失)
今天跟大家分享一下针对以上场景实现在 Linux 系统下实现文件实时同步
黄金搭配:Rsync + Inotify

1. Rsync
Rsync 是 Linux 系统下的数据镜像备份工具,使用快速增量备份工具 Remote Sync 可以远程同步,支持本地复制,或者与其他SSH、Rsync 主机同步
1.1 Server端配置
环境介绍
操作系统:CentOS 6.8 rsync: rsync-3.0.6 (yum 源默认安装)

安装方式
sudo apt-get install rsync #debian、ubuntu 等在线安装方法; yum install rsync #Fedora、Redhat 等在线安装方法; rpm -ivh rsync # Fedora、Redhat 等rpm包安装方法; rpm -qa | grep rsync # 查看安装的版本
配置
创建相关配置目录和文件
mkdir -p /etc/rsync.d # rsync 配置文件目录,默认没有 touch /etc/rsync.d/rsyncd.conf # rsync服务端配置文件 touch /etc/rsync.d/rsyncd.pass # 客户端拉取文件时使用的用户密码 chmod 600 /etc/rsync.d/rsyncd.conf chmod 600 /etc/rsync.d/rsyncd.pass
编写主配置文件 rsyncd.conf
vim /etc/rsync.d/rsyncd.conf
(以下是配置文件)
log file=/var/log/rsyncd.log pid file=/var/run/rsyncd.pid lock file=/var/run/rsyncd.lock motd file = /etc/rsyncd/rsyncd.motd uid=root gid=root max connections=5 hosts allow=192.168.1.167 # 允许访问的IP地址,我这里填写的是测试的客户端地址 hosts deny=* secrets file = /etc/rsync.d/rsyncd.pass log = /var/log/rsyncd.log l og format = %t %a %m %f %b syslog facility = local3 timeout = 300 [handbook] path=/handbook/ comment= handbook test auth users=rsync

编写用户认证文件
vim /etc/rsync.d/rsyncd.pass
输入以下内容:
rsync:cloudcare

启动服务
rsync --daemon --config=/etc/rsync.d/rsyncd.conf
确认服务启动
ps -ef | grep rsync netstat -nltp | grep 7589
注:rsync 服务默认端口是 873

1.2 Rsync客户端
客户端配置很简单,只需要安装 rsync 工具即可
安装方式
sudo apt-get install rsync # debian、ubuntu 等在线安装方法; yum install rsync # Fedora、Redhat 等在线安装方法; rpm -ivh rsync # Fedora、Redhat 等rpm包安装方法; rpm -qa | grep rsync # 查看安装的版本
验证
示例: 将192.168.1.176 服务器上的 handbook (这里是定义的项目名称,可以参考rsync server 端的配置)项目同步到 192.168.1.167 的 /tmp 下
rsync -avzP rsync@192.168.1.176::handbook /tmp
说明: -a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件; -z 传输时压缩; -P 传输进度; -v 传输时的进度等信息

如果想每隔一段时间同步一次,可以配合 crontab 来实现;但是如果想实时同步,那就需要用到 inotify 工具了。
2.Inotify
Inotify 是 Linux 核心子系统之一,做为文件系统的附加功能,它可监控文件系统并将异动通知应用程序。摘自维基百科 可以配合Rsync 做实时同步,Inotify 通过监控文件的变化,然后触发同步脚本,实现实时同步。
实现的原理:

实验目的
将 192.168.1.167 的 /handbook 目录下的内容实时同步到 192.168.1.176 定义的 “handbook” 目录下(实验环境依旧采用上面的老环境)
拓扑环境

安装
yum install -y inotify-tools
注:inotify 其实不需要任何的配置,安装好之后默认有两个命令;inotifywait : 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生inotifywatch :收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
使用
检测创建事件
inotifywait -mrq /handbook/ cd /handbook/ touch 1

检测删除事件
inotifywait -mrq /handbook --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事 件 息: %e" -e delete cd /handbook/ rm -rf 1 4

编写实时同步脚本
more rsync-handbook.sh
#!/bin/bash inotifywait -mrq /handbook/ --format "%w%f" -e create,delete,moved_to,close_write | while read line do rsync -az /handbook/ rsync@192.168.1.176::handbook --password-file=/root/handbook.pw done
注: 其中--password-file 是指定 “handbook” 模块认用户认证的密码文件
验证

相关推荐
-
nginx检查提示“unknown directive "stream" in /etc/*/nginx.conf”
nginx检查提示“unknown directive "stream" in /etc/*/nginx.conf”2025-02-26 00:38:21 -
php之多级目录下查找文件中是否含有某个字符串功能实现2025-02-26 00:36:35
-
mysql 启动不了1067错误如何解决?2025-02-26 00:33:31
-
MySQL简单INSERT超慢原因排查2025-02-26 00:22:42
-
mysql分布式数据库的主要构架是什么?2025-02-26 00:06:23