rsync + sersync 实现文件实时同步的完整配置详解【一】

一、前言

在日常运维和系统架构中,我们经常会遇到这样的场景:多个服务器之间需要保持文件的一致性——比如 Web 服务器集群中,用户上传的图片、附件需要实时同步到所有节点;又或者在灾备方案中,关键数据需要自动复制到备用服务器。这时候,一个高效、稳定、近乎实时的文件同步机制就显得尤为重要。

今天,就来给大家介绍一个在生产环境中广泛使用的文件同步组合方案:rsync + sersync。它不仅能实现文件的实时备份与分发,还能在不影响业务的前提下,最大限度地减少网络开销、提升系统可靠性。相比传统的定时同步或网络挂载方式,这套方案更具灵活性和容错能力。接下来,我们将从原理到实战,一步步带你搭建属于你的高效同步服务。

问题

“既然可以用挂载(比如 NFS、SMB)让多台服务器共享同一个文件夹,那为啥还要用 rsync + sersync 做文件同步?直接挂载不就完事了吗?”


二、两者比较

想象你有两个办公室(比如北京和上海),每个办公室都有一个文件柜。

✅ 挂载(NFS/SMB)

你在北京的办公室装了一个“远程透明柜子”。
这个柜子实际上在上海,但你在北京打开它时,看起来就像在本地一样。

  • 你放一份文件进去,上海那边立刻就能看到。
  • 听起来很棒,对吧?

⚠️ 但问题来了:

  • 如果网络断了,你的柜子就打不开了,工作直接卡住。
  • 你每次拿文件,都要从上海“实时拉过来”,如果网络慢,就会卡、卡、卡……
  • 上海的柜子如果坏了,北京这边也完全不能用。

👉 这叫强依赖:你的工作完全依赖上海那个柜子和网络。


✅ rsync + sersync

你在北京和上海各放一个独立的柜子
然后你请了一个“勤快的快递员”(sersync):

  • 他在北京柜子旁边站岗,一看到你放了新文件或修改了文件,就马上打包,用最快的方式(rsync)寄到上海。
  • 上海收到后,立刻更新自己的柜子。

结果是:

  • 北京和上海的柜子内容几乎一样,但它们是独立的
  • 即使网络断了10分钟,北京还能正常工作,等网络恢复,快递员再把变化补上。
  • 上海的柜子坏了?北京的还在,不影响你写文件。

核心区别是:

方式挂载(NFS/SMB)rsync + sersync
文件是共享的还是复制的?共享一个(只有一份)复制多份(每台都有)
网络断了还能用吗?❌ 不能,卡住✅ 能,本地照常工作
性能受网络影响大吗?❌ 大,每次读写都要走网络✅ 小,只在变化时同步
安全性/容灾性低,一坏全坏高,分散风险
实时性✅ 实时⭕ 几乎实时(秒级延迟)

使用举例

假设你有个网站,部署在两台服务器上(做负载均衡)。

  • 如果你用 NFS 挂载一个共享目录放图片,那么:

    • 两台服务器都从同一个地方读图片。
    • 但一旦 NFS 服务器挂了,两台网站都打不开图片,甚至可能报错。
  • 如果你用 rsync + sersync

    • 用户上传图片到服务器A,sersync 发现变化,立刻同步到服务器B。
    • 即使NFS没挂,但网络抖动,服务器B也能用自己的本地图片继续服务。
    • 一台服务器坏了,另一台照样运行。

挂载是“大家一起用一个柜子”,而 rsync + sersync 是“每人一个柜子,有人自动帮你复制更新”。

你选哪个,取决于你更看重实时方便,还是稳定可靠

如果你的系统要求高可用、容灾、抗网络波动,那就用 rsync + sersync
如果只是内部小团队共享文件,网络稳定,那就挂载更简单。

三、开始搭建

在这里插入图片描述

1. rsync+sersync同步服务安装

官网下载地址:https://www.techwarrant.com/software-update-rsync-3-2-3/

在这里插入图片描述

在这里插入图片描述

2. 修改配置文件

rsyncd.conf

修改 需要同步路径、同步的远程IP

