京东基于DPDK技术的高性能四层负载均衡器SKYLB

摘要

随着京东业务的高速增加,做为应用入口的负载均衡,大流量大并发带来的挑战愈来愈严峻。本文主要介绍了京东商城设计和实践的一套高可靠,高性能的负载均衡器,咱们命名为SKYLB。是一个使用intel DPDK报文转发库,实现运行在通用X86服务器上自研的分布式负载均衡服务。配合网络路由器的OSPF或者BGP协议,组成承担京东数据中心核心四层负载均衡的集群。最大限度的发挥普通X86服务器硬件资源的性能,实现一套适合于京东商城业务的低成本,分布式,高性能,可扩展的智能负载均衡系统。前端

介绍

京东商城目前是国内最大的电商企业。京东的机房内部的流量爆炸式快速的增加。早在2016年初京东商城已经将全部的业务系统所有迁移到容器平台JDOS,线上百万+容器实例稳定运行。大流量的负载均衡的分配显得相当重要,也是京东商城新一代软件定义数据中心的关键基础服务设施之一。git

负载均衡器通常介于网络上的路由器与后端服务器之间,负责将每一个数据包经过必定的服务匹配,将其转发到后端服务器节点。充分考虑到京东商城数据中心全容器及全三层BGP组网的模型。以及基于DPDK的几乎达到网卡限速的性能,咱们在设计负载均衡时,仅考虑实现了FULLNAT模式,即出向和入向的流量均经过负载均衡器,基本数据流程图以下图1所示:github

image

通常根据业务及流量的规模的不一样阶段来选择使用不一样的负载均衡,一般咱们在负载均衡的选择上大体有如下两个方向:1)硬件负载均衡,如F5。CitrixNetscaler等;2)软件负载均衡,如基于LVS,Haproxy,Nginx等开源软件来实现的负载均衡。对于上述两种负载均衡的选择,各有优缺点,以下:算法

1)硬件负载均衡编程

可扩展性受限,没法跟上业务流量增加的需求。以及如61八、双十一大促等瞬间流量高峰。后端

虽然能够成对部署避免单点故障,可是通常只能提供1+1冗余。api

缺少互联网快速迭代的灵活性,升级成本昂贵。安全

通常只能根据网络的状况来设定负载均衡,无关乎实际系统和硬件的状况。性能优化

成本较高。服务器

2)基于开源软件的负载均衡

能够根据实际系统和应用的状态来合理的负载,迭代、扩容和部署相对方便。

单台负载均衡性能相对较差,须要用集群来支撑负载均衡的总体性能。

性价比较低。

咱们的目标:

  1. 设计实现一套高可靠、高性能、易维护及性价比高的L4负载均衡系统,。
  2. 基于通用X86_64服务器框架,以及支持DPDK网卡硬件,易开发和移植。
  3. 方便部署、删除和维护,集成到京东软件定义数据中心(JDOS2.0)系统,做为京东下一代软件定义数据中心的基础组件。
  4. 负载均衡下的服务器基于系统应用负载流量均摊,负载均衡器提供N+1 冗余,借助OSPF/BGP控制负载均衡器的流量负载。
  5. 基于系统应用级别的探活,自动故障检测及流量快速恢复。

本文主要介绍了SKYLB一种基于DPDK平台实现的快速可靠的软件网络负载均衡系统。不只能够快速的横向扩展,还能够最大限度的提高负载均衡单个NIC的处理转发速度,来实现L4的负载均衡。借助DPDK的优点,如便利的多核编程框架、巨页内存管理、无锁队列、无中断poll-mode 网卡驱动、CPU亲和性等等来实现快速的网卡收发及处理报文,后续考虑TCP/IP 用户态协议实现和优化,进而实现L7负载均衡。

系统概览

工做场景

