双机实时同步 + 统一入口(域名)
实现:
任意一台挂了,业务不中断
两台实时备份
对外只用一个域名
这里是对svn仓库同步,不限于svn,任何需要数据同步的都可以。
2 台 SVN + 实时同步 + DNS 轮询
两台都装 SVN(版本一致)
仓库目录结构、权限、配置 完全一样
两台之间实时双向同步(关键)
用 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:创建配置文件
步骤 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:创建配置文件
步骤 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" -- 第二台目标机(末尾不加逗号) },
|