1. 程式人生 > >吳佳明(普空):LVS在大規模網路環境中的應用

吳佳明(普空):LVS在大規模網路環境中的應用

from: http://blog.aliyun.com/1750

9月13日,阿里雲課堂第一期在北京準時開課,到場與會人員眾多,現場氣氛非常熱烈。阿里雲三位講師為大家獻上了精彩的演講,參會者也紛紛積極參與現場互動,通過問答交流,收穫頗豐。應廣大使用者要求,我們將雲課堂講師現場分享內容全文整理出來,供大家參考。阿里雲課堂會繼續在全國各地陸續開課,歡迎大家繼續支援!

以下為講師吳佳明(普空)的分享內容:


1、 SLB總體架構

LVS本身是開源的,我們對它進行了多方面的改進,並且也已開源-https://github.com/alibaba/LVS。

1

接下來我們看一下LVS在整個SLB中的位置在哪裡,整個圖是SLB的架構圖。SLB功能比較簡單,主要是做負載均衡,最主要兩個模組,一個是四層的負載均衡-LVS,還有七層的負載均-tengine,兩個軟體都是開源的;後端掛的是ECS。

一般來說,一個業務部署在兩臺或者兩臺以上的ECS-VM上面,建議大家選用SLB做負載均衡。

無論是LVS-四層也好,Tengine七層也好,我們負載均衡都是叢集,都會有冗餘的,一臺宕機了對使用者來說沒有影響。SLB在杭州region內也有很多IDC-資料中心,同一個VIP可以在IDC1和IDC2,一旦IDC1宕了就切換到IDC2,即實現IDC間的冗餘。對可靠性要求特別高的業務,建議在ECS兩個可用區裡部署VM,這樣一個IDC宕了也會有冗餘。

另外還有我們SLB整個可用性為5個9,為什麼我們做IDC冗餘,據說國外最好資料中心的可用性是5個9,SLB位於資料中心中,必須靠資料中心之間的冗餘做到5個9。

2、  LVS歷史

LVS是章文嵩博士1998年做的,LVS是Linux虛擬伺服器的簡稱;

2

章文嵩當前是阿里雲技術負責人。

3、本次LVS分享主要內容

  本次分享的內容如下:為什麼引入LVS?在大規模網路下用的時候存在哪些問題?針對這些問題,我們做了一些改進:FULLNAT,SYNPROXY,叢集部署;接下來,介紹LVS效能優化的一些技術,這些技術不僅僅用在LVS,大家可以用在你們自己網路業務裡面;最後介紹一下我們接下來LVS做哪些事情。

4、  LVS-why

比如說,一個使用者訪問淘寶網站,淘寶網前端共有5臺apache伺服器,如何決定訪問哪一臺apache?常用的方式是用DNS做負載均衡,將5臺apache伺服器的ip地址新增到域名

www.taobao.com中。

3

但DNS有一些缺點,第一個缺點:例如第二臺apache宕了,運維趕緊把DNS中該apache的ip地址刪除掉,但 很多地方的local DNS不一定遵守TTL協議,這樣刪除操作什麼時候生效,你根本不可控的;尤其行動網路中,這個問題更突出,我記得10年時行動網路部分地區local DNS一天才更新。

第二個缺點:服務排程演算法只支援WRR。如果你使用者範圍很有限,就會有負載不均衡的問題。第三個缺點:攻擊防禦能力很弱,每次有攻擊靠一臺機器抗。

針對DNS的不足,引入了Virtual Server的概念,即最前端有一個入口裝置把流量均衡到後端的apache上去;無論是LVS軟負載 還是 F5硬負載均衡 也都是這種概念。

4

5、LVS-what

LVS的基本概念,是4層load balance,這個4層對於著OSI網路模型中的傳輸層,需要用到埠資訊。

LVS支援WRR、WLC等排程演算法;WRR是帶權重的輪詢;WLC是帶權重的最小連線排程策略,即將請求往最少連線的後端伺服器上調。

LVS支援3種工作模式:NAT、DR、TUNNEL,這幾種模式跟你IDC網路部署方式有關係的。

傳輸協議支援TCP、UDP兩種。

5

第一種是NAT模式,進來和出去的資料流都是經過LVS裝置。進來的時候把目的IP改成實際後端伺服器的IP-DNAT,出去的時候則做SNAT。一般買的F5等商用裝置,都採用NAT模式,因為NAT模式可以防DDOS攻擊,該攻擊防禦功能依賴於進出資料都通過裝置。

