1. 程式人生 > >基於DPDK,jupiter 百萬qps併發負載均衡,替代lvs

基於DPDK,jupiter 百萬qps併發負載均衡,替代lvs

一、簡介

1、背景

基於 OS 核心的資料傳輸有什麼弊端

UNIX 的設計初衷其實為電話網路的控制系統而設計的,而不是一般的伺服器作業系統,所以,它僅僅是一個數據負責資料傳送的系統,沒有所謂的控制層面和資料層面的說法,不適合處理大規模的網路資料包。最後 Errata Security 公司的 CEO Robert Graham得出的結論是:

OS 的核心不是解決 C10M 問題的辦法,恰恰相反 OS 的核心正式導致 C10M 問題的關鍵所在。

當網路中大量資料包到來時,會產生頻繁的硬體中斷請求。

  • 中斷處理
  • 記憶體拷貝
  • 上下文切換
  • 區域性性失效
  • 記憶體管理

解決方案
- 控制層留給Linux做,其它資料層全部由應用程式來處理。
- 減少系統排程、系統呼叫、系統中斷,上下文切換等
- 摒棄Linux核心協議棧,將資料包傳輸到使用者空間定製協議棧
- 使用多核程式設計技術替代多執行緒,將OS綁在指定核上執行
- 針對SMP系統,使CPU儘量使用所在NUMA系統節點的記憶體,減少記憶體刷寫
- 使用大頁面,減少訪問
- 採用無鎖技術解競爭
而DPDK恰好為我們提供瞭解決問題的腳手架。

2、DPDK

DPDK是因特爾推出的資料平面開發元件,主要是提供了一個高效的使用者態網絡卡驅動,改以往網絡卡驅動採用的中斷方式,為繫結執行緒輪詢網絡卡的高效模式,可以大幅提高吞吐率。

Dpdk是X86平臺報文快速處理的庫和驅動的集合,不是網路協議棧,不提供二層,三層轉發功能,不具備防火牆ACL功能,但通過DPDK可以輕鬆的開發出上述功能。優勢在於通過Dpdk,可以將使用者態的資料,不經過核心直接轉發到網絡卡,實現加速目的。

dpdk優勢:
- 減少了中斷次數。
- 減少了記憶體拷貝次數。
- 繞過了linux的協議棧,進入使用者協議棧,使用者獲得了協議棧的控制權,能夠定製化協議棧降低複雜度

dpdk劣勢

  • 核心棧轉移至使用者層增加了開發成本.
  • 低負荷伺服器不實用,會造成核心空轉.

3、京東 tiglabs 團隊的 Jupiter

Jupiter是一個基於DPDK實現的高效能4層網路負載均衡服務,支援在fullnat工作模式下對TCP和UDP報文轉發。jupiter支援的負載均衡演算法包括一致性雜湊演算法,輪詢演算法,加權輪詢演算法。

  • 支援TCP, UDP協議
  • 支援應用會話保持
  • 支援負載均衡服務橫向擴充套件
  • 高效能,單機支援百萬QPS

LVS由於基於核心實現,大量併發訪問時,頻繁系統中斷、上下文切換。相同環境下,測試LVS最大70w qps,而jupiter可達200w qps。

二、Jupiter 安裝部署

支援的OS發行版本: Centos-7.2或者Centos-7.4。

個人測試,在VMware Workstation上測試,網絡卡驅動原因是安裝不上的。主機上不能劃分vlan資訊。

1、安裝依賴環境

yum install numactl-devel kernel-devel libpcap-devel rpm-build

不裝kernel-devel會報錯:

make: *** /lib/modules/3.10.0-327.el7.x86_64/build: 沒有那個檔案或目錄。
系統沒有安裝核心開發包,可以看下/usr/src/kernels/,
如果這個目錄是空的,就說明沒有安裝 核心開發包,
如果這個目錄非空,你就需要重新做一下連線
# 參考地址 :http://blog.sina.com.cn/s/blog_6f24670f0102wv7p.html

2、下載原始碼,編譯安裝RPM包

tar -xf jupiter.tar.gz
cd jupiter
make rpm-pkg
rpm -i rpmbuild/RPMS/x86_64/jupiter-0.1-1.x86_64.rpm

3、配置引數,啟動服務

jupiter-service的預設配置檔案路徑是/etc/jupiter/jupiter.cfg

[DPDK]
argv = -c 0xf00 -n 4

