天天看點

一個高速lvs-dr替代系統設計 -- 基于dpdk的高性能負載均衡器

# LVS DR 原理

LVS-DR不同于普通的haproxy代理機制,它在網絡中的作用層級更加底層。haproxy一般代理應用層的應用資料,所有的資料都會通過haproxy收發,導緻了haproxy是一個性能瓶頸。而lvs-dr作用在IP和資料鍊路層,效率更高,并且隻代理進入proxy的資料,應用的傳回資料由應用伺服器直接傳回給client。

pros

cons

haproxy

可以基于端口做代理

真實server與proxy不需要在一個二層網絡

單點問題

進出流量都走proxy,負載高

lvs-dr

隻有request請求通過proxy,response資料直接傳回給客戶,性能高。

proxy和server必須在同一個二層網絡

一個高速lvs-dr替代系統設計 -- 基于dpdk的高性能負載均衡器

整個資料包的處理流程如下:

Client要通路192.168.1.2上的服務

request資料經過路由到達我們的proxy,上面運作着負載均衡器,負載均衡器通過政策算法,把目标MAC改成真實的Server MAC,并發送給目标MAC(這裡決定了proxy和server隻能在同一個二層網絡中)

Server收到請求後,将響應資料直接通過路由發送給client,不再經過proxy

# 基于DPDK的DR架構

為什麼要用DPDK呢?因為lvs是基于linux核心的,而linux核心處理包的速度太慢(10G網卡3~4Mpps),特别是對小包的處理,導緻了性能瓶頸。而利用DPDK技術可以繞過linux核心進而直接處理網絡資料報,寫的好的話可以達到線速(10G網卡14Mpps)。

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

一個高速lvs-dr替代系統設計 -- 基于dpdk的高性能負載均衡器

Monitor通過ping或者arp的方式檢查Server的狀态,如果無法連接配接,則将此Server設定成unreachable的狀态。

Forwarder通過hash算法把同一個來源的資料報發往同一個Server,以保證連接配接的一緻性。

# 技術細節的考慮

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

一個高速lvs-dr替代系統設計 -- 基于dpdk的高性能負載均衡器

還差着一個叢集這麼遠。。。。。。。。。

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

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

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

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

通過配置ECMP,把相同來源的請求都發往相同的負載均衡器。

使用一緻性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

<a href="http://www.infoq.com/cn/articles/Maglev-Vortex" target="_blank">http://www.infoq.com/cn/articles/Maglev-Vortex</a>

<a href="http://oilbeater.com/%E5%8D%9A%E5%AE%A2/2016/11/21/google-loadbalancert.html" target="_blank">http://oilbeater.com/%E5%8D%9A%E5%AE%A2/2016/11/21/google-loadbalancert.html</a>

<a href="https://docs.fd.io/vpp/16.12/md_plugins_lb-plugin_README.html" target="_blank">https://docs.fd.io/vpp/16.12/md_plugins_lb-plugin_README.html</a>

<a href="https://github.com/chrisy/vpp/tree/master/plugins/lb-plugin" target="_blank">https://github.com/chrisy/vpp/tree/master/plugins/lb-plugin</a>

<a href="http://www.xinghaixu.com/archives/472" target="_blank">http://www.xinghaixu.com/archives/472</a>

本文轉自 Tenderrain 51CTO部落格,原文連結:http://blog.51cto.com/tenderrain/1983570

繼續閱讀