SKYLB部署在京东容器集群JDOS的前端,对于一个应用集群,发布一个或多个VIP到SKYLB服务上,当客户端须要访问应用节资源URL,首先经过域名访问JD智能分布式DNS服务(SKYDNS详见https://github.com/ipdcode/sk...), SkyDns会智能返回当前最近且状态正常且负载正常的VIP服务的IP,客户端就会向VIP去请求链接。

SKYLB节点上运行了一个路由发布服务agent,咱们使用该agent与开启OSPF/BGP的路由器作路由交互,当SKYLB的上层路由器接收到请求VIP的数据包时,路由器经过(OSPF/BGP)的等价多路径转发协议选择一个可使用的发布该VIP的SKYLB节点,将报文转发给一个SKYLB节点。经过这种策略来实现VIP的发布和横向容量负载能力扩展。

当报文经过上述步骤到达SKYLB负载均衡后,经过经常使用的负载均衡策略(round robin,一致性hash ,最小链接数),将数据包送到相应的后端容器服务。

系统架构

JingdongDatacenter Operating System(JDOS) 是基于JDOS提供物理机/虚拟机/容器的统一管理系统、配备灵活的网络互连、可靠的分布式共享存储,实现软件定义数据中心的计算资源统一管理和集群管理。经过使用JDOS,能够直接迅速获得任意须要的计算、存储、网络、安全等方面的资源和能力。SKYLB做为整个JDOS系统的一个重要组成部分,负责提供集群的L4负载均衡能力,经过restful API等接口与JDOS系统交互。用户能够经过统一调度管理平台便捷的建立、删除、迁移负载均衡系统。同时多个应用服务进行流量分发的负载均衡服务,从而扩展应用系统对外的服务能力,而且经过消除单点故障提升应用系统的可用性。

系统的基本架构以下图2所示,每个集群配备一组可容灾的负载均衡控制中心,主要经过restful api接口负责与JDOS调度中心交互,接收vip的配置请求。同时咱们在每个SKYLB的节点上运行一个代理进程,该代理进程经过gRPC与控制中心链接。接收控制中心下达的建立及删除vip,后端server endpoint服务等一系列指令,经过load balancer 提供的命令行执行相应的指令。接收load balancer 关于流量及报文的监控信息,对于流量及监控进行告警,而且通知控制中心和调度中心进行扩容等操做。

代理进程同时还负责后端服务 server endpoint基于服务可用性的健康检查,及时根据后端服务的状态经过命令行进行添加和删除的操做。

image

优点

1)扩展性

支持动态添加和删除后端服务的容器,实现无缝的伸缩;在伸,缩过程当中,对相关调用和访问者无影响。

2)高可用性

提供多活负载均衡,有多个VIP,它们对应一个域名,自研DNS服务SKYDNS会根据请求的客户端IP智能解析可用的VIP,返回给用户,从而实现更高的可用性;即便一个VIP不可用,也不会影响业务系统对外提供服务。同时借助OSPF/BGP等协议实现负载均衡的横向扩充

3)服务能力自动可调

SKYLB根据VIP实际接收流量的负载须要调整负载均衡的服务能力,好比流量、链接数的控制等指标。

功能特色

1)协议支持

负载均衡支持包含TCP、UDP协议的四层负载均衡,配备健全的链路跟踪机制,以及多种调度策略,用户能够根据服务的须要建立合适本身的负载均衡。

2)高可用性

支持容器的健康检查,除传统的IP+Port,并加入对URL检查,保证应用可用性: 健康检查频率可自定义;一旦探测到异常,则不会将流量再分配到这些异常实例,保证应用可用性。

3)集群部署,多层次容错机制: 负载均衡采用集群部署,支持热升级,机器故障和集群维护对用户彻底透明,结合DNS使用还可支持全局负载均衡。

4)灵活性

在此我向你们推荐一个架构学习交流群。交流学习群号:948368769里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

支持多种流量调度算法,使得流量分配更均匀: 负载均衡支持加权轮询和最小链接数这两种调度算法,可根据自身需求选择相应的算法来分配用户访问流量,并支持设置后端容器权重,使得流量调度更均匀,提高负载均衡能力。

支持会话保持,知足用户个性化需求: 负载均衡经过IP地址实现会话保持,可将必定时间内来自同一用户的访问请求,转发到同一个后端容器上进行处理,从而实现用户访问的连续性。

5)易用性

提供多种管理途径,轻松操纵负载均衡: 用户可经过控制台轻松实现负载均衡器的配置、释放等功能。后续会开放标准的API或SDK提供给用户,从而本身开发对负载均衡的控制管理。

系统设计及技术实现

负载均衡模式选择

经常使用的负载均衡模式有DR,NAT,TUNNEL,FULLNAT。每种模式都有本身的优点和使用场景,业内对每种模式的分析比较文档不少,再也不介绍。因为JDOS容器网络须要VLAN隔离,而FULLNAT恰好支持LB和RS跨VLAN通讯,结合咱们自身容器集群的需求,咱们在实现SKYLB时主要考虑支持FULLNAT模式。图3是SKYLB的FULLNAT负载均衡模式中数据包的流向图。SKYLB位于客户端和后端服务之间,对于客户端的请求报文,将目的地址替换成后端服务的地址,源地址替换成SKYLB的本地地址,对于后端服务的响应报文,将目的地址替换成客户端地址,源地址替换成SKYLB的VIP地址。

image

借助DPDK实现高速转发

Data Plane DevelopmentKit(DPDK):是运行在Linux 用户态,实现X86通用平台网络报文快速处理的库和驱动的集合,以下图4所示,其主要特色:

多核编程框架及CPU亲和性

每一个NUMA节点有单独的CPU和本地内存

