京東基于DPDK技術(shù)的高性能四層負(fù)載均衡器!
隨著京東業(yè)務(wù)的高速增長,作為應(yīng)用入口的負(fù)載均衡,大流量大并發(fā)帶來的挑戰(zhàn)越來越嚴(yán)峻。本文主要介紹了京東商城設(shè)計(jì)和實(shí)踐的一套高可靠,高性能的負(fù)載均衡器,我們命名為SKYLB。是一個使用intel DPDK報(bào)文轉(zhuǎn)發(fā)庫,實(shí)現(xiàn)運(yùn)行在通用X86服務(wù)器上自研的分布式負(fù)載均衡服務(wù)。...
隨著京東業(yè)務(wù)的高速增長,作為應(yīng)用入口的負(fù)載均衡,大流量大并發(fā)帶來的挑戰(zhàn)越來越嚴(yán)峻。本文主要介紹了京東商城設(shè)計(jì)和實(shí)踐的一套高可靠,高性能的負(fù)載均衡器,我們命名為SKYLB。是一個使用intel DPDK報(bào)文轉(zhuǎn)發(fā)庫,實(shí)現(xiàn)運(yùn)行在通用X86服務(wù)器上自研的分布式負(fù)載均衡服務(wù)。配合網(wǎng)絡(luò)路由器的OSPF或者BGP協(xié)議,組成承擔(dān)京東數(shù)據(jù)中心核心四層負(fù)載均衡的集群。最大限度的發(fā)揮普通X86服務(wù)器硬件資源的性能,實(shí)現(xiàn)一套適合于京東商城業(yè)務(wù)的低成本,分布式,高性能,可擴(kuò)展的智能負(fù)載均衡系統(tǒng)。
介紹
京東商城目前是國內(nèi)最大的電商企業(yè)。京東的機(jī)房內(nèi)部的流量爆炸式快速的增長。早在2016年初京東商城已經(jīng)將所有的業(yè)務(wù)系統(tǒng)全部遷移到容器平臺JDOS,線上百萬+容器實(shí)例穩(wěn)定運(yùn)行。大流量的負(fù)載均衡的分配顯得至關(guān)重要,也是京東商城新一代軟件定義數(shù)據(jù)中心的關(guān)鍵基礎(chǔ)服務(wù)設(shè)施之一。
負(fù)載均衡器一般介于網(wǎng)絡(luò)上的路由器與后端服務(wù)器之間,負(fù)責(zé)將每個數(shù)據(jù)包通過一定的服務(wù)匹配,將其轉(zhuǎn)發(fā)到后端服務(wù)器節(jié)點(diǎn)。充分考慮到京東商城數(shù)據(jù)中心全容器及全三層BGP組網(wǎng)的模型。以及基于DPDK的幾乎達(dá)到網(wǎng)卡限速的性能,我們在設(shè)計(jì)負(fù)載均衡時,僅考慮實(shí)現(xiàn)了FULLNAT模式,即出向和入向的流量均通過負(fù)載均衡器,基本數(shù)據(jù)流程圖如下圖1所示:
圖1負(fù)載均衡流程圖
一般根據(jù)業(yè)務(wù)及流量的規(guī)模的不同階段來選擇使用不同的負(fù)載均衡,通常我們在負(fù)載均衡的選擇上大致有以下兩個方向:1)硬件負(fù)載均衡,如F5。CitrixNetscaler等;2)軟件負(fù)載均衡,如基于LVS,Haproxy,Nginx等開源軟件來實(shí)現(xiàn)的負(fù)載均衡。對于上述兩種負(fù)載均衡的選擇,各有優(yōu)缺點(diǎn),如下:
1)硬件負(fù)載均衡
可擴(kuò)展性受限,無法跟上業(yè)務(wù)流量增長的需求。以及如618、雙十一大促等瞬間流量高峰。
雖然可以成對部署避免單點(diǎn)故障,但是一般只能提供1+1冗余。
缺乏互聯(lián)網(wǎng)快速迭代的靈活性,升級成本昂貴。
一般只能根據(jù)網(wǎng)絡(luò)的情況來設(shè)定負(fù)載均衡,無關(guān)乎實(shí)際系統(tǒng)和硬件的情況。
成本較高。
2)基于開源軟件的負(fù)載均衡
可以根據(jù)實(shí)際系統(tǒng)和應(yīng)用的狀態(tài)來合理的負(fù)載,迭代、擴(kuò)容和部署相對方便。
單臺負(fù)載均衡性能相對較差,需要用集群來支撐負(fù)載均衡的整體性能。
性價(jià)比較低。
我們的目標(biāo):
- 設(shè)計(jì)實(shí)現(xiàn)一套高可靠、高性能、易維護(hù)及性價(jià)比高的L4負(fù)載均衡系統(tǒng),。
- 基于通用X86_64服務(wù)器框架,以及支持DPDK網(wǎng)卡硬件,易開發(fā)和移植。
- 方便部署、刪除和維護(hù),集成到京東軟件定義數(shù)據(jù)中心(JDOS2.0)系統(tǒng),作為京東下一代軟件定義數(shù)據(jù)中心的基礎(chǔ)組件。
- 負(fù)載均衡下的服務(wù)器基于系統(tǒng)應(yīng)用負(fù)載流量均攤,負(fù)載均衡器提供N+1 冗余,借助OSPF/BGP控制負(fù)載均衡器的流量負(fù)載。
- 基于系統(tǒng)應(yīng)用級別的探活,自動故障檢測及流量快速恢復(fù)。
本文主要介紹了SKYLB一種基于DPDK平臺實(shí)現(xiàn)的快速可靠的軟件網(wǎng)絡(luò)負(fù)載均衡系統(tǒng)。不僅可以快速的橫向擴(kuò)展,還可以最大限度的提升負(fù)載均衡單個NIC的處理轉(zhuǎn)發(fā)速度,來實(shí)現(xiàn)L4的負(fù)載均衡。借助DPDK的優(yōu)勢,如便利的多核編程框架、巨頁內(nèi)存管理、無鎖隊(duì)列、無中斷poll-mode 網(wǎng)卡驅(qū)動、CPU親和性等等來實(shí)現(xiàn)快速的網(wǎng)卡收發(fā)及處理報(bào)文,后續(xù)考慮TCP/IP 用戶態(tài)協(xié)議實(shí)現(xiàn)和優(yōu)化,進(jìn)而實(shí)現(xiàn)L7負(fù)載均衡。
系統(tǒng)概覽
工作場景
SKYLB部署在京東容器集群JDOS的前端,對于一個應(yīng)用集群,發(fā)布一個或多個VIP到SKYLB服務(wù)上,當(dāng)客戶端需要訪問應(yīng)用節(jié)資源URL,首先通過域名訪問JD智能分布式DNS服務(wù)(SKYDNS詳見https://github.com/ipdcode/skydns), SkyDns會智能返回當(dāng)前最近且狀態(tài)正常且負(fù)載正常的VIP服務(wù)的IP,客戶端就會向VIP去請求連接。
SKYLB節(jié)點(diǎn)上運(yùn)行了一個路由發(fā)布服務(wù)agent,我們使用該agent與開啟OSPF/BGP的路由器做路由交互,當(dāng)SKYLB的上層路由器接收到請求VIP的數(shù)據(jù)包時,路由器通過(OSPF/BGP)的等價(jià)多路徑轉(zhuǎn)發(fā)協(xié)議選擇一個可以使用的發(fā)布該VIP的SKYLB節(jié)點(diǎn),將報(bào)文轉(zhuǎn)發(fā)給一個SKYLB節(jié)點(diǎn)。通過這種策略來實(shí)現(xiàn)VIP的發(fā)布和橫向容量負(fù)載能力擴(kuò)展。
當(dāng)報(bào)文通過上述步驟到達(dá)SKYLB負(fù)載均衡后,通過常用的負(fù)載均衡策略(round robin,一致性hash ,最小連接數(shù)),將數(shù)據(jù)包送到相應(yīng)的后端容器服務(wù)。
系統(tǒng)架構(gòu)
JingdongDatacenter Operating System(JDOS) 是基于JDOS提供物理機(jī)/虛擬機(jī)/容器的統(tǒng)一管理系統(tǒng)、配備靈活的網(wǎng)絡(luò)互連、可靠的分布式共享存儲,實(shí)現(xiàn)軟件定義數(shù)據(jù)中心的計(jì)算資源統(tǒng)一管理和集群管理。通過使用JDOS,可以直接迅速得到任意需要的計(jì)算、存儲、網(wǎng)絡(luò)、安全等方面的資源和能力。SKYLB作為整個JDOS系統(tǒng)的一個重要組成部分,負(fù)責(zé)提供集群的L4負(fù)載均衡能力,通過restful API等接口與JDOS系統(tǒng)交互。用戶可以通過統(tǒng)一調(diào)度管理平臺便捷的創(chuàng)建、刪除、遷移負(fù)載均衡系統(tǒng)。同時多個應(yīng)用服務(wù)進(jìn)行流量分發(fā)的負(fù)載均衡服務(wù),從而擴(kuò)展應(yīng)用系統(tǒng)對外的服務(wù)能力,并且通過消除單點(diǎn)故障提高應(yīng)用系統(tǒng)的可用性。
系統(tǒng)的基本架構(gòu)如下圖2所示,每一個集群配備一組可容災(zāi)的負(fù)載均衡控制中心,主要通過restful api接口負(fù)責(zé)與JDOS調(diào)度中心交互,接收vip的配置請求。同時我們在每一個SKYLB的節(jié)點(diǎn)上運(yùn)行一個代理進(jìn)程,該代理進(jìn)程通過gRPC與控制中心連接。接收控制中心下達(dá)的創(chuàng)建及刪除vip,后端server endpoint服務(wù)等一系列指令,通過load balancer 提供的命令行執(zhí)行相應(yīng)的指令。接收load balancer 關(guān)于流量及報(bào)文的監(jiān)控信息,對于流量及監(jiān)控進(jìn)行告警,并且通知控制中心和調(diào)度中心進(jìn)行擴(kuò)容等操作。
代理進(jìn)程同時還負(fù)責(zé)后端服務(wù) server endpoint基于服務(wù)可用性的健康檢查,及時根據(jù)后端服務(wù)的狀態(tài)通過命令行進(jìn)行添加和刪除的操作。
圖2系統(tǒng)架構(gòu)圖
優(yōu)勢
1)擴(kuò)展性
支持動態(tài)添加和刪除后端服務(wù)的容器,實(shí)現(xiàn)無縫的伸縮;在伸,縮過程中,對相關(guān)調(diào)用和訪問者無影響。
2)高可用性
提供多活負(fù)載均衡,有多個VIP,它們對應(yīng)一個域名,自研DNS服務(wù)SKYDNS會根據(jù)請求的客戶端IP智能解析可用的VIP,返回給用戶,從而實(shí)現(xiàn)更高的可用性;即使一個VIP不可用,也不會影響業(yè)務(wù)系統(tǒng)對外提供服務(wù)。同時借助OSPF/BGP等協(xié)議實(shí)現(xiàn)負(fù)載均衡的橫向擴(kuò)充
3)服務(wù)能力自動可調(diào)
SKYLB根據(jù)VIP實(shí)際接收流量的負(fù)載需要調(diào)整負(fù)載均衡的服務(wù)能力,比如流量、連接數(shù)的控制等指標(biāo)。
功能特點(diǎn)
1)協(xié)議支持
負(fù)載均衡支持包含TCP、UDP協(xié)議的四層負(fù)載均衡,配備健全的鏈路跟蹤機(jī)制,以及多種調(diào)度策略,用戶可以根據(jù)服務(wù)的需要創(chuàng)建合適自己的負(fù)載均衡。
2)高可用性
支持容器的健康檢查,除傳統(tǒng)的IP+Port,并加入對URL檢查,保證應(yīng)用可用性: 健康檢查頻率可自定義;一旦探測到異常,則不會將流量再分配到這些異常實(shí)例,保證應(yīng)用可用性。
3)集群部署,多層次容錯機(jī)制: 負(fù)載均衡采用集群部署,支持熱升級,機(jī)器故障和集群維護(hù)對用戶完全透明,結(jié)合DNS使用還可支持全局負(fù)載均衡。
4)靈活性
支持多種流量調(diào)度算法,使得流量分配更均勻: 負(fù)載均衡支持加權(quán)輪詢和最小連接數(shù)這兩種調(diào)度算法,可根據(jù)自身需求選擇相應(yīng)的算法來分配用戶訪問流量,并支持設(shè)置后端容器權(quán)重,使得流量調(diào)度更均勻,提升負(fù)載均衡能力。
支持會話保持,滿足用戶個性化需求: 負(fù)載均衡通過IP地址實(shí)現(xiàn)會話保持,可將一定時間內(nèi)來自同一用戶的訪問請求,轉(zhuǎn)發(fā)到同一個后端容器上進(jìn)行處理,從而實(shí)現(xiàn)用戶訪問的連續(xù)性。
5)易用性
提供多種管理途徑,輕松操縱負(fù)載均衡: 用戶可通過控制臺輕松實(shí)現(xiàn)負(fù)載均衡器的配置、釋放等功能。后續(xù)會開放標(biāo)準(zhǔn)的API或SDK提供給用戶,從而自己開發(fā)對負(fù)載均衡的控制管理。
系統(tǒng)設(shè)計(jì)及技術(shù)實(shí)現(xiàn)
負(fù)載均衡模式選擇
常用的負(fù)載均衡模式有DR,NAT,TUNNEL,F(xiàn)ULLNAT。每種模式都有自己的優(yōu)勢和使用場景,業(yè)內(nèi)對每種模式的分析比較文檔很多,不再介紹。由于JDOS容器網(wǎng)絡(luò)需要VLAN隔離,而FULLNAT剛好支持LB和RS跨VLAN通信,結(jié)合我們自身容器集群的需求,我們在實(shí)現(xiàn)SKYLB時主要考慮支持FULLNAT模式。圖3是SKYLB的FULLNAT負(fù)載均衡模式中數(shù)據(jù)包的流向圖。SKYLB位于客戶端和后端服務(wù)之間,對于客戶端的請求報(bào)文,將目的地址替換成后端服務(wù)的地址,源地址替換成SKYLB的本地地址,對于后端服務(wù)的響應(yīng)報(bào)文,將目的地址替換成客戶端地址,源地址替換成SKYLB的VIP地址。
圖3 FULLNAT模式下SKYLB的數(shù)據(jù)包流向圖
借助DPDK實(shí)現(xiàn)高速轉(zhuǎn)發(fā)
Data Plane DevelopmentKit(DPDK):是運(yùn)行在Linux 用戶態(tài),實(shí)現(xiàn)X86通用平臺網(wǎng)絡(luò)報(bào)文快速處理的庫和驅(qū)動的集合,如下圖4所示,其主要特點(diǎn):
多核編程框架及CPU親和性
每個NUMA節(jié)點(diǎn)有單獨(dú)的CPU和本地內(nèi)存
CPU訪問本地內(nèi)存速度比訪問遠(yuǎn)端內(nèi)存快,避免CPU訪問遠(yuǎn)端內(nèi)存
注意網(wǎng)卡掛載的NUMA節(jié)點(diǎn)巨頁內(nèi)存管理
巨頁(HugePage)
普通內(nèi)存頁面大小4KB,巨頁內(nèi)存頁面大小2MB/1GB
減少頁表項(xiàng)數(shù)目,降低TLB miss
使用大頁面比使用4K的頁面性能提高10%~15%
零拷貝,報(bào)文數(shù)據(jù)及轉(zhuǎn)發(fā)內(nèi)存零拷貝。
無鎖隊(duì)列
使用無鎖隊(duì)列,入隊(duì)出隊(duì)無需阻塞等待鎖資源
poll-mode網(wǎng)卡驅(qū)動
DPDK網(wǎng)卡驅(qū)動完全拋棄中斷模式,基于輪詢方式收包
圖4 DPDK相關(guān)模塊
包處理架構(gòu)實(shí)現(xiàn)
圖5是SKYLB基于RTC數(shù)據(jù)包處理模型實(shí)現(xiàn)的架構(gòu)。SKYLB選擇一個核作為控制核,執(zhí)行命令配置,與內(nèi)核交換,ARP表維護(hù)等任務(wù)。其他的核作為工作核,每個工作核輪詢網(wǎng)卡的一個RX隊(duì)列,執(zhí)行數(shù)據(jù)包處理任務(wù)。SKYLB利用網(wǎng)卡的RSS功能實(shí)現(xiàn)客戶端請求報(bào)文的分流,利用網(wǎng)卡FDIR功能實(shí)現(xiàn)后端服務(wù)響應(yīng)報(bào)文的分流。SKYLB對報(bào)文分流目的是要保證客戶端的請求報(bào)文和其對應(yīng)的服務(wù)端響應(yīng)報(bào)文到達(dá)同一個工作核上。在這個目的達(dá)成的前提下,SKYLB的業(yè)務(wù)實(shí)現(xiàn)會簡單和高效很多。每個工作核維護(hù)一張session表,同于保存客戶端和后端服務(wù)的連接信息。SKYLB不需要考慮對session表加鎖,因?yàn)槊總€工作核的session表都是獨(dú)立的。
圖5 SKYLB的RTC包處理模型框架圖
我們設(shè)計(jì)SKYLB每個工作核獨(dú)占至少一個LIP,并將LIP信息寫入網(wǎng)卡配置。圖6是網(wǎng)卡對IP報(bào)文分流的流程圖。圖中dst_ip即SKYLB為每個工作核分配的LIP。網(wǎng)卡對后端服務(wù)響應(yīng)報(bào)文的目的地址LIP匹配成功,將報(bào)文送到綁定的RX隊(duì)列,沒有匹配的報(bào)文則可以認(rèn)為是客戶端的請求報(bào)文,按RSS流程分配RX隊(duì)列。
圖6 網(wǎng)卡對IP報(bào)文分流過程圖
SKYLB在啟動過程中還會為每個物理口創(chuàng)建一個KNI接口,控制核負(fù)責(zé)輪詢KNI接口。該接口主要用于外部程序quagga向路由器發(fā)布VIP信息,Agent檢查后端服務(wù)健康狀態(tài)。
SKYLB目前支持的負(fù)載均衡調(diào)度算法有一致性hash,round robin和最小連接數(shù)算法。
Session五元組,SKYLB采用五元組來實(shí)現(xiàn)會話的管理功能,如下圖7 所示:
圖7 SKYLB 五元組管理Session
負(fù)載均衡冗余設(shè)計(jì)
SKYLB使用BGP或者OSPF的模式組成集群,通過上述協(xié)議將數(shù)據(jù)包散列到集群中各個節(jié)點(diǎn)上,保證單臺SKYLB故障或者恢復(fù)后能動態(tài)的將機(jī)器添加及刪除。其冗余實(shí)現(xiàn)設(shè)計(jì)如下圖6所示:
圖8 SKYLB的冗余設(shè)計(jì)
性能優(yōu)化實(shí)踐
良好的流程設(shè)計(jì)是性能提升的關(guān)鍵,這方面的流程涉及和業(yè)務(wù)相關(guān),缺乏共性,因此不做詳細(xì)闡述。主要介紹SKYLB性能優(yōu)化過程中使用的其他優(yōu)化方法。
恰當(dāng)?shù)厥褂胷te_prefetch0(),可以減少cache-miss次數(shù),避免當(dāng)前函數(shù)成為性能熱點(diǎn)。性能調(diào)優(yōu)工具perf可以幫助我們分析應(yīng)該在哪處代碼使用預(yù)取。例如我們使用perf發(fā)現(xiàn)報(bào)文處理函數(shù)中有一個處代碼是性能熱點(diǎn),該代碼用于讀取新報(bào)文的類型字段并判斷,分析認(rèn)為很可能是cache-misses造成的。在進(jìn)入報(bào)文處理函數(shù)前使用rte_prefetch0(),有效避免該函數(shù)成為熱點(diǎn)。
恰當(dāng)?shù)厥褂胠ikely()和unlikely(),可以減少分支預(yù)測失敗的次數(shù)。我們在SKYLB代碼的一處分支語句中使用unlikely()優(yōu)化,性能提升明顯。分支預(yù)測優(yōu)化點(diǎn)可以借助perf分析確定,也可以根據(jù)自己對代碼執(zhí)行流程的理解確定。
盡量減少鎖的使用。SKYLB中配置信息不經(jīng)常變化,我們沒有單獨(dú)為每個可能爭用的資源加鎖,而是只用一把DPDK提供的讀寫鎖,每個讀線程在加讀鎖后,處理一批報(bào)文,然后釋放讀鎖。既簡化流程,又減少了操作讀寫鎖的開銷(DPDK讀寫鎖的開銷并不是很大)。
性能數(shù)據(jù)
測試環(huán)境:
CPU:Intel(R) Xeon(R) CPU E5-2640 v3
NIC:intel 82599ES 10-GigabitSFI/SFP+ Network Connection
測試配置:
負(fù)載均衡模式:FULLNAT
調(diào)度算法:一致性hash
配置:CPU占用8核 內(nèi)存占用4G
性能測試數(shù)據(jù):
1)UDP發(fā)包,測試轉(zhuǎn)發(fā)性能,我們使用了SKYDNS作為后端服務(wù),客戶端采用UDP請求DNS
表1 SKYLB基于UDP的DNS性能測試數(shù)據(jù)
2)NGINX作為后端服務(wù),壓測HTTP性能。
配置:CPU占用8核 內(nèi)存占用4G
表2 SKYLB HTTP性能測試數(shù)據(jù)
圖9 SKYLB HTTP 性能測試指標(biāo)圖
圖10 SKYLBhttp 性能測試指標(biāo)圖
總結(jié)
本文主要介紹了SKYLB,一種的基于intel DPDK平臺開發(fā)的負(fù)載均衡器。其接近網(wǎng)卡線速處理及轉(zhuǎn)發(fā)能力,靈活的部署,多樣的監(jiān)控以及可靠的穩(wěn)定性?;旧细采w所有4層負(fù)載均衡的業(yè)務(wù)處理需求,配合集群管理以及調(diào)度,作為京東數(shù)據(jù)中心操作系統(tǒng)(JDOS)的一個重要的組成部分,在京東數(shù)據(jù)中心發(fā)揮至關(guān)重要的作用。
推薦閱讀:益陽在線