腾讯云CLB负载均衡接入实战:高并发Web服务的稳定性配置

在高并发Web服务架构中,单台服务器很难承载所有流量。腾讯云CLB(负载均衡)通过将流量分发到多台后端服务器,实现系统的高可用和横向扩展。华万通信在协助多家企业完成腾讯云架构落地的过程中,积累了一些CLB的配置经验,本文将结合实践详细介绍监听器配置、健康检查、会话保持和HTTPS卸载的核心流程,并附完整代码示例。

一、CLB核心概念与架构

CLB(Cloud Load Balancer)是腾讯云提供的流量分发服务,支持四层(TCP/UDP)和七层(HTTP/HTTPS)负载均衡。典型架构如下:

复制代码
客户端 → CLB负载均衡器 → 后端服务器池(CVM)
                        ↓
                  健康检查/会话保持

核心优势:

  • 跨可用区容灾,可用性99.95%+
  • 自动剔除异常后端,自愈能力强
  • 支持亿级并发连接,适合电商、游戏、金融场景

二、CLB实例创建与基础配置

2.1 创建公网CLB实例

通过腾讯云控制台或API创建:

复制代码
# 使用腾讯云SDK创建CLB实例
from tencentcloud.common import credential
from tencentcloud.clb.v20180317 import clb_client, models

# 初始化认证
cred = credential.Credential("SecretId", "SecretKey")
client = clb_client.ClbClient(cred, "ap-guangzhou")

# 创建CLB请求
req = models.CreateLoadBalancerRequest()
req.LoadBalancerType = "OPEN"  # 公网类型
req.LoadBalancerName = "web-clb-prod"
req.VpcId = "vpc-xxxxxx"
req.SubnetId = "subnet-xxxxxx"
req.Number = 1

# 发送请求
resp = client.CreateLoadBalancer(req)
print(f"CLB实例ID: {resp.LoadBalancerIds}")

关键参数说明:

  • LoadBalancerTypeOPEN(公网)、INTERNAL(内网)
  • MasterZoneId/SlaveZoneId:指定主备可用区,实现跨AZ容灾
  • InternetAccessible:设置公网带宽上限(按固定带宽或流量)

2.2 监听器配置(HTTP/HTTPS/TCP)

监听器是CLB的流量入口,负责协议解析和转发规则匹配。

复制代码
# 创建HTTP监听器
req = models.CreateListenerRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.Ports = [80, 8080]  # 监听端口
req.Protocol = "HTTP"
req.ListenerNames = ["http-80", "http-8080"]

# 健康检查配置
health_check = models.HealthCheck()
health_check.HealthSwitch = 1  # 开启健康检查
health_check.IntervalTime = 5   # 检查间隔(秒)
health_check.HealthNum = 3      # 健康阈值(连续3次成功标记为健康)
health_check.UnHealthNum = 3    # 不健康阈值
health_check.HttpCode = 2        # HTTP状态码2xx/3xx为健康
health_check.HttpCheckPath = "/health"  # 健康检查路径
req.HealthCheck = health_check

resp = client.CreateListener(req)

三、后端服务器绑定与健康检查实战

3.1 注册后端服务器

复制代码
# 绑定CVM到CLB后端
req = models.RegisterTargetsRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.ListenerId = "lbl-xxxxxx"

# 绑定两台后端服务器,权重分别为60和40
targets = [
    models.Target(PrivateIpAddress="10.0.1.10", Port=8080, Weight=60),
    models.Target(PrivateIpAddress="10.0.1.11", Port=8080, Weight=40)
]
req.Targets = targets

resp = client.RegisterTargets(req)
print("后端服务器绑定成功")

权重分配策略:

  • Weight=0:服务器不接收新连接,适合下线维护场景
  • Weight越高,分配流量比例越大(支持0-100)

3.2 健康检查深度配置

健康检查是CLB自动剔除异常节点的核心机制。

复制代码
# 更新健康检查配置
req = models.ModifyTargetHealthConfigRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.ListenerId = "lbl-xxxxxx"

# 七层(HTTP)健康检查高级配置
health_config = {
    "HealthSwitch": 1,
    "IntervalTime": 5,
    "HealthNum": 3,
    "UnHealthNum": 3,
    "HttpCode": 2,          # 2:2xx/3xx;4:仅4xx
    "HttpCheckPath": "/api/health",
    "HttpCheckDomain": "www.example.com",  # 检查域名
    "HttpCheckMethod": "HEAD",   # HEAD(轻量)/GET(完整)
}