6

第二種是TUNNEL,這個是進的流量經過LVS,出去的時候不經過了。TUNNEL是在原來IP頭部再新增封裝一個IP。據說,騰訊採用IP隧道的模式;TUNNEL模式的最大問題是 每個資料包都需要增加一個IP頭部,如果收到的資料包是已經達到乙太網幀最大長度1.5K,IP頭就添不進去。這時候常用做法是會回一個因MTU導致目的不可達的ICMP包給客戶端,客戶端如果支援PMTU的話,就會把大包分成小包發過來。

解決上述問題的一個辦法是 交換機開啟巨幀。另一個方法是將後端伺服器上的MSS改小,我一個IP頭是20個位元組,預設MSS是1460,將其改成1440可不可以?可以,大部分使用者可以正常支援,但是總會存在百萬份之幾,它不支援的標準MSS協商協議,你即使將MSS調的很小,但是客戶端還是會發一個大包出來。

7

第三種是DR,DR的效能是所有模式中最高的,它只需要修改目的MAC;但部署上必須要求LVS和後端伺服器在同一個VLAN中。

DR非常適合小規模網路,比如,阿里的CDN都是用的DR模式,幾十臺伺服器的規模,特別適合DR這種高效的模式;因此,如果你業務規模比較小的話,建議採用DR。

8

6、LVS-應用

前面我們講了LVS基本的特徵。LVS本身只是一個核心模組:IP_VS,這個模組是做負載均衡,你只用這個模組來做工程應用是遠遠不夠的。比如,一臺RealServer宕機了怎麼辦?LVS本身宕機了著呢麼辦?

針對上述問題,我們需要有輔助軟體幫我們管理LVS,一般現在常用的是Keepalived;keepalived支援健康檢測,4層和7層健康檢檢測,以解決RealServer宕機問題。

另外,keepalived支援VRRP心跳協議,可以實現LVS主備冗餘,以解決LVS本身單點故障。

最後,keepalived支援配置檔案的方式來管理LVS;

完成了上述工作,我們還缺少一個監控-服務執行怎麼樣,流量怎麼樣,CPU負載怎麼樣?大部分公司都有自己一套監控系統,LVS監控基本上都是整合到自己監控系統裡面去。當然也可以用開源的元件,比如,SNMP Patch-可以跟傳統網路一樣介面獲得LVS的資訊。

9

該圖是我講到CDN網路拓撲,LVS兩臺實現主備冗餘,同時對後端RealServer做Healthchech。

7、  LVS-問題 & 解決

前面介紹了官方LVS的一些基礎知識;

但在大規模的網路下,在淘寶的業務中,官方LVS滿足不了需求;原因有3點,

1)       剛才講三種轉發模式,部署成本比較高;

2)       和商用的負載均衡比,LVS沒有DDOS防禦攻擊功能;

3)       主備部署模式,效能無法擴充套件;一個VIP下的流量特別大怎麼辦?

第一點- LVS轉發模式的不足,下面來展開描述一下;

DR的不足:必須要求LVS跟後端所有的REPLY放在同一個VLAN裡。當然有人會提出來分幾個區,每個區佈一個LVS,但一個區VM資源沒有了,就只能用其它區的VM,而使用者需要這些VM掛到同一個VIP下,這是無法實現的。

NAT的不足:NAT最主要問題就是你配置處理很複雜;阿里原來買的商業裝置的時候,需要在交換機上配策略路由,OUT方向的策略路由;因為,冗餘考慮會部署多套負載均衡,走預設路由只能到達一套負載均衡。

TUNNEL的不足:隧道的問題也是配置較複雜,RealServer需要載入一個IPIP模組,同時做一些配置。

針對上述問題,我們的解決方法如下:

  • LVS各轉發模式運維成本高

–      新轉發模式FULLNAT:實現LVS-RealServer間跨vlan通訊,並且in/out流都經過LVS;

  • 缺少攻擊防禦模組

–      SYNPROXY:synflood攻擊防禦模組

–      其它TCP FLAG DDOS攻擊防禦策略

  • 效能無法線性擴充套件

–      Cluster部署模式

下面我們分別介紹上述解決方法;

8、LVS-FULLNAT轉發模式

10

下面講講FullNAT,FULLNAT轉發資料包是類似NAT模式,IN和OUT資料包都是經過LVS;唯一的區別:後端RealServer 或者 交換機 不需要做任何配置。

