LVS在大規模網絡環境中的應用

一、 SLB整體架構前端

LVS自己是開源的,咱們對它進行了多方面的改進,而且也已開源-https://github.com/alibaba/LVS。linux

 

1

 

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

通常來講,一個業務部署在兩臺或者兩臺以上的ECS-VM上面,建議你們選用SLB作負載均衡。github

不管是LVS-四層也好,Tengine七層也好,咱們負載均衡都是集羣,都會有冗餘的,一臺宕機了對用戶來講沒有影響。SLB在杭州region內也有不少IDC-數據中心,同一個VIP能夠在IDC1和IDC2,一旦IDC1宕了就切換到IDC2,即實現IDC間的冗餘。對可靠性要求特別高的業務,建議在ECS兩個可用區裏部署VM,這樣一個IDC宕了也會有冗餘。算法

另外還有咱們SLB整個可用性爲5個9,爲何咱們作IDC冗餘,聽說國外最好數據中心的可用性是5個9,SLB位於數據中心中,必須靠數據中心之間的冗餘作到5個9。apache

 

二、  LVS歷史後端

LVS是章文嵩博士1998年作的,LVS是Linux虛擬服務器的簡稱; 性能優化

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

 

三、本次LVS分享主要內容cookie

  本次分享的內容以下:爲何引入LVS?在大規模網絡下用的時候存在哪些問題?針對這些問題,咱們作了一些改進:FULLNAT,SYNPROXY,集羣部署;接下來,介紹LVS性能優化的一些技術,這些技術不只僅用在LVS,你們能夠用在大家本身網絡業務裏面;最後介紹一下咱們接下來LVS作哪些事情。

 

四、  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

 

五、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

 

六、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。

 

七、  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部署模式

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

 

八、LVS-FULLNAT轉發模式

10

下面講講FullNAT,FULLNAT轉發數據包是相似NAT模式,IN和OUT數據包都是通過LVS;惟一的區別:後端RealServer 或者 交換機 不須要作任何配置。

FULLNAT的主要原理是引入local address(內網ip地址),cip-vip轉換爲lip->rip,而 liprip均爲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網關出來的用戶訪問失敗;

 

九、LVS-SYNPROXY

LVS能夠防護DDOS 4層標誌位攻擊,其中,synproxy是用於防護synflood攻擊的模塊;

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

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

16

十、LVS-集羣

前面咱們介紹了引入一種新的模式叫作FullNAT,方便你們部署,下面咱們能夠有集羣部署模式作橫向擴展。

17

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

另外,這種部署方式不少地方能夠用,好比說DNS,域名系統咱們每一個公司都須要,部署DNS系統的時候,不建議再去加一層LVS,而是DNS服務器直接和交換機跑OSPF協議。

交換機ECMP有一個問題:當前是不支持一致性哈希算法;好比,三臺LVS有一臺宕了,等價路由變成兩條,你數據包全都亂掉了。像思科的交換機芯片它也支持了相似一致性hash的算法,但具備該功能的交換機尚未產品化出來;所以,咱們不得不在各臺LVS作session同步,即把鏈接表作成全局的,這樣即便有一臺LVS宕了也沒有關係,由於表是全局的,這樣請求過來其它LVS還能夠正確地日後轉發。

注:當前FullNAT模式無法支持同步的。

 

十一、LVS-性能優化

這些性能優化方法對你們網絡服務也是有用的。

第一點,多隊列網卡,即一個隊列綁定到一個CPU核上,讓多核同時處理網絡數據包。若是網卡不支持多隊列,能夠用google提供的軟多隊列-RPS,linux內核默認已經集成;

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

第三,你們若是本身買的服務器的話,建議把網卡LRO、GRO功能關掉,尤爲是broadcom的網卡,咱們踩過不少坑。

相關文章
相關標籤/搜索