CPU访问本地内存速度比访问远端内存快,避免CPU访问远端内存

注意网卡挂载的NUMA节点巨页内存管理

巨页(HugePage)

普通内存页面大小4KB,巨页内存页面大小2MB/1GB

减小页表项数目,下降TLB miss

使用大页面比使用4K的页面性能提升10%~15%

零拷贝,报文数据及转发内存零拷贝。

无锁队列

使用无锁队列,入队出队无需阻塞等待锁资源

poll-mode网卡驱动

DPDK网卡驱动彻底抛弃中断模式,基于轮询方式收包

image

包处理架构实现

图5是SKYLB基于RTC数据包处理模型实现的架构。SKYLB选择一个核做为控制核,执行命令配置,与内核交换,ARP表维护等任务。其余的核做为工做核,每一个工做核轮询网卡的一个RX队列,执行数据包处理任务。SKYLB利用网卡的RSS功能实现客户端请求报文的分流,利用网卡FDIR功能实现后端服务响应报文的分流。SKYLB对报文分流目的是要保证客户端的请求报文和其对应的服务端响应报文到达同一个工做核上。在这个目的达成的前提下,SKYLB的业务实现会简单和高效不少。每一个工做核维护一张session表,同于保存客户端和后端服务的链接信息。SKYLB不须要考虑对session表加锁,由于每一个工做核的session表都是独立的。

image

咱们设计SKYLB每一个工做核独占至少一个LIP,并将LIP信息写入网卡配置。图6是网卡对IP报文分流的流程图。图中dst_ip即SKYLB为每一个工做核分配的LIP。网卡对后端服务响应报文的目的地址LIP匹配成功,将报文送到绑定的RX队列,没有匹配的报文则能够认为是客户端的请求报文,按RSS流程分配RX队列。

image

SKYLB在启动过程当中还会为每一个物理口建立一个KNI接口,控制核负责轮询KNI接口。该接口主要用于外部程序quagga向路由器发布VIP信息,Agent检查后端服务健康状态。

SKYLB目前支持的负载均衡调度算法有一致性hash,round robin和最小链接数算法。

Session五元组,SKYLB采用五元组来实现会话的管理功能,以下图7 所示:

image

负载均衡冗余设计

SKYLB使用BGP或者OSPF的模式组成集群,经过上述协议将数据包散列到集群中各个节点上,保证单台SKYLB故障或者恢复后能动态的将机器添加及删除。其冗余实现设计以下图6所示:

image

性能优化实践

良好的流程设计是性能提高的关键,这方面的流程涉及和业务相关,缺少共性,所以不作详细阐述。主要介绍SKYLB性能优化过程当中使用的其余优化方法。

恰当地使用rte_prefetch0(),能够减小cache-miss次数,避免当前函数成为性能热点。性能调优工具perf能够帮助咱们分析应该在哪处代码使用预取。例如咱们使用perf发现报文处理函数中有一个处代码是性能热点,该代码用于读取新报文的类型字段并判断,分析认为极可能是cache-misses形成的。在进入报文处理函数前使用rte_prefetch0(),有效避免该函数成为热点。

在此我向你们推荐一个架构学习交流群。交流学习群号:948368769里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

恰当地使用likely()和unlikely(),能够减小分支预测失败的次数。咱们在SKYLB代码的一处分支语句中使用unlikely()优化,性能提高明显。分支预测优化点能够借助perf分析肯定,也能够根据本身对代码执行流程的理解肯定。

尽可能减小锁的使用。SKYLB中配置信息不常常变化,咱们没有单独为每一个可能争用的资源加锁,而是只用一把DPDK提供的读写锁,每一个读线程在加读锁后,处理一批报文,而后释放读锁。既简化流程,又减小了操做读写锁的开销(DPDK读写锁的开销并非很大)。

性能数据

测试环境:

CPU:Intel(R) Xeon(R) CPU E5-2640 v3

NIC:intel 82599ES 10-GigabitSFI/SFP+ Network Connection

测试配置:

负载均衡模式:FULLNAT

调度算法:一致性hash

配置:CPU占用8核 内存占用4G

性能测试数据:

1)UDP发包,测试转发性能,咱们使用了SKYDNS做为后端服务,客户端采用UDP请求DNS

image

2)NGINX做为后端服务,压测HTTP性能。

配置:CPU占用8核 内存占用4G

image

image

image

总结

本文主要介绍了SKYLB,一种的基于intel DPDK平台开发的负载均衡器。其接近网卡线速处理及转发能力,灵活的部署,多样的监控以及可靠的稳定性。基本上覆盖全部4层负载均衡的业务处理需求,配合集群管理以及调度,做为京东数据中心操做系统(JDOS)的一个重要的组成部分,在京东数据中心发挥相当重要的做用。

相关文章
相关标签/搜索