FULLNAT的主要原理是引入local address(內網ip地址),cip-vip轉換為lip->rip,而 lip和rip均為IDC內網ip,可以跨vlan通訊;

下面從IP地址轉換的角度看一下,NAT和FULLNAT的區別;

11

NAT模式

12

FULLNAT模式

如圖所示,相比NAT模式,FullNAT多了一個Local IP,IP地址轉換時,源和目的IP都改了,即SNAT+DNAT。

FULLNAT模式下,ipvs在NETFLITER框架的HOOK點也發生了變化;

13

NAT模式

14

FULLNAT模式

這個圖就是核心NETFILTER的五個HOOK點;原來傳統的NAT模式,在LOCAL_IN和FORWARD兩個點,而FullNAT模式下,IN/OUT方向的目的IP都是LVS上的IP,因此,只能在LOCAL_IN這個點。

相比NAT,session表管理也發生了變化,有1個索引表,變成了IN和OUT 2個; 這是因為NAT模式只需要用client address作為hash key,而FULLNAT只能用5元組;

15

FULLNAT一個最大的問題是:RealServer無法獲得使用者IP;為了解決這個問題我們提出了TOA的概念,主要原理是:將client address放到了TCP Option裡面帶給後端RealServer,RealServer上通過toa核心模組hack了getname函式,給使用者態返回TCP Option中的client ip。

題外話,全球最大CDN廠商阿克曼也用了TCP Option攜帶附屬資訊;

下面來介紹一下FULLNAT開發時,遇到的幾個坑,這幾個坑對Linux網路應用開發也是有用的;比如,Realserver kernel開啟tcp_tw_recycle,該引數開啟會導致部分NAT網關出來的使用者訪問失敗;

9、LVS-SYNPROXY

LVS可以防禦DDOS 4層標誌位攻擊,其中,synproxy是用於防禦synflood攻擊的模組;

Synproxy實現的主要原理:參照linux tcp協議棧中syncookies的思想,LVS-構造特殊seq的synack包,驗證ack包中ack_seq是否合法-實現了TCP三次握手代理;

簡化一點說,就是client和LVS間建立3次握手,成功後,LVS再和RS建立3次握手;

16

10、LVS-叢集

前面我們介紹了引入一種新的模式叫做FullNAT,方便大家部署,下面我們可以有叢集部署模式做橫向擴充套件。

17

誰把流量均衡的分到各臺LVS上-交換機,LVS和交換機間執行OSPF協議,交換機上生成該VIP的等價路由-ECMP;

另外,這種部署方式很多地方可以用,比如說DNS,域名系統我們每個公司都需要,部署DNS系統的時候,不建議再去加一層LVS,而是DNS伺服器直接和交換機跑OSPF協議。

交換機ECMP有一個問題:當前是不支援一致性雜湊演算法;比如,三臺LVS有一臺宕了,等價路由變成兩條,你資料包全都亂掉了。像思科的交換機晶片它也支援了類似一致性hash的演算法,但具有該功能的交換機還沒有產品化出來;因此,我們不得不在各臺LVS做session同步,即把連線表做成全域性的,這樣即使有一臺LVS宕了也沒有關係,因為表是全域性的,這樣請求過來其它LVS還可以正確地往後轉發。

注:當前FullNAT模式沒法支援同步的。

11、LVS-效能優化

這些效能優化方法對大家網路服務也是有用的。

第一點,多佇列網絡卡,即一個佇列繫結到一個CPU核上,讓多核同時處理網路資料包。如果網絡卡不支援多佇列,可以用google提供的軟多佇列-RPS,linux核心預設已經整合;

第二,對keepalived進行了優化,主要將網路模式從select改為了epool。

第三,大家如果自己買的伺服器的話,建議把網絡卡LRO、GRO功能關掉,尤其是broadcom的網絡卡,我們踩過很多坑。

12、  LVS-todo list

接下來我介紹一下我們下一步要做的事情。

我們接下來重點在:控制系統;LVS在五六月份的時候出現一系列的故障,很不穩定,其實不是LVS,也不是Tengine,而是控制系統的問題;我們第一步將控制系統做了精簡,將使用者操作邏輯和運維邏輯進行了分離;下一步重點是提高控制系統性能。

功能上,我們會支援UDP和HTTPS。

還有Session同步,FullNAT情況下很難支援Session同步的,這個問題我們也會解決。

後面效能我們也在嘗試英特40G的網絡卡,我們也在評測看看。

我們未來如果做的可以的話,我們希望把4層7層做到一個裡面去。