从支付宝官方公布的数据来看,在除夕当天大约有2亿人参加红包活动。今年的slb和往年是不一样的,slb进行了平台重构,为业务提供了跨可用区的方案。以下内容根据直播视频整理而成。
slb成了公有云、云产品服务、电商平台、交易平台的流量入口。
负载均衡即分担负载、提供服务,具体的说是当访问请求进入到slb后,slb会做后端服务器的选择,通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。最大的好处是后端的服务器可以动态扩容。
整个集团的负载均衡都是基于软件实现的,slb(sever load balancer)是基于开源的lvs(linux virtual server)实现的。slb的优点包括:自主、可控,由于是代码是开源的,代码是可以自主修改的,而新的功能也可以自主加入;可伸缩性,整个slb是集群部署的,通过bgp发布vip、local adress路由等,实现集群负载通过路由ecmp将流量引到不同的服务器上;高可靠性,slb通过多个维度提供了高可用性的保障;易于部署,slb跑在普通的x86服务器上。
整个软件slb分为两部分:基于tcp的四层负载均衡和基于http/https的七层负载均衡。红包业务主要使用了四层负载均衡。
上图是以杭州region为例的集群部署图。比如,在杭州选择了两个可用区(可用区a和可用区b,是不同的idc机房)。四层负载均衡lvs和七层负载均衡tengine都是集群化部署的。对于四层负载均衡,当访问流量从internet进来之后首先会经过lvs集群,直接转发给后端的ecs。对于七层负载均衡,当访问流量从internet进来之后首先会经过lvs集群,然后经过tengine集群再转发给后端的ecs。七层负载均衡比四层负载均衡多了一次集群内的转发,虽然造成少量的性能开销, 但是给客户带来了一些feature和https卸载的支持。
新的slb最大的不同是从内核转发模式改为用户态转发模式,从系统架构上解决性能问题;支持fullnet的转发模式,摆脱部署时网络的限制;利用硬件特性,实现cpu完全并行化处理,性能大幅提升;利用numa 特性,给每个numa保存一份核心数据;利用cpu硬件指令crc32使消耗降低8倍。
上图中,左边部分是整个系统的架构图。control plane为控制面,data plane为数据面,设计采用分离方式。控制面主要做两件事情:负责路由的发布,使用ospf和bgp来发布vip和local address路由;从控制系统中接收负载均衡的配置下发到数据面。数据面的每个cpu上都有一个数据转发的线程来处理数据,从业务网卡进来的数据包会直接被data plane的线程处理并发送出去。
该系统架构实现了:<b>数据面轻量。</b>从内核处理改为用户态处理,减少了原架构内核处理的中断,此外将data plane的线程从numa中隔离出来专门用于转发保证了cpu不会被抢占。每个cpu是并发处理数据的,没有数据的交互,因此也没有锁。<b>充分发挥硬件。</b>核心数据表是cpu cache对齐的。采用hugepage技术,减少tlb的miss,提升性能。利用了numa的特性,因为路由表和arp表在服务器上一般是两路cpu的,每个numa上有一份数据,当cpu访问路由表或者arp表的时候,就会就近取本numa上的数据。充分利用了网卡的checksum offload等功能。<b>优化流程和算法。</b>把内核中的管理结构由链表全都换为hash结构,去掉了很多冗余的流程。
当用户访问lvs后面服务器的时候,在lvs上做dnat+snat,摆脱了传统dr模式和nat模式对网络的依赖。通过实现fullnet模式的转发,网络不再受限,机房可以很轻松部署在机房中,本机房服务器和跨机房服务器都可以作为后端服务器提供服务。
另外一个性能优化最关键的点在于cpu的并行化。从图中可以看出,物理网卡nic上有多个cpu,这里也是采用了fullnet的转发模式。当用户的访问到达slb之后,源ip是client,目的ip是vip,系统会配置网卡的rss策略,当收到数据包之后使用数据包的源ip和目的ip进行hash,使这些数据流均匀散落在cpu1到cpun之间。这样的策略可以保证从client 发起的同一条流的数据包,通过rss后都同时落在同一个cpu上。
性能的提升如上图所示,蓝色是lvs版本,红色是性能优化版本。
高可用的负载均衡体现为五个方面:后端服务器高可用,使用健康检查及时剔除异常rs;服务器高可用,四网口,双上联交换机,路由优先级;集群高可用,热升级无感知,单机故障无感知,交换机故障无感知;可用区间高可用,主备双site,秒级切换;安全防护,synflood防御。
后端服务器高可用主要体现在两个方面。比如,4台slb机器独立向后端的rs做健康检查,当rs1出现错误情况变得不可用的时候,转发服务器会及时发现异常的服务器,从转发列表中剔除,后续的流量会转发给rs2。这样就保证到了当业务的服务器有一个服务器异常时会被自动的剔除。支持的健康检查方式也有两种:通过tcp端口探测;http请求探测。
上图是网络拓扑图。最上方是两个路由器,接着两个交换机,转发服务器有4个口分别接在两个交换机上。路由器、交换机和服务器以及布线是全冗余的,任意一个路由器、交换机或者服务器接口挂掉之后,流量会从backup的方向去提供服务。实现了双a的网络架构,这样在正常情况下,所有的路由器、交换机、服务器都是服务的、活跃的,没有冷备设备的。另外,在可用区内实现了实时会话同步功能,当用户的请求通过slb去访问后台服务的时候,假如这个请求落在了转发服务器1上,那么在转发服务器1上会创建一个记录源ip、目的ip、转发后的local address等信息。这个session建立好之后,会把这个session通过组播包的方式发送给交换机,交换机收到这个包之后会把这个组播的请求发到其他服务器上,其他服务器会把请求拿出来在本地创建一个备份的session。假如服务器1挂掉了,网络会重新选择路由,假如这条流落在了服务器2上,可以根据之前的session转发信息进行数据包的转化,然后将数据包正常发送出去。这样的好处是当可用区内的任意一个设备出现问题时,业务是感觉不到的。
如上节中讲到,如果可用区a内的所有路由器全都挂掉,此时可用区内的容灾就失效了。可用区间的容灾就是处理整个可用区a挂掉的情况,具体做法将流量切换到另外一个可用区b,由于存在主备关系,可用区b也有这些转发规则,业务的流量也是不受影响的,可以通过可用区b里的slb提供服务。实现可用区间容灾最核心的技术是使用了大小路由,由于用户的连接都要全部断开,所以用户是能感觉到的,对业务是有影响的。
从下到上来看,最下面是多台服务器,往上是slb集群部署,然后是可用区间的高可用性。此外,如果用户配合使用云解析(智能dns)的话,可以做到跨区域的高可用。
未来主要从硬件升级和高可用两方面入手。