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

Lear 2025-08-08 12:00:00
Categories: > Tags:

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

一、前言

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

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

问题

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

二、两者比较

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

✅ 挂载(NFS/SMB)

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

⚠️ 但问题来了:

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

✅ rsync + sersync

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

结果是:

核心区别是:

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

使用举例

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

挂载是“大家一起用一个柜子”,而 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
2
3
4
5
6
7
8
9
10
11
*// 模块说明名称,两台机器一致即可*

comment = plat

*// 同步路径*

path = remote-path

*// 同步IP*

hosts allow = remote-ip

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

1
2
3
firewall-cmd --permanent --zone=public --add-port=873/tcp

firewall-cmd –reload

设置 SELINUX=disabled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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服务是否启动

1
ps -ef |grep rsync

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

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

四、日志查看:

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

1
tail -f /var/log/rsyncd.log

五、问题总结

同步文件,被覆盖问题

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

1
2
3
cd /usr/local/rsync-3.2.3/GNU-Linux-x86

vi confxml.xml

搜索 deleted 将原先true改为false

图片

保存退出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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. 日志查看
1
tail -f /var/log/rsyncd.log