深色模式
中间件高可用
摘要:高可用不是"多部署几台"就自动成立,它由冗余、故障检测、切换动作三部分构成。本文给出四类常见中间件的 HA 架构要点与最小切换演练脚本,帮你在真实故障前验证方案是否可用。
适用环境
bash
# 确认组件已是多实例(单点谈不上 HA)
systemctl is-active nginx
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic <topic>
sudo rabbitmqctl cluster_status
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_cat/nodes?v'1
2
3
4
5
2
3
4
5
操作步骤
1. Nginx:Keepalived 双机 VIP 漂移
bash
sudo yum install -y keepalived # Debian: apt-get install -y keepalived1
conf
# /etc/keepalived/keepalived.conf (主节点,备节点 state 改 BACKUP、priority 改小)
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
10.0.0.100/24
}
track_script { chk_nginx }
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bash
sudo systemctl enable --now keepalived
ip addr show | grep 10.0.0.100 # VIP 只应在主节点上1
2
2
2. Kafka:多副本 + 多 broker 自动切换
properties
# 关键:副本因子 3、最小同步副本 2、禁止脏选举
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=31
2
3
4
5
6
2
3
4
5
6
Kafka 的 leader 切换由 controller 自动完成,客户端通过 bootstrap 列表自动感知,无需人工切换。
3. RabbitMQ:镜像/仲裁队列自动接管
bash
# 仲裁队列(推荐):leader 挂掉后 Raft 自动选出新 leader
sudo rabbitmqctl set_policy ha-quorum "^ha\." \
'{"queue-mode":"default"}' --apply-to queues
# 经典镜像队列:镜像到所有节点并自动同步
sudo rabbitmqctl set_policy ha-all "^mir\." \
'{"ha-mode":"all","ha-sync-mode":"automatic"}' --apply-to queues1
2
3
4
5
6
7
2
3
4
5
6
7
客户端应配置多个节点地址,连接断开后自动重连到下一个节点。
4. Elasticsearch:专用主节点 + 过半选主
yaml
# 至少 3 个专用 master 节点,避免脑裂
node.roles: [ master ]
discovery.seed_hosts: ["es-m1", "es-m2", "es-m3"]
cluster.initial_master_nodes: ["es-m1", "es-m2", "es-m3"]1
2
3
4
2
3
4
5. 故障切换演练(每季度至少一次)
bash
# Nginx:停掉主节点,VIP 应在几秒内漂移到备节点
sudo systemctl stop nginx
ssh backup-node 'ip addr show | grep 10.0.0.100'
# Kafka:停掉 leader 所在 broker,观察分区 leader 是否迁移
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--describe --topic <topic> # 对比 leader 列变化
# ES:停掉一个数据节点,观察分片是否重新分配
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_cat/shards?v' | grep UNASSIGNED | wc -l1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
DANGER
演练必须在业务低峰期且提前通知相关方。直接在生产高峰期 systemctl stop 组件属于未经批准的变更;演练前请确认有回滚步骤和值班人员就位。
6. 记录切换指标(RTO/RPO 是否达标)
bash
# 记录开始与恢复时间点,计算 RTO
date +%s > /tmp/failover_start
# ... 执行切换 ...
date +%s | xargs -I{} sh -c 'echo "RTO(s): $(( {} - $(cat /tmp/failover_start) ))"'1
2
3
4
2
3
4
验证
bash
# VIP 漂移验证
ip addr | grep 10.0.0.100 && echo "VIP on this node"
# Kafka 无不可用分区
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --unavailable-partitions
# RabbitMQ 集群状态与队列镜像
sudo rabbitmqctl cluster_status
sudo rabbitmqctl list_queues name policy slave_nodes synchronised_slave_nodes -q
# ES 集群健康为 green,无未分配分片
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_cluster/health?pretty'1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
常见坑
WARNING
Keepalived 双机出现"双主"(VIP 同时出现在两台机器),通常是 VRRP 报文被防火墙/安全组拦截。需放通协议号 112(vrrp),而不是 TCP 端口。
WARNING
Kafka 集群只有 2 台 broker 时,任何一台宕机都会导致可用副本不足半数,实际不可用。请至少 3 台。
DANGER
HA 配置上线后从未演练过,等于没有 HA。很多"高可用"架构在第一次真实故障时才发现 VIP 没漂移、副本没同步。请定期做强制切换演练并留存记录。