[DEVICE0]
name = jupiter0
ipv4 = 1.1.1.2  # 本機Jupiter0 IP、gw資訊
netmask = 255.255.255.0
gw = 1.1.1.254
rxqsize = 256
txqsize = 512
mtu = 1500
rxoffload = 0
txoffload = 0
# jupiter採用fullnat模式,這些是後端realserver主機互動的IP。local-ip的個數需要大於jupiter的worker執行緒數
local-ipv4 = 10.0.2.1/32, 10.0.2.2/32, 10.0.2.3/32, 10.0.2.4/32
pci = 0000:01:00.2  # 網絡卡的pci。 ethtool -i eth0 | awk '/bus-info/{print $2}'

網絡卡bond情況:

# 網絡卡分別查下這些物理卡的pci,填到配置檔案的pci欄位,用逗號隔開,mode模式選擇rr或者active-backup
mode = rr
# 目前日期2018年5月:bond模式支援 0、1
# bond7種模式介紹地址:http://www.cnblogs.com/lcword/p/5914089.html
  • 配置hugepage:
echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
  • 載入IGB_UIO模組,為網絡卡繫結使用者態驅動igb_uio:

注:更改網絡卡驅動,網路會中斷,需要有管理IP,或idrac口配置

modprobe uio
insmod /usr/share/jupiter/kmod/igb_uio.ko
# 如果配有ip並且是up狀態,需要先down掉,再用指令碼綁驅動
/usr/share/jupiter/tools/dpdk-devbind.py --bind=igb_uio eth0

載入KNI模組:

insmod /usr/share/jupiter/kmod/rte_kni.ko

啟動jupier-service程序:

jupiter-service --daemon

三、jupiter測試環境部署

1. 部署示意圖如下

測試部署示意圖

說一下網路環境:

1、正常環境網段:1.1.1.0/24
2、jupiter主機 1.1.1.2  ' VIP: 10.0.1.1 '  所以ab-client需要加到10.0.1.0/24的路由
3、採用fullnat模式,所以後端realserver,需要加到上面local-ipv4網段的路由
4' client 與 realserver 主機IP均指向 jupiter主機IP 。如果是全三層bgp 網路是不用配置靜態路由的,會自動學習'

2. ab-client伺服器配置

ifconfig eth0 1.1.1.1/24 up
route add -net 10.0.1.0 netmask 255.255.255.0 gw 1.1.1.2

3. nginx-server伺服器配置

ifconfig eth0 1.1.1.3/24 up
route add -net 10.0.2.0 netmask 255.255.255.0 gw 1.1.1.2

4. jupiter-service伺服器配置

配置虛擬TCP服務10.0.1.1:8888,並新增兩個後端服務1.1.1.3:80和1.1.1.4:80.

ifconfig jupiter0 1.1.1.2/24 up
jupiter-ctl vs/add 10.0.1.1:8888 tcp wrr
jupiter-ctl rs/add 10.0.1.1:8888 tcp 1.1.1.3:80 7  # 最後的是權重,rr輪詢演算法,不需要寫這部分
jupiter-ctl rs/add 10.0.1.1:8888 tcp 1.1.1.4:80 7 
jupiter-ctl rs/del 10.0.1.1:8888 tcp 1.1.1.5:80  # 刪除rs

權重調整

jupiter-ctl rs/weight 10.0.1.1:8888 tcp 1.1.1.3:80    # 查詢
jupiter-ctl rs/weight 10.0.1.1:8888 tcp 1.1.1.3:80 0  # 調整

5. ab-client訪問vip

ab http://10.0.1.1:8888/

6、一些常用命令

# 檢視網絡卡驅動
/usr/share/jupiter/tools/dpdk-devbind.py --status
# 如果網絡卡配有ip並且是up狀態,需要先down掉,再用命令綁驅動
# eth0的網絡卡驅動換成igb_uio
/usr/share/jupiter/tools/dpdk-devbind.py -b igb_uio eth0
# 更改網絡卡驅動為系統正常驅動
/usr/share/jupiter/tools/dpdk-devbind.py -b igb eth0

# 檢視 vip資訊
jupiter-ctl vs/list
# 檢視 realserver 資訊
jupiter-ctl rs/list 10.0.1.1:8888 tcp

# 檢視KNI | LOCAL ipv4地址
jupiter-ctl netdev/ipaddr
# 檢視NIC包統計資訊
jupiter-ctl netdev/stats
# 檢視arp地址
jupiter-ctl arp/list

四、jupiter 橫向擴充套件

多個jupiter主機實現高可用,需要交換機配置ecmp。支援多個jupiter可以配置相同的vip,但是local ip不能配置一樣的。

橫向擴充套件

感謝 tiglabs 團隊