標籤:

一個高速LVS-DR替代系統設計 -- 基於dpdk的高性能負載均衡器

# LVS DR 原理

LVS-DR不同於普通的haproxy代理機制,它在網路中的作用層級更加底層。haproxy一般代理應用層的應用數據,所有的數據都會通過haproxy收發,導致了haproxy是一個性能瓶頸。而lvs-dr作用在IP和數據鏈路層,效率更高,並且只代理進入proxy的數據,應用的返回數據由應用伺服器直接返回給client。

整個數據包的處理流程如下:

  1. Client要訪問192.168.1.2上的服務
  2. request數據經過路由到達我們的proxy,上面運行著負載均衡器,負載均衡器通過策略演算法,把目標MAC改成真實的Server MAC,並發送給目標MAC(這裡決定了proxy和server只能在同一個二層網路中)
  3. Server收到請求後,將響應數據直接通過路由發送給client,不再經過proxy

# 基於DPDK的DR架構

為什麼要用DPDK呢?因為lvs是基於Linux內核的,而linux內核處理包的速度太慢(10G網卡3~4Mpps),特別是對小包的處理,導致了性能瓶頸。而利用DPDK技術可以繞過linux內核從而直接處理網路數據報,寫的好的話可以達到線速(10G網卡14Mpps)。

這個負載均衡器主要由兩部分組成,轉發器(Forwarder)和健康檢查器(Monitor)。

Monitor通過ping或者arp的方式檢查Server的狀態,如果無法連接,則將此Server設置成unreachable的狀態。

Forwarder通過hash演算法把同一個來源的數據報發往同一個Server,以保證連接的一致性。

# 技術細節的考慮

來看看現在的設計距離google的設計還差多遠?

還差著一個集群這麼遠。。。。。。。。。

目前只有單個proxy的設計,那作為一個集群要怎麼玩呢?

首先是DNS層面,根據來源返回一個就近的VIP地址(如果在多個數據中心部署了的話)

然後是Router層面,使用了ECMP,把大量的請求分發到不同的負載均衡器上。

這就帶來了一個問題,如何讓同一個來源的請求總是能夠到達同一個Server呢?有兩個方法。

  1. 通過配置ECMP,把相同來源的請求都發往相同的負載均衡器。
  2. 使用一致性hash演算法,讓不同的負載均衡器在處理同一個請求時都能夠轉發到同一台Server。

# 現有技術

在構思這篇博文的時候還沒注意到VPP剛出的LoadBalancing,之前一直想自己實現一個lb application或者基於ovs-dpdk進行修改。但是搜索了一下之後發現了VPP LoadBalancing plugin, 這個plugin就是仿照了Maglev進行設計和實現的。

不知道VPP是何技術的可以去google一下,這是cisco開源的sdn技術,類似於openvswitch,自稱轉發性能比openvswitch高不知道哪去了。VPP底層基於dpdk或者netmap的技術實現高速收發數據報。

VPP實現的LB跟上面說的有一部分不太一致,就是從proxy到server的過程,VPP是用gre tunnel技術實現的,這樣就不需要server和proxy在同一個二層網路里了,相應的,tunnel技術會增加每個封包的長度,需要相應的修改MTU,啟用Jumbo Frame。

最後的最後,至於VPP的LB性能如何,怎麼用,我現在並沒有試過:P

# Reference

  1. 從Maglev到Vortex,揭秘100G+線速負載均衡的設計與實現
  2. Google 是如何做負載均衡的?
  3. Load Balancer plugin for VPP
  4. github.com/chrisy/vpp/t
  5. 【轉載】一致性hash演算法釋義 | 成長的企鵝

推薦閱讀:

「直播聯盟」解3大難題,為何偏偏由樂視雲執牛耳?
怎麼理解 SAAS 和 PAAS 的區別?
kubernetes的kube-scheduler性能將提升40%
阿里雲到底是個什麼東西,與亞馬遜的雲服務相比較,它處於什麼位置?
深入淺出雲計算經濟學

TAG:雲計算 |