腾讯云负载均衡(Cloud LoadBalancer),简称CLB, 负载均衡通过设置虚拟服务地址(VIP)将来自客户端的请求按照指定方式分发到其关联的多台后端云服务器,服务器将请求的响应返回给负载均衡器,负载均衡再将响应发送到用户,这样就向互联网用户隐藏了内网结构,阻止了用户直接访问后端云服务器,使得服务器更加安全,可以阻止对核心网络栈和运行在其它端口服务的攻击。
通过其作用可以看出负载均衡作为整个服务的网关入口,那么保证其服务在高性能的前提下既稳定又可靠显得至关重要。本文为大家介绍一下腾讯云公网负载均衡高可靠,高性能的背后做了哪些事。
2.1 多级容灾的架构,实现高可靠
首先对负载均衡对流量转发有个大致的认识,如图1客户端发起请求来访问负载均衡提供的公网VIP,CLB再根据指定的方式通过内网转发给后端的服务器。
在CLB的技术架构图出来前,大家可以想象一下,对于转发设备最关键的要有交换机和路由器,以及真正的转发机器,那么交换机和路由器如何部署才能有更高的可靠性呢,转发机器以怎样的结构组合才能带来高性能呢,简单的串行网络架构必然存在单点故障,其作为关键路径在出现故障时,对整个服务来讲是致命的,所以多交换机部署,转发机器集群方式部署势在必行。如图2左所示,在单机房得交换机和转发机器的部署情况如下,其中LD为转发机器,以下4台机器为一个集群,从图中可以看到,当某个设备发生故障,通过OSPF路由协议来快速侦测故障设备,进而秒级剔除相关设备,一个集群中多个LD对长连接进行同步,当其中LD挂了之后,请求落在另外一台LD上,对于用户来讲请求还是无损。从架构上也可以看出交换机层面的容灾,而不同的交换机部署在不同的机架位,实现了机架层面的容灾,当LD发生故障时,快速剔除故障转发机器,并能够自动添加备用的机器,快速的补齐性能损耗。
从单机房的介绍来看,还未有多机房的容灾能力,该能力对于云厂商来讲也是必不可少的,IDC A 和IDC B会配置相同的VIP等相关信息,BGP A 和BGP B出口通过配置不同的COST 值来确定主备,当某个IDC 出现了故障,那么自动调整COST值进行切换,可以在秒级实现不同IDC间容灾能力。以上即为多级容灾的架构。
从架构上实现了高可靠。
2.1 数据流转发方式,满足多种网络结构
公网负载均衡当前支持的协议主要有TCP、UDP、HTTP、HTTPS,对于四层和七层的协议,转发的方式和结构不一样,腾讯云的云主机从之前的基础网络逐步向私有网络过渡,为了满足多种网络结构,CLB的数据转发方式如图3所示:
对于HTTP、HTTPS协议的支持情况,四层集群下面还会有一层七层集群,基于NGINX开源项目来做的七层转发,具体与后端CVM的通信方式一致,对于物理网络的机器,转发到母机的数据包格式是IPIP包,经母机上的KO进行解包,并将解封的IP包转给后端的CVM,对于私有网络的CVM,封包格式为GRE包,对应的母机上依赖于VPC.KO来解包,从CVM上可以观察到收到的IP包的中SourceIP 段无论是四层还是七层都是真实的来源IP,其实就是在封包的时候,将真实的客户端IP封装到了IPIP包或者GRE包中,从而满足用户获取真实来源IP的诉求。
3.1 强大过载保护功能,保证数据整体安全
当前集群本身的性能在未引入DPDK版本之前 ,单机的可以达到160万PPS,连接数1.2个亿,入带宽可以到达10Gbps,当真实数据超过最大能力之后,为了不发生雪崩故障,集群的自我保护能力就显得极为重要,最小程度上减小对客户带来的影响。如图,内核中的管理模块tvsadm会周期的去拉取统计数据,当全局统计数据接近了警戒高水位(后台配置例如不能超过最大性能的70%),那么此时就会开启QOS能力,给规则设定一个配额,然后根据令牌桶算法进行配额限速,将整理的数据保持在安全范围之内,直到整体数据趋于安全。
3.2 抗DDoS大规模攻击,强力保护后端安全
当有大量synflood攻击时,由于后端母机的连接池资源有限制,而且后端CVM本身的性能也不固定,所以在有大量DDoS攻击时不能直接透传给后端服务器,此时CLB会暂时代理TCP连接,知道三次握手真正完成客户端发来数据后,才与后端CVM进行真正的交互。
而CLB本身资源也是有限制的,此时就不能全部代理半连接的握手,具体方式即通过LRU淘汰机制来实现半连接队列的维护。可能有一个疑问,当有更大量的DDoS攻击来了之后,将如何应对呢?这个时候公司级抗DDoS攻击平台此时就会大显身手了,大禹系统,对DDoS攻击进行识别清洗,当过大对平台造成影响时会封堵该VIP。维护半连接队列的算法流程如下图所示:
3.3 高性能的HTTPS,提升活动运营及防攻击能力
HTTPS为什么访问比较慢为什么消耗CPU呢?因为它很重,HTTPS的重,体现在如下几方面:
1. 大量的计算。SSL的每一个字节都涉及到较为复杂的计算。
2. TLS协议的封装和解析。HTTPS所有数据都是按照TLS record格式进行封装的。所有的数据都需要经过如下步骤才能发送和读取:
3. 协议的网络交互。从TLS的握手过程可以看出,即使这个过程不需要进行任何计算,TLS的握手也需要至少1个以上的网络交互。
HTTPS在计算方面的影响,包括计算原理和计算性能的优化。总体来说,HTTPS主要有如下计算环节:a.非对称密钥交换。比如RSA, Diffie-Hellman, ECDHE.这类算法的主要作用就是根据客户端和服务端不对称的信息,经过高强度的密钥生成算法,生成对称密钥,用于加解密后续应用消息。 b.对称加解密。服务端使用密钥A对响应内容进行加密,客户端使用密钥A对该加密内容进行解密。反之亦然。c.消息一致性验证。每一段加密的内容都会附加一个MAC消息,即消息认证码。简单地说就是对内容进行的安全哈希计算。接收方需要校验MAC码。d.证书签名校验。这个阶段主要发生在客户端校验服务端证书身份时。
HTTPS协议中最消耗CPU计算资源的就是密钥交换过程中的RSA计算。也是我们优化的最主要对象。具体方式a. 算法分离。将最消耗CPU计算的过程分离出来,不使用本地CPU来计算。b.并行计算。使用SSL硬件加速卡或者空闲CPU并行计算,提升计算效率。c.异步代理。算法分离和计算的过程是异步的,不需要同步等待SSL加速计算的结果返回。
通过异步代理完成RSA的私钥计算。ssl完全握手性能由18000qps提升到了63000qps,提升了~3.5倍。节省了接入机器成本,提升了业务的活动运营及防攻击能力。
3.4 DPDK版本优化,负载均衡整体性能飞跃
DPDK全称为Date plane development kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:
1) 轮询:在包处理时避免中断上下文切换的开销,
2) 用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化
3) 亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中
4) 降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽
5) 软件调优:cache行对齐,预取数据,多元数据批量操作
经过这样的优化后负载均衡整体的性能参数有了质的飞跃,如下图
3.5 与腾讯天御合作,实现百万级黑名单功能
某公司接入腾讯云,其中一个需求是防恶意刷票,对恶意用户的请求进行屏蔽,其业务架构如图:请求从cdn节点到负载均衡后,真实的客户端IP会在HTTP协议的头部中携带,此时负载均衡从七层协议的头部中获取真实客户端IP,进而实施拦截。对于一个规则来讲,负载均衡的设置黑名单的数量级在百万级别,通过与腾讯天御系统合作,后端CVM拿到真实客户端IP后,转给天御,天御系统进行模型训练,判断ip是否是恶意请求,进而将黑名单写入负载均衡,从而实现百万级黑名单的功能。
4 总结
本文介绍了腾讯云负载均衡的高可靠、高性能的背后一些技术细节,在满足用户需求的基础上提供更加让用户满意的负载均衡是团队一直不变的信念。后续提供更多的技术细节与大家分享。