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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
*# /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
1 | *// 模块说明名称,两台机器一致即可* |
confxml.xml
修改 同步路径(remote-path),同步的远程IP(remote-ip)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97<?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. 安装
文件上传至目录下
1 | cd platform |
开放端口873
1
2
3firewall-cmd --permanent --zone=public --add-port=873/tcp
firewall-cmd –reload
设置 SELINUX=disabled
1 | setenforce 0 && sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config |
查看rsync服务以及sersync服务是否启动
1 | ps -ef |grep rsync |
这样就算安装完了,可以做测试。
上传文件,看是否能自动同步。
四、日志查看:
在 /var/log/路径下的rsync日志
1 | tail -f /var/log/rsyncd.log |
五、问题总结
同步文件,被覆盖问题
假如 A、B两个机器,先启动A机器,在启动B机器,那么B机器 会优先覆盖掉A机器的,所以这是一个问题,需要注意掉,如果B机器路径下是空的话,会出现,将A机器直接覆盖掉问题。需要做以下配置。
1 | cd /usr/local/rsync-3.2.3/GNU-Linux-x86 |
搜索 deleted 将原先true改为false

保存退出
1 | 1. 启动服务 |
服务查看
1 | ps -ef|grep rsync |
- 日志查看
1 | tail -f /var/log/rsyncd.log |