req.HealthCheck = health_config
resp = client.ModifyTargetHealthConfig(req)

常见健康检查失败原因:

  1. 后端服务端口未监听 → 检查netstat -tlnp
  2. 安全组未放通CLB IP → 添加CLB VIP到安全组入站规则
  3. 健康检查路径返回非2xx → 检查应用/health端点实现

四、HTTPS卸载与证书管理

4.1 为什么需要HTTPS卸载?

传统架构中,每台后端服务器都需要配置SSL证书并处理TLS握手,消耗大量CPU资源。CLB的HTTPS卸载将证书配置和加解密集中在负载均衡器上,后端服务器只需处理HTTP流量,性能提升30%+。

复制代码
客户端(HTTPS)→ CLB(TLS终止)→ 后端服务器(HTTP)
                ↑
         证书只配置在这里

4.2 证书上传与绑定

复制代码
# 上传SSL证书到腾讯云SSL证书服务
from tencentcloud.ssl.v20191205 import ssl_client, models as ssl_models

ssl_client = ssl_client.SslClient(cred, "ap-guangzhou")

req = ssl_models.UploadCertificateRequest()
req.CertificatePublicKey = """-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJA......(证书内容)
-----END CERTIFICATE-----"""
req.CertificatePrivateKey = """-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQ......(私钥内容)
-----END PRIVATE KEY-----"""
req.Alias = "example-com-2026"

resp = ssl_client.UploadCertificate(req)
cert_id = resp.CertificateId  # 例如:te-xxxxxx

在CLB HTTPS监听器中绑定证书:

复制代码
# 创建HTTPS监听器并绑定证书
req = models.CreateListenerRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.Ports = [443]
req.Protocol = "HTTPS"
req.Certificate = models.CertificateOutput(CertificateId=cert_id)

# SNI配置(支持同一IP绑定多个域名证书)
req.SniSwitch = 1  # 开启SNI
req.Rules = [
    models.Rule(Path="/", Domain="www.example.com", CertificateId=cert_id),
    models.Rule(Path="/", Domain="api.example.com", CertificateId=cert_id_api)
]

resp = client.CreateListener(req)

五、会话保持与转发规则

5.1 会话保持配置

对于需要"同一客户端请求转发到同一后端"的场景(如未实现共享Session的Web应用),需要开启会话保持。

复制代码
# 开启会话保持(基于Cookie)
req = models.ModifyListenerRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.ListenerId = "lbl-xxxxxx"

# 七层会话保持配置
req.SessionExpireTime = 3600  # 会话保持时间(秒),0表示关闭
req.CookieName = "CLB_SESSION"  # 插入式Cookie名称
req.CookieSwitch = 1             # 开启基于Cookie的会话保持

resp = client.ModifyListener(req)

四层(TCP)会话保持:

  • 基于源IP绑定,同一客户端IP固定转发到同一后端
  • 配置SchedulerIP_Hash

5.2 转发规则与URL路径匹配

复制代码
# 配置URL路径转发规则(七层)
req = models.CreateRuleRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.ListenerId = "lbl-xxxxxx"

rules = [
    # 路径1:/api/* 转发到API服务器组
    models.Rule(
        Path="/api/*",
        Targets=[
            models.Target(PrivateIpAddress="10.0.2.10", Port=8080, Weight=100)
        ]
    ),
    # 路径2:/static/* 转发到静态资源服务器
    models.Rule(
        Path="/static/*",
        Targets=[
            models.Target(PrivateIpAddress="10.0.3.10", Port=80, Weight=100)
        ]
    )
]

req.Rules = rules
resp = client.CreateRule(req)

六、CLB监控告警与日志分析

6.1 核心监控指标

通过腾讯云监控(Cloud Monitor)获取CLB运行数据:

复制代码
# 查询CLB监控数据
from tencentcloud.monitor.v20180724 import monitor_client, models

monitor_client = monitor_client.MonitorClient(cred, "ap-guangzhou")
req = models.GetMonitorDataRequest()

req.Namespace = "QCE/LOADBALANCE"
req.MetricNames = ["ConNum", "NewConn", "InPkg", "OutPkg"]  # 连接数、新建连接、入包量、出包量
req.Period = 60  # 60秒粒度
req.StartTime = "2026-05-19T10:00:00+08:00"
req.EndTime = "2026-05-19T11:00:00+08:00"
req.Instances = [{"Dimensions": [{"Name": "loadBalancerId", "Value": "lb-xxxxxx"}]}]

