技术原理

最近更新时间:2019-02-01 11:49:57

底层实现

腾讯云负载均衡(Cloud Load Balancer,CLB)当前提供四层和七层上的负载均衡服务,基于腾讯发起的 Tencent gateway(TGW) 统一网关产品提供的负载均衡能力,具有可靠性高、扩展性强、性能高、抗攻击能力强等特点,可实现大规模的并发访问,并防止恶意攻击的流量。CLB 的产品功能包括:提供负载均衡能力,收敛外网 IP,抗 DDoS 攻击,QoS,支持 FTP、SIP 等能力。
负载均衡采用集群部署,可实现会话同步,以消除服务器单点,提升冗余,保证服务稳定,可在同一个地域部署多个机房,实现同城容灾。
下面将从平台、资源到业务维度,为您介绍 CLB 实现云平台租户隔离、架构容灾、资源容灾、抗攻击等功能的关键技术原理。

说明:

  • RS 指绑定 CLB 负载均衡器的 CVM 云服务器。
  • VIP 指 CLB 负载均衡器对外服务的 IP 地址。

租户隔离

云平台的一个关键能力就是租户隔离,接入云的用户都希望自己的业务不受他人影响,至少在网络上实现隔离,确保机器不被随意访问。较常用的方法是在硬件上做隔离,使用特定的接入交换机和 vxlan 协议来达到隔离的目的,但此方法是存在以下缺点:

  • 需要使用特殊的交换机。
  • 需要额外的设备打通 vxlan 网络和普通网络,存在单点问题。
  • 不易于与现有的网络环境兼容。

基于以上原因,CLB 采用了软件方案,通过 IP 隧道 + VPC 来实现租户隔离。

从上图左侧我们可以看到,CLB 和 RS 之间的交互采用 IP 隧道方式,云服务器 CVM(RS)分配的实际内网 IP和物理网络是打通的。此方法实现简单,能兼容以前的物理机方案,但是存在以下缺点:

  • 需要额外的模块实现租户间隔离。
  • 租户之间内网 IP 无法重用,无法实现自由组网。
  • 由于 IP 在内网唯一,迁移时必须变换 RS 的 IP,因此无法实现热迁移。

基于以上原因,腾讯云开发出了 VPC。在上图右侧可以看到同一个租户被分配了一个 VPCID,在 VPC 内,客户可以自由组网,租户网络本身就是隔离的,具体的处理由 vpc.ko 内核模块来实现。

IP 收敛

提起负载均衡,就要提到 LVS(Linux Virtual Server)技术。LVS 共有以下模式:

  • DR 模式:主要缺陷在于要求 LVS 和 RS 必须在同一个 vlan,部署限制大,可扩展性较差。
  • NAT 模式:主要缺陷在于 RS 的回包需要使用默认路由,存在扩展性问题。因此我们最初搭建 LVS 集群采用的是 TUNNEL 模式。
  • TUNNEL 模式:要求每台 RS 都需要分配外网 IP。对于腾讯云以及 RS 较多的业务,外网 IP 是一个很大的挑战。

基于以上原因,腾讯云研发了 CLB。下图是 LVS 方案和 CLB 方案的一个实例简图,二者的主要区别在于:

  • CLB 不需要给 RS 分配外网 IP,起到收敛 IP 的作用。
  • 出流量仍然通过 CLB,更易于定位问题,对业务流量形成闭环,起到桥头堡的作用。

高可靠实现

高可靠是衡量云服务的一个重要指标。CLB 可实现以下方案:为您提供高可靠的服务,

集群容灾和 session 同步

集群容灾指一个集群中一台服务器宕机不会影响整个集群的服务能力。传统的集群容灾采用的 HA 模式(vrrp 协议),常见的开源方案(如 LVS)的缺点在于:

  • 一个集群只有一半的服务器在同时工作,另一半的机器处于冷备状态。
  • 宕机之后的切换速度相对较慢。

CLB 采用 ospf 动态路由协议来实现集群的容灾,若一台机器发生故障,ospf 协议可以保证在10s以内把机器从集群中剔除。CLB 一个集群放在两个接入交换机下,并且保证跨机架的容灾,即便有单边的交换机出故障或者单边机架掉电时,本集群的服务也不受影响。
集群容灾确保 CLB 集群的可用性,但是对于一个客户来讲,如果服务器宕机,即便该机器被剔除了,也只能保证新的连接不会落在这台机器,那么长连接就会断掉。为了解决这个问题,我们实现了集群内 session 连接定期同步,在别的服务器接管故障机器的包时,能够正确找到 session,保证正常提供服务。

