LVS在大規模網絡環境中的應用
1、 SLB總體架構
LVS本身是開源的,我們對它進行了多方面的改進,並且也已開源-https://github.com/alibaba/LVS。
接下來我們看一下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虛擬服務器的簡稱;
章文嵩當前是阿里雲技術負責人。
3、本次LVS分享主要內容
本次分享的內容如下:為什么引入LVS?在大規模網絡下用的時候存在哪些問題?針對這些問題,我們做了一些改進:FULLNAT,SYNPROXY,集群部署;接下來,介紹LVS性能優化的一些技術,這些技術不僅僅用在LVS,大家可以用在你們自己網絡業務里面;最后介紹一下我們接下來LVS做哪些事情。
4、 LVS-why
比如說,一個用戶訪問淘寶網站,淘寶網前端共有5台apache服務器,如何決定訪問哪一台apache?常用的方式是用DNS做負載均衡,將5台apache服務器的ip地址添加到域名www.taobao.com中。
但DNS有一些缺點,第一個缺點:例如第二台apache宕了,運維趕緊把DNS中該apache的ip地址刪除掉,但 很多地方的local DNS不一定遵守TTL協議,這樣刪除操作什么時候生效,你根本不可控的;尤其移動網絡中,這個問題更突出,我記得10年時移動網絡部分地區local DNS一天才更新。
第二個缺點:服務調度算法只支持WRR。如果你用戶范圍很有限,就會有負載不均衡的問題。第三個缺點:攻擊防御能力很弱,每次有攻擊靠一台機器抗。
針對DNS的不足,引入了Virtual Server的概念,即最前端有一個入口設備把流量均衡到后端的apache上去;無論是LVS軟負載 還是 F5硬負載均衡 也都是這種概念。
5、LVS-what
LVS的基本概念,是4層load balance,這個4層對於着OSI網絡模型中的傳輸層,需要用到端口信息。
LVS支持WRR、WLC等調度算法;WRR是帶權重的輪詢;WLC是帶權重的最小連接調度策略,即將請求往最少連接的后端服務器上調。
LVS支持3種工作模式:NAT、DR、TUNNEL,這幾種模式跟你IDC網絡部署方式有關系的。
傳輸協議支持TCP、UDP兩種。
第一種是NAT模式,進來和出去的數據流都是經過LVS設備。進來的時候把目的IP改成實際后端服務器的IP-DNAT,出去的時候則做SNAT。一般買的F5等商用設備,都采用NAT模式,因為NAT模式可以防DDOS攻擊,該攻擊防御功能依賴於進出數據都通過設備。
第二種是TUNNEL,這個是進的流量經過LVS,出去的時候不經過了。TUNNEL是在原來IP頭部再新增封裝一個IP。據說,騰訊采用IP隧道的模式;TUNNEL模式的最大問題是 每個數據包都需要增加一個IP頭部,如果收到的數據包是已經達到以太網幀最大長度1.5K,IP頭就添不進去。這時候常用做法是會回一個因MTU導致目的不可達的ICMP包給客戶端,客戶端如果支持PMTU的話,就會把大包分成小包發過來。
解決上述問題的一個辦法是 交換機開啟巨幀。另一個方法是將后端服務器上的MSS改小,我一個IP頭是20個字節,默認MSS是1460,將其改成1440可不可以?可以,大部分用戶可以正常支持,但是總會存在百萬份之幾,它不支持的標准MSS協商協議,你即使將MSS調的很小,但是客戶端還是會發一個大包出來。
第三種是DR,DR的性能是所有模式中最高的,它只需要修改目的MAC;但部署上必須要求LVS和后端服務器在同一個VLAN中。
DR非常適合小規模網絡,比如,阿里的CDN都是用的DR模式,幾十台服務器的規模,特別適合DR這種高效的模式;因此,如果你業務規模比較小的話,建議采用DR。
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的信息。
該圖是我講到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轉發模式
下面講講FullNAT,FULLNAT轉發數據包是類似NAT模式,IN和OUT數據包都是經過LVS;唯一的區別:后端RealServer 或者 交換機 不需要做任何配置。
FULLNAT的主要原理是引入local address(內網ip地址),cip-vip轉換為lip->rip,而 lip和rip均為IDC內網ip,可以跨vlan通訊;
下面從IP地址轉換的角度看一下,NAT和FULLNAT的區別;
如圖所示,相比NAT模式,FullNAT多了一個Local IP,IP地址轉換時,源和目的IP都改了,即SNAT+DNAT。
FULLNAT模式下,ipvs在NETFLITER框架的HOOK點也發生了變化;
這個圖就是內核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元組;
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次握手;
10、LVS-集群
前面我們介紹了引入一種新的模式叫做FullNAT,方便大家部署,下面我們可以有集群部署模式做橫向擴展。
誰把流量均衡的分到各台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層做到一個里面去。
原文地址:http://blog.aliyun.com/1750 (有視頻)

