resp = monitor_client.GetMonitorData(req)

关键告警阈值建议:

  • NewConn > 10000:新建连接数过高,需扩容后端
  • ConNum > 100000:并发连接数告警
  • 5xx状态码占比 > 5%:后端异常,检查健康检查

6.2 访问日志分析

CLB支持将访问日志实时投递到COS(对象存储),用于后续分析。

复制代码
# 配置CLB访问日志投递到COS
req = models.ModifyLoadBalancerAttributesRequest()
req.LoadBalancerId = "lb-xxxxxx"
req.LoadBalancerPassToTarget = 1  # 开启日志投递
req.LogSetId = "xxxxxx"           # CLS日志集ID(或使用COS)
req.LogTopicId = "xxxxxx"

resp = client.ModifyLoadBalancerAttributes(req)

日志字段说明(部分):

  • request_time:请求处理耗时(毫秒)
  • upstream_addr:后端服务器地址
  • status:HTTP响应状态码
  • request_length/bytes_sent:请求/响应大小

七、最佳实践与常见问题

7.1 跨可用区高可用配置

在华万通信服务企业的实际经验中,跨可用区配置是防止单可用区故障的关键。很多企业在初期为节省成本只选单可用区,一旦该区网络抖动,整个服务不可用。

复制代码
# 在不同可用区创建CLB实例(主备)
# 主实例(广州三区)
req_master = models.CreateLoadBalancerRequest()
req_master.MasterZoneId = "ap-guangzhou-3"
req_master.SlaveZoneId = "ap-guangzhou-4"  # 备可用区

# 通过DNS轮询或GSLB实现跨地域容灾

7.2 安全加固建议

  1. 限制CLB管理API访问IP:通过CAM策略限定仅公司出口IP可调用CLB API

  2. 后端服务器安全组:仅放通CLB VIP段(通过API动态获取)

  3. 开启CLB访问日志:满足等保合规要求

    获取CLB VIP地址段(用于安全组配置)

    req = models.DescribeLoadBalancersRequest()
    req.LoadBalancerIds = ["lb-xxxxxx"]
    resp = client.DescribeLoadBalancers(req)

    VIP地址:resp.LoadBalancerSet[0].LoadBalancerVips

    安全组入站规则仅放通该VIP

八、总结

腾讯云CLB作为高并发Web服务的流量入口,核心价值在于:

  1. 高可用:自动健康检查+跨AZ容灾,避免单点故障
  2. 高性能:HTTPS卸载降低后端CPU消耗,支持亿级并发
  3. 灵活转发:基于URL路径、域名、Header的高级路由规则
  4. 易运维:完善的监控告警+访问日志,故障排查高效

对于日均QPS超过5000的中大型企业,CLB几乎是标配。结合自动扩缩容(AS)和容器服务(TKE),可以构建完全弹性的Web服务架构。

在实际落地过程中,CLB的配置方案需要根据业务架构、流量模型和安全合规要求做针对性调整。华万通信在协助制造、零售、金融等行业客户完成腾讯云架构规划中,积累了大量CLB选型与最佳实践,欢迎有相关需求的团队交流探讨。

参考官方文档:

相关推荐
JiaWen技术圈5 小时前
从零认识 OpenTelemetry (OTel)
运维·前端·安全
冴羽yayujs5 小时前
GitHub 热门项目-日榜(2026-05-19)
前端·javascript·github
AIFQuant5 小时前
JavaScript 前端集成贵金属 K 线图:10 分钟快速实现
开发语言·前端·javascript·websocket·金融·期货api
下北沢美食家5 小时前
Webpack与Vite详解
前端·webpack·node.js
不是山谷.:.5 小时前
websocket的封装
开发语言·前端·网络·笔记·websocket·网络协议
摇滚侠5 小时前
14 响应式网页 WEB 前端 WEB 开发 HTML5 + CSS3 + 移动 WEB
前端·css3·html5
vortex55 小时前
Shellinabox 使用指南:基于 Web 的终端模拟器
linux·前端·web ssh
小则又沐风a5 小时前
深入理解进程概念 第三章 进程调度切换
java·linux·服务器·前端
ZC跨境爬虫5 小时前
跟着 MDN 学 HTML day_63:(Web 中矢量图形的完整指南)
前端·javascript·数据库·ui·html