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应用)#

  1. 准备发布:验证配置、备份。
  2. 摘除后端:节点置为drain,保持连接不中断。
  3. 发布应用:部署新版本、健康检查。
  4. 灰度放量:逐步提升权重。
  5. 全量发布:观察指标、完成。

运行时下线/上线(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应用)#

  1. 连接保持balance sourcestick-table
  2. 优雅下线disableddrain等待连接结束。
  3. 发布与验证:切换后监控连接数。
  4. 回流:上线并观察新连接分配。

连接保持示例

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_sessionsqueue
  • 后端健康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无损切换。
- 灰度期密切观察统计页与业务指标。