linux/Mysql/系统运维

Rsync+Inotify 实现数据同步,双向同步,单向同步

daimafengzi · 6月4日 · 2024年 · · · · · 本文共3454个字 · 预计阅读12分钟1028次已读

基本了解

什么是rsync?

与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据
时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的
一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定
会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

什么是inotify?

Inotify
是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统
中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样
的一个第三方软件。
在上面章节中,我们讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

rsync+inotify同步逻辑图

Rsync+Inotify 实现数据同步,双向同步,单向同步

环境准备

服务器类型 IP地址 应用 操作系统
源服务器(数据源服务器),客户端 192.168.130.161 rsync inotify-tools 脚本 centos7/redhat7
目标服务器(备份服务器),服务端 192.168.130.160 rsync centos7/redhat7

Rsync+Inotify 实现数据同步,双向同步,单向同步

重要提示

关闭服务端和客户端的防护墙(不是必须,可以开放端口)、selinux(必须)。

#临时关闭
setenforce 0
#长久关闭---使用此方法。需要重启生效。所以可以先执行上面那句,再执行这句。就暂时可以不重启,先配置
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

如果未关闭,会提示错误:

rsync: failed to set times on "." (in backup): Permission denied (13)
rsync: recv_generator: failed to stat "ccc" (in backup): Permission denied (13)

目标服务器(备份服务器),服务端

一:安装rsycn

在Centos上只要一句代码而已,其他系统自己找。

yum install -y rsync

二:添加配置文件参数。

[root@server ~]# vim /etc/rsyncd.conf 
##日志文件位置.
log file = /var/log/rsyncd.log
##pid文件的存放位置
pidfile = /var/run/rsyncd.pid
##支持max connections参数的锁文件
lock file = /var/run/rsync.lock
##用户认证配置文件,用于保存用户名称和密码,必须手动创建
secrets file = /etc/rsync.pass

#自定义同步资源名称。
[qingjun]
#rsync服务端数据存放路径,客户端的数据将同步至此目录
path = /tmp/
comment = sync runtime from client
#设置rsync运行权限为root
uid = 0
#设置rsync运行权限为root
gid = 0
#默认端口
port = 873
#表示出现错误忽略错误
ignore errors
#默认为true,修改为no,增加对目录文件软连接的备份
use chroot = no
#设置rsync服务端为读写权限
read only = no
#不显示rsync服务端资源列表
list = no
#最大连接数
max connections = 200
#设置超时时间
timeout = 600
#执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
auth users = admin
#允许进行数据同步的源服务器IP地址,可以设置多个,用英文状态下逗号隔开
hosts allow = 192.168.0.0/24

三:创建用户认证文件,设置文件权限为600。

echo 'admin:123456' > /etc/rsync.pass 
chmod 600 /etc/rsync.pass 

四:启动服务,设置开机自启。

systemctl enable rsyncd
systemctl start rsyncd

五:验证是否监听端口

ss -antl

Rsync+Inotify 实现数据同步,双向同步,单向同步

源服务器(数据源服务器),客户端

一:安装rsycn

在Centos上只要一句代码而已,其他系统自己找。

yum install -y rsync

二:配置epel源,安装inotify-tools服务。

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
####################################
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
#######################################
yum -y install inotify-tools

二:创建认证密码文件,只需写密码,设置文件权限为600。

echo '123456' > /etc/rsync.pass
chmod 600 /etc/rsync.pass

三:创建同步目录runtime。

mkdir /runtime

四:进入同步目录创建文件,开始同步。

rsync -avH --port 873 --progress --delete /runtime [email protected]::qingjun --password-file=/etc/rsync.pass
说明:
rsync -avH --port 873 --progress --delete 源服务器需要同步到其他服务器的目录 admin@同步到哪个服务器IP::上面定义的同步模块 --password-file=/etc/rsync.pass

Rsync+Inotify 实现数据同步,双向同步,单向同步

五:服务端查看结果。

Rsync+Inotify 实现数据同步,双向同步,单向同步

六:自动同步

  • 1.写个脚本,给脚本设置开机启动执行。
  • #!/bin/bash
    host=192.168.130.160
    src=/runtime
    des=qingjun
    password=/etc/rsync.pass
    user=admin
    inotifywait=/usr/bin/inotifywait
    
    $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
            | while read files;do
        rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
            echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
    done
    

    保存上面脚本到你想存放的目录,这边就存放到了opt目录下

  • 2. 后台执行脚本。
  • nohup bash /opt/qingjun.sh &
  • 3. 添加到rc.local,实现开机自动启动这个脚本
  • Rsync+Inotify 实现数据同步,双向同步,单向同步
    OK完美收工!

    0 条回应