从理论到实践的完整指南
📖 目录导读
双机热备的核心概念与价值
双机热备(Active-Standby HA)是确保业务连续性的关键方案,通过主备两台服务器实时同步数据,当主服务器宕机时,备用机自动接管服务。核心价值体现在:消除单点故障、实现99.99%+可用性、运维窗口零中断。

适用场景
- 数据库核心业务(如MySQL、Oracle)
- Web服务、API网关
- 文件存储与NFS/Samba共享
- 虚拟化与容器集群
误区提醒:双机热备≠负载均衡,负载均衡是同时分担流量,热备是主备切换,两者可互补但不等同。
配置前的准备工作与架构选型
1 硬件与网络要求
- 两台同配置服务器(CPU、内存、磁盘尽量一致)
- 心跳网络:建议使用独立物理网卡或交叉网线,避免业务网络断裂影响判断
- 共享存储:推荐SAN/NAS或分布式块存储(如Ceph)
2 软件选型对比
| 方案类型 | 代表软件 | 适用场景 | 成本 |
|---|---|---|---|
| 操作系统层 | Keepalived + HAProxy | Web服务负载 | 免费 |
| 数据库层 | MySQL InnoDB Cluster | 数据库高可用 | 开源 |
| 虚拟化层 | VMware HA | 虚拟机集群 | 商业 |
| 容器层 | Kubernetes + etcd | 微服务架构 | 开源 |
推荐组合:对于中小企业,Keepalived + Nginx + MySQL双主是最低成本的通用方案。
双机热备落地配置步骤详解
以下以 Keepalived(VIP漂移)+ Nginx Web服务 + MySQL双主同步 为例,演示完整配置流程。
1 基础环境配置
# 两台服务器均需操作 sudo apt update && sudo apt install keepalived nginx mysql-server sudo systemctl enable keepalived nginx mysql
网络规划:
- 主服务器(p3001):eth0 192.168.1.10,eth1(心跳) 10.0.0.1
- 备服务器(p3002):eth0 192.168.1.11,eth1(心跳) 10.0.0.2
- VIP(虚拟IP):192.168.1.100
2 Keepalived核心配置
主节点(p3001) /etc/keepalived/keepalived.conf:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_nginx
}
}
备节点(p3002):将 state 改为 BACKUP,priority 改为 90。
监控脚本 /etc/keepalived/chk_nginx.sh:
#!/bin/bash
if systemctl is-active nginx > /dev/null 2>&1; then
exit 0
else
exit 1
fi
注意:脚本添加执行权限 chmod +x /etc/keepalived/chk_nginx.sh
3 MySQL双主同步配置
主备机各编辑 /etc/mysql/mysql.conf.d/mysqld.cnf:
# 主节点 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = your_db auto_increment_increment = 2 auto_increment_offset = 1 # 备节点 server-id = 2 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = your_db auto_increment_increment = 2 auto_increment_offset = 2
创建同步用户(在主备各执行一次):
CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
设置同步关系(主备互为主从):
-- 在p3001上指向p3002 CHANGE MASTER TO MASTER_HOST='192.168.1.11', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE; -- 在p3002上指向p3001 CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE;
检查 SHOW SLAVE STATUS\G 中 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes 即成功。
4 Nginx故障切换验证
配置Nginx监控HTML页面,当主节点Nginx停止时,Keepalived自动将VIP漂移到备节点,用户访问 http://192.168.1.100 无感知。
验证步骤:
- 客户机 ping VIP(持续ping)
- 在主节点
systemctl stop nginx - 观察:
- Keepalived日志自动切换到备机
- VIP在两秒内漂移
- 客户机ping中断不超过2个包
常见配置陷阱与故障处理
1 脑裂问题
现象:两台服务器同时持有VIP,导致数据冲突。 解决方案:
- 配置 多心跳网络(两条物理链路)
- 使用 STONITH(杀死故障节点) 机制
- 检测到脑裂时自动降级
2 数据同步延迟
现象:主节点故障后,备节点数据落后数秒。 解决方案:
- MySQL启用 半同步复制(
rpl_semi_sync_master_enabled=1) - 监控
Seconds_Behind_Master指标并告警
3 配置错误导致切换失败
排查命令工具:
# 检查Keepalived状态 systemctl status keepalived journalctl -u keepalived -n 50 # 检查MySQL同步 mysql -e "SHOW SLAVE STATUS\G" | grep -E "Running|Error" # 检查VIP归属 ip addr show eth0 | grep 192.168.1.100
FAQ:双机热备高频问题解答
Q1:双机热备需要多大带宽?
心跳网络建议至少100Mbps,数据同步网络取决于业务量,MySQL复制每秒同步通常在1-5MB以内,千兆网卡足够。
Q2:两台服务器硬件配置必须要一致吗?
不一致会导致切换后性能瓶颈,但可以运行。强烈建议同步,尤其是磁盘I/O性能,否则备机无法承载主机的写入负载。
Q3:可以在云服务器上配双机热备吗?
可以,使用云厂商的浮动IP或内网VIP,注意需购买两个同区域同配置的实例,且内网互通,部分云厂商提供原生HA服务(如阿里云SLB + RDS高可用),但成本较高。
Q4:切换时间通常多长?
正常情况下:Keepalived 1-3秒检测心跳超时+VIP漂移,MySQL主动切换约5-10秒(包含连接池刷新),总感知时间可控制在10秒内。
Q5:如何测试双机热备的可靠性?
逐步进行:
- 拔掉主节点网线(网络层面的故障)
- 关闭主节点电源(物理级故障)
- 杀掉关键进程(软件级故障)
- 模拟磁盘满、内存OOM
落地关键点
- ✅ 优先测试心跳网络独立性
- ✅ 必须设置监控脚本,连Nginx挂了也要切
- ✅ MySQL同步必须监控延迟与错误
- ✅ 定期人工切换演练(建议每月一次)
- ✅ 记录切换日志并优化切换耗时
双机热备不是“装好就无忧”,而是持续运维的起点,只有通过严格的配置、测试与监控,才能真正实现业务“无感知重启”。