综上所述:

  • LVS:连接状态变化时同步;在长短连接并存的情况下,短连接业务的同步流量非常大,会对正常转发造成冲击。
  • CLB:每个连接创建5秒后才同步,连接如果在5秒内,则不同步;只同步长连接。

资源隔离

资源隔离能保证在个别业务受到攻击、CLB 出现高负载时,其他业务不受影响。具体实现方法是:

  • 定期(5s)检测 CLB 是否达到配置的高负载警戒线,如果达到了警戒线,则开启资源隔离。
  • CLB 将检测每个业务的流量、包量、连接数,超过上限的则丢弃,保证 CLB 服务器不会达到真正的高负载而影响别的业务。
  • 在正常情况下,资源隔离功能是关闭的;只有当业务突增放量,或者某个业务被攻击导致 CLB 达到警戒线时,会在5s内开启该功能,保证正常的业务转发不受影响。
  • 资源隔离采用经典的令牌桶算法,其工作过程是:定期向桶中放置一定量的令牌,每到一个包,消耗一个令牌,在一段时间内令牌耗尽,则开始丢包。

抗 DDoS 攻击

集群容灾和资源隔离都是保护 CLB 平台自身,而对于单个业务,如果被攻击,则受伤害的概率就是100%,CLB 是不允许这种情况发生的。对于 DDos 攻击,腾讯云有专门的 DDoS 防护 来保护业务,但其检测时长是10s,在DDoS 防护生效之前,可能客户的 RS 已经被压垮。为了解决这10s内的问题,我们开发了 synproxy 的功能。具体实现方法是:

  • CLB 在接收到客户端的三步握手请求时,代理三步握手,在数据包到来之前,不会打扰到 RS。
  • 当第一个包到来时,CLB 将其缓存,再与 RS 进行三步握手。
  • 握手成功之后,将缓存的数据包发送给 RS,之后的流程就透传数据包了。

此种方法能保证 DDos 攻击不会到达 RS,而是由 CLB 来承担压力。CLB 本身承载能力比较强,又是集群模式,同时又具备资源隔离的能力,所以一般情况下,很难在10s内把 CLB 机器压垮。

腾讯云 CLB 特点

腾讯云 CLB 目前提供了四层和七层协议的转发能力:

  • 四层负载均衡,对应监听器的 TCP 和 UDP。
  • 七层负载均衡,对应监听器的 HTTP/HTTPS 能力。

四层负载均衡

四层负载均衡是 CLB 最早实现的方案,也负载均衡产品必备的功能。基本原理是在 CLB 上通过端口来区分不同的业务,转发规则(rule)的 key:vip:vport:protocol。目前腾讯云使用最多的就是这种负载均衡方式,但是在腾讯云中,VIP 是属于同一个开发商的,不同开发商之间的流量严格隔离。

七层负载均衡

无日租型的方案能够应对普通的七层负载均衡服务,但是对于有 session 和 cookie 需求的七层用户,就得自己搭建 nginx 来做一层反向代理,不但浪费,可靠性也会受到影响。

基于以上情况,七层负载均衡有两种备选实现方案:

  • 方案1:外网 IP 直接起在 nginx 机器上,搭建 nginx 集群。
  • 方案2:nginx 集群接在四层 CLB 之下。

方案1的弱点是对 DDos 攻击束手无策。对于腾讯云来说,需要一个 VIP 可同时接入四层和七层,因此 CLB 采取了方案2。此外,方案2动态扩缩容方便,可应对业务快速扩容的场景。
但是,nginx 本身就是通过反向代理实现负载均衡,在腾讯云上存在的问题是:由于 VPC 网络是虚拟网络,和物理网络之间通过宿主机来打通,七层 CLB 和 RS 间无法直接使用 nginx 的反向代理功能。因此,我们在七层 CLB 中插入了 l7.ko 内核模块,用于负责封装 gre 隧道和 IP 隧道和 RS 之间交互。