作者:刘钦龙、张小龙
在基础设施领域,从谈云计算到谈云原生178软件源地址,无论技术如何创新,作为业务流量的入口,四层负载均衡都在默默支撑着业务的运行。随着业务规模的扩大,稳定、高性能是业务对于四层负载均衡的核心诉求。购买硬件四层负载均衡成本过高,纯软件实现不可扩展且成本高,只有基于开源方案自主开发才能打破僵局。高性能负载均衡并不容易做。本文分享一些实战经验,主要讨论《网易云计算如何基于开源负载均衡软件DPVS打造高性能负载均衡》。
1 为什么选择DPVS
目前,高性能负载均衡比较流行的解决方案是使用DPDK(Data Plane Development Kit),这是一个用于数据包数据处理加速的软件库,采用了网卡用户态驱动、零拷贝、内存Hugepage、Polling模式等技术。业界基于DPDK开发负载均衡主要有两种模式,一种是直接在DPDK库上开发或者移植负载均衡业务逻辑代码,另一种是利用DPDK作为加速通道,对现有的负载均衡开源软件进行加速。
DPVS是一款高性能的负载均衡开源软件,利用DPDK软件库来加速LVS(DPDK+LVS)。
网易云计算选择基于DPVS开发新一代四层负载均衡,是因为DPVS不仅解决了LVS的性能瓶颈问题,还具备LVS丰富的负载均衡业务逻辑,让团队可以专注于四层负载均衡和云网络框架适配、运维监控、稳定性、软硬件结合优化提升性能等工作,而不是重复开发负载均衡业务逻辑。
本文从DPVS云场景改造、资源隔离保障系统稳定性、软硬件融合提升系统性能、强化监控及运营功能四个方面分享网易云计算高性能四层负载均衡实践。
2. 云场景转型
云场景转型的核心包括以下三个方面:
这三个方面的改造目标是让网易云计算四层负载均衡具备“打通虚拟网络、隔离租户”、“将真实源IP传送给业务”、“集中管理健康检查流量”的能力。这些能力是网易云计算四层负载均衡产品开发的基本功能要求。只有满足这些要求的四层负载均衡才能支撑起云场景下(容器云/虚拟机云/裸机云等)的业务。下面逐一介绍实现的要点。
云网络架构适配
图1。
如图1所示,网易云计算在云场景的四层负载均衡工作在中间层。负载均衡通过ISP(Internet Service Provider)网络与用户连接;负载均衡通过VxLAN网络与云网络连接。负载均衡集群HA采用多活模式,负载均衡集群成员通过BGP协议发布负载均衡VIP地址路由,形成等价路由。集群内所有负载均衡服务器成员的服务配置相同,可以互相替换。
图 2.
如图2所示,网易云计算四层负载均衡的外网配置使用了KNI(Kernel NIC Interface)端口bond2.kni和DPDK Bond端口bond2;发布路由的程序Quagga,Quagga通信网络依赖Linux内核协议栈,外网网卡由DPVS用户态程序接管。因此Quagga需要使用bond2.kni(DPDK创建的虚拟内核端口)端口将BGP通信流量发送到外网路由设备,bond2端口负责业务流量的收发。
网易云计算四层负载均衡内网配置使用bond1端口,根据组网需求建立相应的VLAN子接口,负责连接云网络主机网络。与VPC的通信数据需要使用开发的VXLAN模块进行VXLAN封装和解封装。
添加VxLAN处理模块
VxLAN模块主要用于云网络连接和租户隔离,是云网络连接中非常关键的一个部分,所有发送到云网络的数据包都需要先进行VxLAN封装,VxLAN模块必须足够简单、高性能,还必须便于控制平面程序进行管理和配置。
VxLAN模块最初开发时参考了以下两种方案:
但网易云计算最终选择了第三种方法,去掉逻辑上的 VxLAN 端口概念,直接通过数据平面实现 VxLAN 的封装和解封装。选择此方法的考虑有:
以下命令作为示例,实现云场景的后端:
ipvsadm -A -t 60.191.87.35:2022 -s wrr
ipvsadm -a -t 60.191.87.35:2022 -r 192.168.1.178:8700 -T 10.182.6.87-10.182.4.59-5015 -m -w 100
建立监控60.191.87.35:2022,后端地址为192.168.1.178:8700,vxlan封装信息为源IP地址为10.182.6.87,目的IP为10.182.4.59及租户VNI 5015。
用户源地址透传设计
用户地址透传是指负载均衡后端程序能够获取客户端的公网地址,这个功能是云用户的强烈需求,获取到源地址之后,可以进行区域用户画像、黑白名单、区域用户行为分析等。在设计支持云网络场景时,必须解决用户地址透传问题。
网易云计算的分析是:当流量经过四层负载均衡的中间层时,如果四层负载均衡采用FNAT模式,会导致源地址丢失(因为FNAT会将源地址替换为LOCAL地址),无法满足用户的地址透传需求。因此我们决定采用DNAT模式。这里重点描述遇到的问题及其解决方法。
遇到的问题是:
社区 DPVS DNAT 模式仅支持单个 CPU 核心。
社区主要推荐使用FNAT,少数人使用DNAT单CPU Core模式,存在不稳定因素。
社区无法实现DNAT模式多CPU核,这是社区的一大弊端。其无法使用多核和硬件网卡类型、架构息息相关。社区实现的精妙之处在于,会话(类似conntrack)是无锁的,每个CPU会话都是独立管理的。为了达到这个要求,正向和反向流量必须由一个CPU处理,因为社区支持的是经典网络场景。在多业务CPU CORE DNAT模式下,后端回来的数据包(反向流量)找不到固定的特征,必须使用硬件分流回到正向流量所在的CPU。
图 3.
因此云场景需要解决VPC云主机后端回包问题,网易云计算利用新网卡支持的rte_flow支持使用VxLAN inner dst mac进行反向流量硬件引流解决该问题,具体解决流程如图4所示:
图 4.
四层负载均衡采用双臂部署,通过双网卡实现。每个CPU固定绑定一个队列,外网卡的rss硬件功能根据数据包的五元组将数据包哈希到外网卡硬件队列中。绑定队列的CPU会使用预先与CPU关联的MAC地址作为Vxlan inner src MAC将流量发送到云端网络;后端记录该mac,作为Vxlan inner dst MAC进行发包;内网卡精准匹配VxLAN数据包内层目的MAC地址,将后端来的数据包放入绑定了inner MAC的rx队列中。由于rx队列与CPU一一绑定178软件源地址,所以从后端回来的数据包可以重新回到CPU处理前向流量。
具体过程如下:
当数据流量发送到四层负载均衡的外网口时,RSS到达外网口q3队列,在CPU3上建立转发会话;
CPU3进行VxLAN封装,将VxLAN内层header的src MAC改为02:02:00:00:00:03发送到云端网络,src MAC地址03代表CPU Core ID。
宿主机中的SDN程序会记录该数据包的五元组对应的源MAC,后端在将流量发送到负载均衡服务器时会查询该记录,将VxLAN内的目的MAC替换为02:02:00:00:00:03。
四层负载均衡的内网网卡根据VxLAN内目的MAC进行数据分流,按照网卡硬件rte_flow配置的策略将反向流量发送到内网端口的q3,让CPU3继续处理。
设计新的健康检查框架
健康检查是四层负载均衡的重要组成部分,帮助负载均衡判断业务后端服务是否处于正常工作状态,并及时移除无法工作的后端服务,使得负载均衡的后端服务始终处于健康状态,保障业务通过负载均衡稳定运行。
云场景中的后端在云网络,传统的健康检查程序是通过socket程序实现的,socket不支持VxLAN封装,无法连接云网络的后端,因此传统的健康检查程序在云场景下无法正常工作。为了解决传统健康检查面临的问题,网易云计算提供了健康检查通道技术,帮助健康检查程序连接云网络,传统健康检查程序无需任何改动,即可对云网络的业务后端服务进行检查。
图 5.
那么使用Kernel协议栈的健康检查程序和用户态协议栈中的健康检查通道是如何配合工作的呢?如图5所示:
健康检查程序无需修改,只需要将需要检查的后端云主机地址和端口改为预先指定的健康检查通道的地址和端口即可。
建立程序与通道接口地址端口的绑定关系、建立通道与后端地址端口的绑定关系(间接建立健康检查程序与后端地址端口的绑定关系);
健康检查流量通过预先配置的路由和预先配置的静态ARP信息拉取到bond2.kni端口,进入健康检查通道;
巡检通道对流量进行FNAT转换和VxLAN封装后发送到相应后端;
从VPC后端返回的流量按照上述逻辑反向运行,控制流量通过bond2.kni端口发送到传统的健康检查程序。
这样设计的健康检查机制有以下优点:
健康检查程序透明,健康检查通道是工作在数据平面的一个逻辑层概念,可以理解为一个中间代理层,健康检查通道将健康检查行为完全委托给健康检查程序,对健康检查程序透明,可以直接使用传统网络的健康检查程序来检查云网络后端。
运维简便,健康检查通道统一管理所有租户的健康检查行为。
简单。这个架构将健康检查通道中的健康检查逻辑和云网络连接解耦,并且提供了控制平面使用的接口,配置起来也非常简单。
此结构同样适用于经典的网络场景。
3 资源隔离保障系统稳定性
DPVS原生框架已经实现了负载均衡数据处理会话的CPU级隔离,该机制对并发和新建会话能力有极大的提升。另外,原生框架采用DPDK作为底层加速通道,已经提供了基本的高性能框架。但是从实际业务运行的稳定性来看,该框架还有很大的提升空间。下面将先分析原生框架存在的问题,再给出网易云计算的解决方案。
图 6.
如图6所示,DPVS框架根据流量来源的不同,分为六个部分;图中用六个数字来表示:
上半年健康体检流量
下半年健康体检交通
BGP心跳及配置同步前半部分流量
BGP心跳及配置同步后半段流量
控制平面配置流量
负载均衡转发业务流量
问题1:控制平面接口模块和KNI模块会互相影响
1和3需要master cpu0运行KNI模块处理逻辑,将流量从与内核共享队列中取出;5也需要master cpu0处理用户业务配置,但是用户业务配置级别具有突发性和不确定性,会独占master cpu0,导致1和3号流量处理不及时而丢弃。简单描述一下这个问题,控制平面接口模块和KNI模块因为争夺master cpu0的计算资源,所以互相影响。
问题二:BGP通信流量和业务流量互相影响
4属于BGP通讯流量的后半部分,这个流量团体的原生处理是轮询各个从站CPU将数据包放入绑定的队列中发送到外网,BGP通讯流量依赖外网网卡的收发队列资源和所有从站CPU计算资源;6属于负载均衡业务流量,业务流量具有非常明显的突发性,当出现流量突发时,外网网卡的队列资源和CPU资源会被长时间占用,BGP通讯流量无法获得队列和CPU资源,数据包被丢弃,BGP断连。
问题三:健康检查通道流量与业务流量互相影响
2会使用从CPU1和下行队列1来向VPC后端发送和接收数据包;6的业务流量有明显的突发性,正如问题2所解释的,这样也会影响到健康检查通道,有可能导致健康检查无法正常工作,进而导致业务无法提供服务。
经过分析,以上三个问题描述的是各个流程之间的相互影响和资源依赖。社区原生框架在业务流程比较稳定、配置流程变化不大、普通规模的后端、稳定的组网环境都OK的情况下,是可以正常工作的。但为了达到我们产品级的稳定性要求,我们还需要做大量的工作,因此需要使用资源隔离机制来保证系统的稳定性。网易云计算的解决方案如图7所示:
图 7.
控制平面接口模块独占CPU n+1,KNI模块使用主cpu0进行处理,两个模块在CPU层面物理上独立,解决了问题1;
BGP通信流量使用CPU n和qn,业务流量使用CPU1…CPU n-1和q1…qn-1,两个模块的CPU和外网队列物理层面独立,解决了问题2。
健康检查通道使用CPU n和下行端口的qn队列,业务使用上下行端口的CPU1…CPUn-1、q1…qn-1。健康检查通道的流量和业务流量在物理上是相互隔离的,互相不影响,解决了问题3。
我们采用的方案解决了原生框架提出的三个缺陷,但也引入了新的问题。如图7所示,BGP通信的流量和健康检查通道的流量会共用CPU n,会产生影响。但经过实际的极限性能测试,BGP通信的流量和健康检查通道的流量都不大,一个物理CPU n就足够处理了,所以实际业务中不用担心这个问题。
4 软件与硬件结合提升系统性能
高性能、低成本一直是数据面开发者追求的目标,我们在新启动一个负载均衡项目时,就定下了千万级并发连接、千万级PPS、百万级新增能力的目标,因为这个级别的性能指标已经可以帮助企业满足业务需求;DPVS是DPDK与LVS的结合,具备DPDK的性能优势(Kernel by-pass、RX Steering与CPU affinity、Zero Copy、Polling代替interrupted等),继承了这些优势,可以帮助实现千万级的数据包通过率。我们通过软硬件结合的机制,提升业务最关注的并发能力和业务秒杀场景所需要的新增能力。
会话无锁实现
会话无锁是并发和新能力需要的核心技术。对此,我们创新性地开发了新的DNAT模式,利用网卡硬件拆分(例如:rss和rte_flow)和后端SDN软件设计,将一个会话的前向和反向流量分别处理在一个CPU核上,这样不同CPU核上的会话互不影响,会话之间也无需加锁。这在上面DNAT模式实现中已经描述过。
使用 NIC 硬件卸载功能
该网卡除了利用上面介绍的网卡硬件卸载rss和rte_flow外,还用于卸载VxLAN数据包内层L4校验和计算。我们下一步的计划是利用Mellanox 25G CX5网卡的VxLAN和QoS硬件卸载功能,进一步提升新建容量和PPS容量。
5 增强监控和操作功能
监控和运维能力代表着负载均衡组件的硬实力,我们根据网易内部的业务实践和运维需求,在这方面做了大量工作,下面简单描述一下,后续我们会出一篇论文专门讨论监控和运维。
多维度监控能力
业务维度:新增VIP级别统计,精确到负载均衡后端级别,额外开发了连接数VIP维度统计、VIP Qos丢包统计、后端级连接数统计等;
CPU维度:精确到CPU级别,CPU维度业务统计(并发连接数、丢包数等);
系统维度:查看CPU使用率、丢包率统计,定位丢包位置确认是否是DVPS导致业务问题等;
有了上述多维度的监控,通过参考业务资源维度,当业务出现异常时,可以清晰的体现在监控指标中。通过业务和资源维度的对比,可以确定问题出现在哪个模块,问题出现在哪个数据面,CPU 是否和网卡有关等等。
日志分类管理
日志是组件的基础能力,在日志能力方面我们进行了模块划分和日志级别划分,提升日志的灵活性,不同场景、不同模块可以开启日志功能,并指定具体模块的日志级别。
故障排除
在运维方法上,我们开发了条件计数功能。条件计数是连通性问题发生时的辅助定位方法。为了更精准地定位和跟踪流量功能,简化条件的复杂性并平衡性能,我们目前只提供了源地址维度的条件;我们希望通过这种方法来跟踪以下内容:
六,结论
目前,网易云计算以DPVS为框架完成的新一代高性能负载均衡已经稳定运行一年多,支撑了网易内部各大业务方,如网易媒体、网易云音乐、网易严选等,各项性能指标均符合预期,新增连接能力达到百万级,并发连接能力达到千万级,满足业务需求。这是网易云计算拥抱开源,结合现有云计算架构与业务实现的一次有意义的实践。此外,我们在解决功能痛点、监控运维等方面也做了大量的设计工作,后面会讲到。
关于作者
刘钦龙,网易杭州研究院资深云计算开发工程师,7年服务端开发优化经验,负责网易云计算四层负载均衡数据平面设计,参与过网易轻舟服务网格性能优化工作。目前专注于底层轻舟云原生 Serverless 平台的开发和优化,主要关注 Kubernetes、Istio、Knative、Cilium 等技术领域。
张小龙,网易技术委员会委员,网易云计算事业部技术总监,2012年毕业于浙江大学博士后加入网易杭州研究院,一直负责基础设施研发运维工作,在虚拟化、网络、容器、大规模基础设施管理、分布式系统等技术架构方面有多年经验,目前主要关注云原生技术。
活动推荐
公司已经有了Hive离线数仓,现在业务对实时性要求更高,但又不想在Hive之外再建一个新的实时数仓,会导致重复开发,该怎么办?8月10日20:00,阿里巴巴技术专家李劲松亮相InfoQ《公开课》直播间,详细介绍了如何使用Flink解决Hive流批一体化准实时数仓问题,实现更高效合理的资源配置。