13.10.1 典型架构与发布流程实战
典型架构与发布流程实战#
1. 典型架构形态#
- 四层TCP负载均衡:适用于MySQL/Redis/Kafka等长连接,HAProxy在TCP模式转发。
- 七层HTTP负载均衡:适用于Web/API,支持Host/Path路由、Header/ACL。
- 多集群与灰度发布:按backend分组+权重/ACL分流。
原理草图(L4/L7对比)
示例配置(L4+L7混合)
# /etc/haproxy/haproxy.cfg
global
daemon
maxconn 20000
defaults
mode http
timeout connect 5s
timeout client 60s
timeout server 60s
frontend fe_http
bind *:80
acl is_api path_beg /api
use_backend be_api if is_api
default_backend be_web
backend be_web
balance roundrobin
server web1 10.0.0.11:8080 check
server web2 10.0.0.12:8080 check
backend be_api
balance roundrobin
server api1 10.0.0.21:8080 check
frontend fe_tcp_mysql
mode tcp
bind *:3306
default_backend be_mysql
backend be_mysql
mode tcp
balance source
server db1 10.0.0.31:3306 check
server db2 10.0.0.32:3306 check
2. HAProxy + Keepalived 高可用架构#
- VIP主备:Keepalived提供VIP漂移,HAProxy双节点。
- 故障切换:主节点异常,VIP漂移到备节点。
- 一致性:配置同步避免切换后路由差异。
架构草图
Keepalived最小可用配置
# /etc/keepalived/keepalived.conf (HAProxy-A)
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_haproxy
}
}
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
weight -20
}
# /etc/keepalived/keepalived.conf (HAProxy-B)
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
virtual_ipaddress {
10.0.0.100/24
}
track_script {
chk_haproxy
}
}
验证命令
systemctl restart haproxy keepalived
ip a | grep 10.0.0.100
journalctl -u keepalived -n 50
3. 典型发布流程(HTTP应用)#
- 准备发布:验证配置、备份。
- 摘除后端:节点置为
drain,保持连接不中断。 - 发布应用:部署新版本、健康检查。
- 灰度放量:逐步提升权重。
- 全量发布:观察指标、完成。
运行时下线/上线(Runtime API)
# 1) 确认管理socket
grep -n "stats socket" /etc/haproxy/haproxy.cfg
# 2) 动态下线节点(等待连接退出)
echo "set server be_web/web1 state drain" | socat stdio /run/haproxy/admin.sock
# 3) 动态上线节点
echo "set server be_web/web1 state ready" | socat stdio /run/haproxy/admin.sock
发布练习
- 练习目标:将web1升级并灰度10%流量
- 任务步骤:
1) drain web1
2) 部署新版本
3) 设置权重10%
4) 观察统计页
权重调整示例
# 将web1流量设为10%,web2 90%
echo "set server be_web/web1 weight 10" | socat stdio /run/haproxy/admin.sock
echo "set server be_web/web2 weight 90" | socat stdio /run/haproxy/admin.sock
4. 典型发布流程(TCP应用)#
- 连接保持:
balance source或stick-table。 - 优雅下线:
disabled或drain等待连接结束。 - 发布与验证:切换后监控连接数。
- 回流:上线并观察新连接分配。
连接保持示例
backend be_mysql
mode tcp
balance source
stick-table type ip size 1m expire 1h
stick on src
server db1 10.0.0.31:3306 check
server db2 10.0.0.32:3306 check
优雅下线命令
echo "set server be_mysql/db1 state drain" | socat stdio /run/haproxy/admin.sock
echo "show servers state" | socat stdio /run/haproxy/admin.sock
5. 灰度与蓝绿发布实践#
- 灰度发布:按Header/IP/权重分流。
- 蓝绿发布:两套backend一键切换,回退快速。
灰度按Header分流示例
frontend fe_http
bind *:80
acl is_gray hdr(X-Canary) -i true
use_backend be_gray if is_gray
default_backend be_web
backend be_gray
balance roundrobin
server gray1 10.0.0.51:8080 check
蓝绿切换示例
frontend fe_http
bind *:80
default_backend be_blue # 发布后改为 be_green
backend be_blue
server blue1 10.0.0.11:8080 check
backend be_green
server green1 10.0.0.21:8080 check
6. 常用实操命令与配置片段#
安装与启用(以Ubuntu为例)
apt update
apt install -y haproxy socat
systemctl enable --now haproxy
haproxy -v
配置校验
haproxy -c -f /etc/haproxy/haproxy.cfg
# 预期输出:Configuration file is valid
统计页启用
listen stats
bind *:8404
stats enable
stats uri /stats
stats auth admin:admin
7. 发布过程关键监控点#
- 请求成功率:5xx/4xx趋势。
- 响应延迟:P95/P99。
- 连接数与队列:
current_sessions、queue。 - 后端健康:
DOWN/MAINT比例。
查看状态
echo "show stat" | socat stdio /run/haproxy/admin.sock | head
curl -u admin:admin http://127.0.0.1:8404/stats
8. 常见问题排查与经验要点#
1) 后端频繁DOWN
# 检查健康检查端口与超时
grep -n "check" /etc/haproxy/haproxy.cfg
ss -lntp | grep 8080
- 解决:确认服务监听端口、调整
timeout check。
2) 发布后访问异常
# 验证配置是否生效
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl reload haproxy
journalctl -u haproxy -n 50
- 解决:确保reload而非restart,避免连接中断。
3) 会话不保持
# 检查是否启用stick-table或balance source
grep -n "stick" /etc/haproxy/haproxy.cfg
经验要点
- 发布前务必校验配置+备份。
- 优先使用Runtime API无损切换。
- 灰度期密切观察统计页与业务指标。