一、前言
在日常运维和系统架构中,我们经常会遇到这样的场景:多个服务器之间需要保持文件的一致性——比如 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
- 服务查看
ps -ef|grep rsync
- 日志查看
tail -f /var/log/rsyncd.log
上述只是分享使用这个同步工具的使用。篇幅太长具体配置文件rsyncd.conf,confxml.xml 的每个字段的详情说明可以参考这篇文章 rsyncd.conf、confxml.xml 完整 配置文件详解【二】,或者关注公众号 【九逸编码】进行查看。
1270

被折叠的 条评论
为什么被折叠?



