凌晨三点的报警电话,服务器宕机的红色告警,手忙脚乱的人工切换——这些运维人员的噩梦场景,在电商大促期间尤为常见。当流量洪峰来袭,传统的主备架构往往捉襟见肘,而本文将揭示如何用Keepalived+Haproxy+Nginx构建真正的双主高可用集群,让系统具备自我修复能力,实现业务零中断。
在流量波动剧烈的电商环境中,传统主备模式存在明显的资源浪费和切换延迟问题。双主架构的核心思想是让两个节点同时处于活跃状态,各自承担部分流量,当任一节点故障时,另一节点能够无缝接管全部流量。
典型电商场景的痛点分析:
我们采用的解决方案技术栈分工明确:
提示:双主架构不是简单的配置两个主节点,关键在于设计无单点故障的完整数据通路和状态同步机制
在两台服务器(假设为NodeA和NodeB)上执行以下准备工作:
bash复制# 关闭SELinux和防火墙
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
# 安装基础依赖
yum install -y gcc make openssl-devel pcre-devel zlib-devel
NodeA的keepalived.conf关键配置:
nginx复制vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight 50
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass your_secure_password
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_haproxy
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass your_secure_password
}
virtual_ipaddress {
192.168.1.101/24 dev eth0
}
track_script {
chk_haproxy
}
}
NodeB的配置与NodeA形成对称,但优先级相反。这种配置实现了:
/etc/haproxy/haproxy.cfg的核心配置:
haproxy复制global
log /dev/log local0
maxconn 10000
user haproxy
group haproxy
daemon
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
log global
option httplog
option dontlognull
frontend http-in
bind *:80
bind *:443 ssl crt /etc/ssl/private/example.com.pem
acl is_static path_end -i .jpg .jpeg .png .gif .css .js
use_backend static if is_static
default_backend dynamic
backend static
balance roundrobin
server nodeA 192.168.1.10:80 check
server nodeB 192.168.1.11:80 check
backend dynamic
balance leastconn
cookie SERVERID insert indirect nocache
server nodeA 192.168.1.10:80 cookie nodeA check
server nodeB 192.168.1.11:80 cookie nodeB check
listen stats
bind *:8080
stats enable
stats uri /haproxy?stats
stats realm Haproxy\ Statistics
stats auth admin:securepassword
关键优化点:
脑裂问题是双主架构的最大威胁,我们采用组合防护策略:
VRRP优先级动态调整:
bash复制vrrp_script chk_load {
script "/usr/local/bin/check_load.sh"
interval 5
weight -20
}
多播地址检测:
nginx复制vrrp_instance VI_1 {
...
unicast_src_ip 192.168.1.10
unicast_peer {
192.168.1.11
}
}
第三方仲裁服务:
python复制# 示例:使用Redis作为仲裁服务
import redis
r = redis.Redis(host='仲裁服务器IP')
r.set('node_alive:nodeA', '1', ex=5)
生产环境需要保证服务不中断的情况下更新配置:
bash复制# Haproxy配置重载
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
# Nginx配置检查与重载
nginx -t && nginx -s reload
完善的健康检查体系包括:
| 检查层级 | 检查方式 | 频率 | 恢复策略 |
|---|---|---|---|
| 网络层 | ICMP Ping | 1s | 自动切换VIP |
| 服务层 | TCP端口检测 | 2s | 自动剔除后端 |
| 应用层 | HTTP状态码 | 5s | 告警+自动恢复 |
| 业务层 | 关键API测试 | 10s | 人工介入 |
弹性扩容机制:
bash复制# 自动扩展Nginx worker数量
CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
sed -i "s/worker_processes.*/worker_processes $((CPU_CORES * 2));/" /etc/nginx/nginx.conf
连接数动态调整:
haproxy复制backend dynamic
maxconn 5000
fullconn 3000
server nodeA 192.168.1.10:80 maxconn 2500
server nodeB 192.168.1.11:80 maxconn 2500
推荐监控指标组合:
Keepalived监控项:
Haproxy关键指标:
bash复制echo "show stat" | socat /var/run/haproxy.sock stdio | awk -F ',' '{print $1,$2,$5,$8,$18}'
Nginx性能看板:
nginx复制location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
在非高峰时段验证高可用性:
某跨境电商平台在去年黑五期间经历了惨痛的教训:凌晨两点主节点宕机,备用节点因配置不同步无法接管,导致30分钟服务不可用,直接损失超过百万美元。
实施双主高可用架构后,今年Prime Day期间的表现:
关键改进点:
这套架构的实际运行效果超出了预期,最令人惊喜的是在最近一次数据中心网络波动中,系统自动完成了跨机房的流量切换,用户完全无感知。