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