1、 SLB總體架構(gòu)
LVS本身是開源的,我們對它進(jìn)行了多方面的改進(jìn),并且也已開源-https://github.com/alibaba/LVS。
接下來我們看一下LVS在整個SLB中的位置在哪里,整個圖是SLB的架構(gòu)圖。SLB功能比較簡單,主要是做負(fù)載均衡,最主要兩個模塊,一個是四層的負(fù)載均衡-LVS,還有七層的負(fù)載均-tengine,兩個軟件都是開源的;后端掛的是ECS。
一般來說,一個業(yè)務(wù)部署在兩臺或者兩臺以上的ECS-VM上面,建議大家選用SLB做負(fù)載均衡。
無論是LVS-四層也好,Tengine七層也好,我們負(fù)載均衡都是集群,都會有冗余的,一臺宕機(jī)了對用戶來說沒有影響。SLB在杭州region內(nèi)也有很多IDC-數(shù)據(jù)中心,同一個VIP可以在IDC1和IDC2,一旦IDC1宕了就切換到IDC2,即實現(xiàn)IDC間的冗余。對可靠性要求特別高的業(yè)務(wù),建議在ECS兩個可用區(qū)里部署VM,這樣一個IDC宕了也會有冗余。
另外還有我們SLB整個可用性為5個9,為什么我們做IDC冗余,據(jù)說國外最好數(shù)據(jù)中心的可用性是5個9,SLB位于數(shù)據(jù)中心中,必須靠數(shù)據(jù)中心之間的冗余做到5個9。
2、 LVS歷史
LVS是章文嵩博士1998年做的,LVS是Linux虛擬服務(wù)器的簡稱;
章文嵩當(dāng)前是阿里云技術(shù)負(fù)責(zé)人。
3、本次LVS分享主要內(nèi)容
本次分享的內(nèi)容如下:為什么引入LVS?在大規(guī)模網(wǎng)絡(luò)下用的時候存在哪些問題?針對這些問題,我們做了一些改進(jìn):FULLNAT,SYNPROXY,集群部署;接下來,介紹LVS性能優(yōu)化的一些技術(shù),這些技術(shù)不僅僅用在LVS,大家可以用在你們自己網(wǎng)絡(luò)業(yè)務(wù)里面;最后介紹一下我們接下來LVS做哪些事情。
4、 LVS-why
比如說,一個用戶訪問淘寶網(wǎng)站,淘寶網(wǎng)前端共有5臺apache服務(wù)器,如何決定訪問哪一臺apache?常用的方式是用DNS做負(fù)載均衡,將5臺apache服務(wù)器的ip地址添加到域名www.taobao.com中。
但DNS有一些缺點(diǎn),第一個缺點(diǎn):例如第二臺apache宕了,運(yùn)維趕緊把DNS中該apache的ip地址刪除掉,但 很多地方的local DNS不一定遵守TTL協(xié)議,這樣刪除操作什么時候生效,你根本不可控的;尤其移動網(wǎng)絡(luò)中,這個問題更突出,我記得10年時移動網(wǎng)絡(luò)部分地區(qū)local DNS一天才更新。
第二個缺點(diǎn):服務(wù)調(diào)度算法只支持WRR。如果你用戶范圍很有限,就會有負(fù)載不均衡的問題。第三個缺點(diǎn):攻擊防御能力很弱,每次有攻擊靠一臺機(jī)器抗。
針對DNS的不足,引入了Virtual Server的概念,即最前端有一個入口設(shè)備把流量均衡到后端的apache上去;無論是LVS軟負(fù)載 還是 F5硬負(fù)載均衡 也都是這種概念。
5、LVS-what
LVS的基本概念,是4層load balance,這個4層對于著OSI網(wǎng)絡(luò)模型中的傳輸層,需要用到端口信息。
LVS支持WRR、WLC等調(diào)度算法;WRR是帶權(quán)重的輪詢;WLC是帶權(quán)重的最小連接調(diào)度策略,即將請求往最少連接的后端服務(wù)器上調(diào)。
LVS支持3種工作模式:NAT、DR、TUNNEL,這幾種模式跟你IDC網(wǎng)絡(luò)部署方式有關(guān)系的。
傳輸協(xié)議支持TCP、UDP兩種。
第一種是NAT模式,進(jìn)來和出去的數(shù)據(jù)流都是經(jīng)過LVS設(shè)備。進(jìn)來的時候把目的IP改成實際后端服務(wù)器的IP-DNAT,出去的時候則做SNAT。一般買的F5等商用設(shè)備,都采用NAT模式,因為NAT模式可以防DDOS攻擊,該攻擊防御功能依賴于進(jìn)出數(shù)據(jù)都通過設(shè)備。
第二種是TUNNEL,這個是進(jìn)的流量經(jīng)過LVS,出去的時候不經(jīng)過了。TUNNEL是在原來IP頭部再新增封裝一個IP。據(jù)說,騰訊采用IP隧道的模式;TUNNEL模式的最大問題是 每個數(shù)據(jù)包都需要增加一個IP頭部,如果收到的數(shù)據(jù)包是已經(jīng)達(dá)到以太網(wǎng)幀最大長度1.5K,IP頭就添不進(jìn)去。這時候常用做法是會回一個因MTU導(dǎo)致目的不可達(dá)的ICMP包給客戶端,客戶端如果支持PMTU的話,就會把大包分成小包發(fā)過來。
解決上述問題的一個辦法是 交換機(jī)開啟巨幀。另一個方法是將后端服務(wù)器上的MSS改小,我一個IP頭是20個字節(jié),默認(rèn)MSS是1460,將其改成1440可不可以?可以,大部分用戶可以正常支持,但是總會存在百萬份之幾,它不支持的標(biāo)準(zhǔn)MSS協(xié)商協(xié)議,你即使將MSS調(diào)的很小,但是客戶端還是會發(fā)一個大包出來。
第三種是DR,DR的性能是所有模式中最高的,它只需要修改目的MAC;但部署上必須要求LVS和后端服務(wù)器在同一個VLAN中。
DR非常適合小規(guī)模網(wǎng)絡(luò),比如,阿里的CDN都是用的DR模式,幾十臺服務(wù)器的規(guī)模,特別適合DR這種高效的模式;因此,如果你業(yè)務(wù)規(guī)模比較小的話,建議采用DR。
6、LVS-應(yīng)用
前面我們講了LVS基本的特征。LVS本身只是一個內(nèi)核模塊:IP_VS,這個模塊是做負(fù)載均衡,你只用這個模塊來做工程應(yīng)用是遠(yuǎn)遠(yuǎn)不夠的。比如,一臺RealServer宕機(jī)了怎么辦?LVS本身宕機(jī)了著呢麼辦?
針對上述問題,我們需要有輔助軟件幫我們管理LVS,一般現(xiàn)在常用的是Keepalived;keepalived支持健康檢測,4層和7層健康檢檢測,以解決RealServer宕機(jī)問題。
另外,keepalived支持VRRP心跳協(xié)議,可以實現(xiàn)LVS主備冗余,以解決LVS本身單點(diǎn)故障。
最后,keepalived支持配置文件的方式來管理LVS;
完成了上述工作,我們還缺少一個監(jiān)控-服務(wù)運(yùn)行怎么樣,流量怎么樣,CPU負(fù)載怎么樣?大部分公司都有自己一套監(jiān)控系統(tǒng),LVS監(jiān)控基本上都是集成到自己監(jiān)控系統(tǒng)里面去。當(dāng)然也可以用開源的組件,比如,SNMP Patch-可以跟傳統(tǒng)網(wǎng)絡(luò)一樣接口獲得LVS的信息。
該圖是我講到CDN網(wǎng)絡(luò)拓?fù)?,LVS兩臺實現(xiàn)主備冗余,同時對后端RealServer做Healthchech。
7、 LVS-問題 & 解決
前面介紹了官方LVS的一些基礎(chǔ)知識;
但在大規(guī)模的網(wǎng)絡(luò)下,在淘寶的業(yè)務(wù)中,官方LVS滿足不了需求;原因有3點(diǎn),
1) 剛才講三種轉(zhuǎn)發(fā)模式,部署成本比較高;
2) 和商用的負(fù)載均衡比,LVS沒有DDOS防御攻擊功能;
3) 主備部署模式,性能無法擴(kuò)展;一個VIP下的流量特別大怎么辦?
第一點(diǎn)- LVS轉(zhuǎn)發(fā)模式的不足,下面來展開描述一下;
DR的不足:必須要求LVS跟后端所有的REPLY放在同一個VLAN里。當(dāng)然有人會提出來分幾個區(qū),每個區(qū)布一個LVS,但一個區(qū)VM資源沒有了,就只能用其它區(qū)的VM,而用戶需要這些VM掛到同一個VIP下,這是無法實現(xiàn)的。
NAT的不足:NAT最主要問題就是你配置處理很復(fù)雜;阿里原來買的商業(yè)設(shè)備的時候,需要在交換機(jī)上配策略路由,OUT方向的策略路由;因為,冗余考慮會部署多套負(fù)載均衡,走默認(rèn)路由只能到達(dá)一套負(fù)載均衡。
TUNNEL的不足:隧道的問題也是配置較復(fù)雜,RealServer需要加載一個IPIP模塊,同時做一些配置。
針對上述問題,我們的解決方法如下:
LVS各轉(zhuǎn)發(fā)模式運(yùn)維成本高
新轉(zhuǎn)發(fā)模式FULLNAT:實現(xiàn)LVS-RealServer間跨vlan通訊,并且in/out流都經(jīng)過LVS;
缺少攻擊防御模塊
SYNPROXY:synflood攻擊防御模塊
其它TCP FLAG DDOS攻擊防御策略
性能無法線性擴(kuò)展
Cluster部署模式
下面我們分別介紹上述解決方法;
8、LVS-FULLNAT轉(zhuǎn)發(fā)模式
下面講講FullNAT,F(xiàn)ULLNAT轉(zhuǎn)發(fā)數(shù)據(jù)包是類似NAT模式,IN和OUT數(shù)據(jù)包都是經(jīng)過LVS;唯一的區(qū)別:后端RealServer 或者 交換機(jī) 不需要做任何配置。
FULLNAT的主要原理是引入local address(內(nèi)網(wǎng)ip地址),cip-vip轉(zhuǎn)換為lip->rip,而 lip和rip均為IDC內(nèi)網(wǎng)ip,可以跨vlan通訊;
下面從IP地址轉(zhuǎn)換的角度看一下,NAT和FULLNAT的區(qū)別;
如圖所示,相比NAT模式,F(xiàn)ullNAT多了一個Local IP,IP地址轉(zhuǎn)換時,源和目的IP都改了,即SNAT+DNAT。
FULLNAT模式下,ipvs在NETFLITER框架的HOOK點(diǎn)也發(fā)生了變化;
這個圖就是內(nèi)核NETFILTER的五個HOOK點(diǎn);原來傳統(tǒng)的NAT模式,在LOCAL_IN和FORWARD兩個點(diǎn),而FullNAT模式下,IN/OUT方向的目的IP都是LVS上的IP,因此,只能在LOCAL_IN這個點(diǎn)。
相比NAT,session表管理也發(fā)生了變化,有1個索引表,變成了IN和OUT 2個; 這是因為NAT模式只需要用client address作為hash key,而FULLNAT只能用5元組;
FULLNAT一個最大的問題是:RealServer無法獲得用戶IP;為了解決這個問題我們提出了TOA的概念,主要原理是:將client address放到了TCP Option里面帶給后端RealServer,RealServer上通過toa內(nèi)核模塊hack了getname函數(shù),給用戶態(tài)返回TCP Option中的client ip。
題外話,全球最大CDN廠商阿克曼也用了TCP Option攜帶附屬信息;
下面來介紹一下FULLNAT開發(fā)時,遇到的幾個坑,這幾個坑對Linux網(wǎng)絡(luò)應(yīng)用開發(fā)也是有用的;比如,Realserver kernel開啟tcp_tw_recycle,該參數(shù)開啟會導(dǎo)致部分NAT網(wǎng)關(guān)出來的用戶訪問失??;
9、LVS-SYNPROXY
LVS可以防御DDOS 4層標(biāo)志位攻擊,其中,synproxy是用于防御synflood攻擊的模塊;
Synproxy實現(xiàn)的主要原理:參照linux tcp協(xié)議棧中syncookies的思想,LVS-構(gòu)造特殊seq的synack包,驗證ack包中ack_seq是否合法-實現(xiàn)了TCP三次握手代理;
簡化一點(diǎn)說,就是client和LVS間建立3次握手,成功后,LVS再和RS建立3次握手;
10、LVS-集群
前面我們介紹了引入一種新的模式叫做FullNAT,方便大家部署,下面我們可以有集群部署模式做橫向擴(kuò)展。
誰把流量均衡的分到各臺LVS上-交換機(jī),LVS和交換機(jī)間運(yùn)行OSPF協(xié)議,交換機(jī)上生成該VIP的等價路由-ECMP;
另外,這種部署方式很多地方可以用,比如說DNS,域名系統(tǒng)我們每個公司都需要,部署DNS系統(tǒng)的時候,不建議再去加一層LVS,而是DNS服務(wù)器直接和交換機(jī)跑OSPF協(xié)議。
交換機(jī)ECMP有一個問題:當(dāng)前是不支持一致性哈希算法;比如,三臺LVS有一臺宕了,等價路由變成兩條,你數(shù)據(jù)包全都亂掉了。像思科的交換機(jī)芯片它也支持了類似一致性hash的算法,但具有該功能的交換機(jī)還沒有產(chǎn)品化出來;因此,我們不得不在各臺LVS做session同步,即把連接表做成全局的,這樣即使有一臺LVS宕了也沒有關(guān)系,因為表是全局的,這樣請求過來其它LVS還可以正確地往后轉(zhuǎn)發(fā)。
注:當(dāng)前FullNAT模式?jīng)]法支持同步的。
11、LVS-性能優(yōu)化
這些性能優(yōu)化方法對大家網(wǎng)絡(luò)服務(wù)也是有用的。
第一點(diǎn),多隊列網(wǎng)卡,即一個隊列綁定到一個CPU核上,讓多核同時處理網(wǎng)絡(luò)數(shù)據(jù)包。如果網(wǎng)卡不支持多隊列,可以用google提供的軟多隊列-RPS,linux內(nèi)核默認(rèn)已經(jīng)集成;
第二,對keepalived進(jìn)行了優(yōu)化,主要將網(wǎng)絡(luò)模式從select改為了epool。
第三,大家如果自己買的服務(wù)器的話,建議把網(wǎng)卡LRO、GRO功能關(guān)掉,尤其是broadcom的網(wǎng)卡,我們踩過很多坑。
12、 LVS-todo list
接下來我介紹一下我們下一步要做的事情。
我們接下來重點(diǎn)在:控制系統(tǒng);LVS在五六月份的時候出現(xiàn)一系列的故障,很不穩(wěn)定,其實不是LVS,也不是Tengine,而是控制系統(tǒng)的問題;我們第一步將控制系統(tǒng)做了精簡,將用戶操作邏輯和運(yùn)維邏輯進(jìn)行了分離;下一步重點(diǎn)是提高控制系統(tǒng)性能。
功能上,我們會支持UDP和HTTPS。
還有Session同步,F(xiàn)ullNAT情況下很難支持Session同步的,這個問題我們也會解決。
后面性能我們也在嘗試英特40G的網(wǎng)卡,我們也在評測看看。
我們未來如果做的可以的話,我們希望把4層7層做到一個里面去。
原文地址:http://blog.aliyun.com/1750 (有視頻)
2015 歲末的北京,中國技術(shù)架構(gòu)與運(yùn)維界的“風(fēng)云際會”即將來臨,你不想來看看嗎? 參會請識別下圖二維碼,或閱讀原文
聯(lián)系客服