喵星之旅-狂奔的兔子-SVN双机高可用、实时备份(lsyncd)

双机实时同步 + 统一入口(域名)
实现:
任意一台挂了,业务不中断
两台实时备份
对外只用一个域名

这里是对svn仓库同步,不限于svn,任何需要数据同步的都可以。

2 台 SVN + 实时同步 + DNS 轮询

两台都装 SVN(版本一致)

1
yum install subversion

仓库目录结构、权限、配置 完全一样

两台之间实时双向同步(关键)

用 lsyncd + rsync 实时同步仓库
任何一台提交代码
另一台秒级同步

配置简单、稳定、不挑系统。

域名解析加 2 条 A 记录(你刚才问的那个)

1
2
svn.xxx.com A  服务器1IP
svn.xxx.com A 服务器2IP

效果

客户端访问 svn.xxx.com
随机访问任意一台
一台挂掉,自动用另一台
数据实时一致

用 lsyncd + rsync 实时同步仓库

核心思路

两台服务器互相信任(免密 SSH),确保 rsync 能无密码同步
安装 lsyncd(实时监控文件变化)+ rsync(数据同步)
配置双向 lsyncd 规则:A 服务器变更自动同步到 B,B 服务器变更自动同步到 A
测试验证同步效果

手动同步初始化:首次配置时,先手动把其中一台的完整仓库同步到另一台:

1
2
# 服务器A执行,把本地仓库同步到B(初始化)
rsync -avz /var/svn/repos/ root@192.168.1.11:/var/svn/repos/

前提准备(两台服务器都操作)

服务器 A:IP 192.168.1.10(示例,替换成你的实际 IP)
服务器 B:IP 192.168.1.11
SVN 仓库目录:统一为 /var/svn/repos(建议两台目录完全一致)

安装依赖

1
2
3
4
5
# CentOS/RHEL/Rocky Linux
yum install -y lsyncd rsync openssh-server

# Ubuntu/Debian
apt install -y lsyncd rsync openssh-server

配置免密 SSH(双向互信)

步骤 1:服务器 A 生成密钥并拷贝到 A\B

1
2
3
4
5
6
7
# 生成公钥和私钥
ssh-keygen -t rsa

# 3个回车后生成成功,然后将公钥拷贝到要免密登录的目标机器上(包括自己)
ssh-copy-id 192.168.1.10
ssh-copy-id 192.168.1.11

步骤 2:服务器 B 生成密钥并拷贝到 A\B

1
2
3
4
5
6
# 生成公钥和私钥
ssh-keygen -t rsa

# 3个回车后生成成功,然后将公钥拷贝到要免密登录的目标机器上(包括自己)
ssh-copy-id 192.168.1.10
ssh-copy-id 192.168.1.11

验证免密登录

1
2
3
4
5
# 服务器A执行,能免密登录B即可
ssh root@192.168.1.11

# 服务器B执行,能免密登录A即可
ssh root@192.168.1.10

配置 lsyncd 实时同步(核心步骤)

服务器 A 配置(同步到 B)

步骤 1:创建配置文件

1
vim /etc/lsyncd.conf

步骤 2:写入配置内容(替换 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
settings {
logfile = "/var/log/lsyncd/lsyncd.log", -- 日志文件
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite", -- 监控文件关闭/写入事件
maxProcesses = 10, -- 最大同步进程数
}

-- 同步SVN仓库到服务器B
sync {
default.rsync,
source = "/var/svn/repos", -- 本地SVN仓库目录
target = "root@192.168.1.11:/var/svn/repos", -- 目标服务器+目录
exclude = { ".tmp", ".swp", "~" },
delete = true, -- 同步删除(A删文件,B也删,保持一致)
delay = 1, -- 延迟1秒同步(避免频繁触发)
rsync = {
binary = "/usr/bin/rsync",
archive = true, -- 归档模式(保留权限、时间等)
compress = true, -- 压缩传输
verbose = true,
rsh = "ssh -p 22", -- SSH端口(默认22)
-- 关键:rsync 同步时加 --exclude 跳过自身同步产生的文件
_extra = { "--exclude='.lsyncd-sync'" }
}
}

服务器 B 配置(同步到 A)

步骤 1:创建配置文件

1
vim /etc/lsyncd.conf

步骤 2:写入配置内容(仅替换 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
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 10,
}

-- 同步SVN仓库到服务器A
sync {
default.rsync,
source = "/var/svn/repos",
target = "root@192.168.1.10:/var/svn/repos", -- 目标改为服务器A
exclude = { ".tmp", ".swp", "~" },
delete = true,
delay = 1,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
rsh = "ssh -p 22",
-- 关键:rsync 同步时加 --exclude 跳过自身同步产生的文件
_extra = { "--exclude='.lsyncd-sync'" }
}
}

启动并设置开机自启(两台都操作)

创建日志目录

1
mkdir -p /var/log/lsyncd

启动 lsyncd

1
2
3
4
5
6
7
8
# 启动
systemctl start lsyncd

# 设置开机自启
systemctl enable lsyncd

# 查看状态(确保running)
systemctl status lsyncd

测试同步效果

服务器 A 操作

1
2
3
4
5
# 在SVN仓库创建测试文件
touch /var/svn/repos/test.txt

# 查看日志,确认同步成功
tail -f /var/log/lsyncd/lsyncd.log

服务器 B 验证

1
2
# 检查是否有test.txt文件
ls /var/svn/repos/test.txt

反向测试(B 创建,A 验证)
同理,在 B 创建文件,A 能看到即说明双向同步生效。

一个源目录同步到多台目标机器

lsyncd 本身支持多目标同步,本质是让同一份源目录的变化,触发多次 rsync 操作,分别推送到不同的目标机器

目标服务器+目录

1
2
3
4
5
-- 核心:多个目标用逗号分隔,格式为 "用户@IP:目标目录"
target = {
"root@192.168.1.10:/data", -- 第一台目标机
"root@192.168.1.11:/data" -- 第二台目标机(末尾不加逗号)
},
文章目录
  1. 2 台 SVN + 实时同步 + DNS 轮询
    1. 两台都装 SVN(版本一致)
    2. 两台之间实时双向同步(关键)
    3. 域名解析加 2 条 A 记录(你刚才问的那个)
    4. 效果
  2. 用 lsyncd + rsync 实时同步仓库
    1. 前提准备(两台服务器都操作)
    2. 安装依赖
    3. 配置免密 SSH(双向互信)
    4. 配置 lsyncd 实时同步(核心步骤)
      1. 服务器 A 配置(同步到 B)
      2. 服务器 B 配置(同步到 A)
    5. 启动并设置开机自启(两台都操作)
    6. 测试同步效果
    7. 一个源目录同步到多台目标机器
|