# /etc/rsyncd: configuration file for rsync daemon mode
uid = root
gid = root
use chroot = no                          # 安全相关
max connections = 2000                   # 并发连接数
timeout = 600                            # 超时时间(秒)
pid file = /var/run/rsyncd.pid          
lock file = /var/run/rsync.lock           
log file = /var/log/rsyncd.log 
ignore errors 
read only = false
list = false
auth users = test
secrets file = /etc/rsync.password 
#需要创建对应的用户密码文件,并放置到指定目录,我这里是在/etc

[plat]
comment = plat
# 同步路径
path = remote-path
# 同步IP
hosts allow = remote-ip
// 模块说明名称,两台机器一致即可
comment = plat

// 同步路径
path = remote-path

// 同步IP
hosts allow = remote-ip
confxml.xml

修改 同步路径(remote-path),同步的远程IP(remote-ip)

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="false"/>  <!-- ???? -->
    <filter start="false">  <!-- ????????? -->
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>  <!-- ??????? -->
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="true"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="false"/>
    </inotify>
 
    <sersync>
    <localpath watch="remote-path">  <!-- 修改远程挂载路径 -->
        <remote ip="remote-ip" name="plat"/>  <!--远程挂载IP-->
    </localpath>
    <rsync>
        <commonParams params="-artuz"/>  <!--??????,???????????-->
        <auth start="true" users="test" passwordfile="/etc/rsync.passwordNlp"/>
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="false" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once  ????60????????-->
    <crontab start="false" schedule="600"><!--600mins-->
        <crontabfilter start="false">
        <exclude expression="*.php"></exclude>
        <exclude expression="info/*"></exclude>
        </crontabfilter>
    </crontab>
    <plugin start="false" name="command"/>
    </sersync>
 
    <plugin name="command">
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>    <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>
</head>

3. 安装

文件上传至目录下
cd platform

cp -r ./rsync-3.2.3 /usr/local/
cp -r ./rsync-3.2.3/rsync /usr/bin/
cp ./rsyncd.* /etc/
cp ./rsync.* /etc/

cd /usr/local

#更改文件权限
chmod 600 /etc/rsync.password
chmod 600 /etc/rsync.passwordNlp
chmod 600 /etc/rsyncd.conf
开放端口873
firewall-cmd --permanent --zone=public --add-port=873/tcp 
firewall-cmd --reload
设置 SELINUX=disabled
setenforce 0 && sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config


#启动rsync服务
chmod 755 /usr/local/rsync-3.2.3/GNU-Linux-x86/sersync2
cd /usr/local/rsync-3.2.3/GNU-Linux-x86/
sh ./startRsync.sh
echo "rsync start"

echo "/bin/sh '/usr/local/rsync-3.2.3/GNU-Linux-x86/startRsync.sh'" >> /etc/rc.d/rc.local
echo "/bin/sh '/usr/local/rsync-3.2.3/GNU-Linux-x86/startSersync.sh'" >> /etc/rc.d/rc.local

#启动sersync服务
sh ./startSersync.sh
echo "sersync start"

​ 查看rsync服务以及sersync服务是否启动

ps -ef |grep rsync

这样就算安装完了,可以做测试。

上传文件,看是否能自动同步。

四、日志查看:

在 /var/log/路径下的rsync日志

tail -f /var/log/rsyncd.log

五、问题总结

同步文件,被覆盖问题

假如 A、B两个机器,先启动A机器,在启动B机器,那么B机器 会优先覆盖掉A机器的,所以这是一个问题,需要注意掉,如果B机器路径下是空的话,会出现,将A机器直接覆盖掉问题。需要做以下配置。

cd /usr/local/rsync-3.2.3/GNU-Linux-x86
vi confxml.xml

搜索 deleted 将原先true改为false

在这里插入图片描述

保存退出

1. 启动服务
cd /usr/local/rsync-3.2.3/GNU-Linux-x86

# 停止
sh stopRsync.sh
sh stopSersync.sh

# 启动
sh startRsync.sh
sh startSersync.sh
  1. 服务查看
ps -ef|grep rsync
  1. 日志查看
 tail -f /var/log/rsyncd.log

上述只是分享使用这个同步工具的使用。篇幅太长具体配置文件rsyncd.conf,confxml.xml 的每个字段的详情说明可以参考这篇文章 rsyncd.conf、confxml.xml 完整 配置文件详解【二】,或者关注公众号 【九逸编码】进行查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值