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

奥黛丽·逐爱者
2026-07-02 / 0 评论 / 6 阅读 / 正在检测是否收录...

一、前言

在日常运维和系统架构中,我们经常会遇到这样的场景:多个服务器之间需要保持文件的一致性——比如 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 modeuid = rootgid = rootuse 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 = falselist = falseauth users = testsecrets file = /etc/rsync.password #需要创建对应的用户密码文件,并放置到指定目录,我这里是在/etc
[plat]comment = plat# 同步路径path = remote-path# 同步IPhosts allow = remote-ip
// 模块说明名称,两台机器一致即可comment = plat
// 同步路径path = remote-path
// 同步IPhosts 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.passwordchmod 600 /etc/rsync.passwordNlpchmod 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/sersync2cd /usr/local/rsync-3.2.3/GNU-Linux-x86/sh ./startRsync.shecho "rsync start"
echo "/bin/sh '/usr/local/rsync-3.2.3/GNU-Linux-x86/startRsync.sh'" >> /etc/rc.d/rc.localecho "/bin/sh '/usr/local/rsync-3.2.3/GNU-Linux-x86/startSersync.sh'" >> /etc/rc.d/rc.local
#启动sersync服务sh ./startSersync.shecho "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-x86vi confxml.xml

搜索 deleted 将原先true改为false

图片

保存退出

1. 启动服务cd /usr/local/rsync-3.2.3/GNU-Linux-x86
# 停止sh stopRsync.shsh stopSersync.sh
# 启动sh startRsync.shsh startSersync.sh
  1. 服务查看

    ps -ef|grep rsync

  2. 日志查看

     tail -f /var/log/rsyncd.log


篇幅太长具体配置文件rsyncd.conf,confxml.xml 的每个字段的详情说明可以参考公众号上一篇【rsyncd.conf、confxml.xml 完整 配置文件详解【二】,或者去csdn查看 https://blog.csdn.net/qq_40873540/article/details/149862075


0

评论 (0)

取消