分布式 - 集群與負載均衡的算法與實現(xiàn)

學習完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師

負載均衡

什么是負載均衡呢喇伯?用戶輸入的流量通過負載均衡器按照某種負載均衡算法把流量均勻的分散到后端的多個服務器上,接收到請求的服務器可以獨立的響應請求夯膀,達到負載分擔的目的。從應用場景上來說,常見的負載均衡模型有全局負載均衡和集群內(nèi)負載均衡,從產(chǎn)品形態(tài)角度來說圆兵,又可以分為硬件負載均衡和軟件負載均衡。全局負載均衡一般通過DNS實現(xiàn)策泣,通過將一個域名解析到不同VIP衙傀,來實現(xiàn)不同的region調(diào)度能力抬吟;硬件負載均衡器常見的有F5萨咕、A10、Array火本,它們的優(yōu)缺點都比較明顯危队,優(yōu)點是功能強大聪建,有專門的售后服務團隊,性能比較好茫陆,缺點是缺少定制的靈活性金麸,維護成本較高;現(xiàn)在的互聯(lián)網(wǎng)更多的思路是通過軟件負載均衡來實現(xiàn)簿盅,這樣可以滿足各種定制化需求挥下,常見的軟件負載均衡有 LVS、Nginx桨醋、Haproxy棚瘟。

image

阿里云高性能負載均衡使用 LVS 和 Tengine,我們在一個 region 區(qū)分不同的機房,每個機房都有 LVS 集群和 Tengine 集群喜最,對于用戶配置的四層監(jiān)聽偎蘸,LVS 后面會直接掛載用戶 ECS,七層用戶監(jiān)聽 ECS 則掛載在 Tengine 上瞬内,四層監(jiān)聽的流量直接由 LVS 轉發(fā)到 ECS迷雪,而 7 層監(jiān)聽的流量會經(jīng)過 LVS 到 Tenigine 再到用戶 ECS。每一個 region 里都會有多個可用區(qū),達到主備容災目的蜂怎,每一個集群里都有多臺設備劲弦,第一是為了提升性能,第二也是基于容災考慮慧邮。

image

圖為高性能負載均衡控制管理概要圖,SLB 產(chǎn)品也有 SDN 概念舟陆,轉發(fā)和控制是分離的误澳,用戶所有配置通過控制臺先到控制器,通過集中控制器轉換將用戶配置推送到不同設備上秦躯,每臺設備上都有 Agent 接收控制器下發(fā)的需求忆谓,通過本地轉換成 LVS 和 Tengine 能夠識別的配置,這個過程支持熱配置踱承,不影響用戶轉發(fā)倡缠,不需要 reload 才能使新配置生效。

LVS

LVS 支持的三種模式

image

早期 LVS 支持三種模式茎活,DR 模式昙沦、TUN 模式NAT 模式

DR 模式

DR 模式經(jīng)過 LVS 之后载荔,LVS 會將 MAC 地址更改盾饮、封裝 MAC 頭,內(nèi)層 IP 報文不動,報文經(jīng)過 LVS 負載均衡查找到 RS 之后丘损,將源 MAC 頭改成自己的普办,目的 MAC 改成 RS 地址,MAC 尋址是在二層網(wǎng)絡里徘钥,對網(wǎng)絡部署有一定的限定衔蹲,在大規(guī)模分布式集群部署里,這種模式的靈活性沒有辦法滿足需求呈础;

TUN 模式

TUN 模式走在 LVS 之后舆驶,LVS 會在原有報文基礎上封裝 IP 頭,到了后端 RS 之后而钞,RS 需要解開 IP 報文封裝贞远,才能拿到原始報文,不管是 DR 模式還是 TUN 模式笨忌,后端 RS 都可以看到真實客戶源 IP蓝仲,目的 IP 是自己的 VIP,VIP 在 RS 設備上需要配置官疲,這樣可以直接繞過 LVS 返回給用戶袱结,TUN 模式問題在于需要在后端 ECS 上配置解封裝模塊,在 Linux 上已經(jīng)支持這種模塊途凫,但是 Windows 上還沒有提供支持垢夹,所以會對用戶系統(tǒng)鏡像選擇有限定。

NAT 模式

NAT 模式用戶訪問的是 VIP维费,LVS 查找完后會將目的 IP 做 DNAT 轉換果元,選擇出 RS 地址,因為客戶端的 IP 沒變犀盟,在回包的時候直接向公網(wǎng)真實客戶端 IP 去路由而晒,NAT 的約束是因為 LVS 做了 DNAT 轉換,所以回包需要走 LVS阅畴,把報文頭轉換回去倡怎,由于 ECS 看到的是客戶端真實的源地址,我們需要在用戶 ECS 上配置路由贱枣,將到 ECS 的默認路由指向 LVS 上监署,這對用戶場景也做了限制。

LVS 基于 NetFilter 框架實現(xiàn)

image

NetFilter 是 Linux 提供的網(wǎng)絡開放平臺纽哥,基于平臺可以開發(fā)自己的業(yè)務功能模塊钠乏,早期好多安全廠商都是基于 NetFilter 做一些業(yè)務模型實現(xiàn),這種模型比較靈活春塌,但通用模型里更多的是兼容性考慮晓避,路徑會非常長簇捍;而且通用模型中沒辦法發(fā)揮多核特性,目前 CPU 的發(fā)展更多是向橫向擴展够滑,我們經(jīng)常見到多路服務器,每路上有多少核吕世,早期通用模型對多核支持并不是特別友善彰触,在多核設計上有些欠缺,導致我們在通用模型上做一些應用開發(fā)時的擴展性是有限的命辖,隨著核的數(shù)量越來越多况毅,性能不增反降。

LVS 的改進

image

早期模式的各種限制制約了我們的發(fā)展尔艇,所以我們首先做了 FullNAT尔许,相比原來的 NAT 方式,F(xiàn)ullNAT 多了 SNAT 屬性终娃,將客戶端的原 IP 地址作了轉換味廊;其次,我們在并行化上做了處理棠耕,充分利用多核實現(xiàn)性能線性提升余佛;然后是快速路徑,我們在做網(wǎng)絡轉發(fā)模型時很容易想到設計快速路徑和慢速路徑窍荧,慢速路徑更多是解決首包如何通過設備問題辉巡,可能需要查ACL或路由,需要判斷許多和策略相關的東西蕊退,后面所有報文都可以通過快速路徑轉發(fā)出去郊楣;還有指令相關優(yōu)化,利用因特爾特殊指令提升性能瓤荔;另外針對多核架構净蚤,NUMA 多節(jié)點內(nèi)存訪問,通過訪問 Local 節(jié)點內(nèi)存可能獲得更好的延遲表現(xiàn)输硝。

image

客戶端進來 IP 首先訪問 LVS 的 VIP塞栅,原 IP 是客戶端的,目的 IP 是 LVS 的 VIP腔丧,經(jīng)過 FullNAT 轉換后放椰,原 IP 變成 LVS 的 Local 地址,目的地址是 LVS 選擇出來的 RS 地址愉粤,這樣在 RS 回包時比較容易砾医,只要路由可達,報文一定會交到 LVS 上衣厘,不需要在 RS 上做特殊的配置如蚜。右面就是 DNAT + SNAT 轉換压恒,報文就可以通過 LVS 轉發(fā)回客戶端,這種方式主要帶來應用場景部署靈活性選擇错邦。

image

通過并行化實現(xiàn)對 LVS 性能的改善探赫,性能沒有辦法得到線性提升更多的是因為每條路徑都需要訪問全局資源,就會不可避免引入鎖的開箱撬呢,另外伦吠,同一條鏈接上的報文可能分散在不同的核上,大家去訪問全局資源時也會導致 cache 的丟失魂拦。所以我們通過 RSS 技術把同一個五源組報文扔到同一個 CPU 上處理毛仪,保證入方向的所有相同連接上的報文都能交給相同 CPU 處理,每個核在轉發(fā)出去時都用當前 CPU 上的 Local 地址芯勘,通過設置一些 fdir 規(guī)則箱靴,報文回來時后端 RS 訪問的目的地址就是對應 CPU 上的 local 地址,可以交到指定的 CPU 上去處理荷愕,這樣一條連接上左右方向報文都可以交給同一個 CPU 處理衡怀,將流在不同的 CPU 隔離開;另外安疗,我們把所有配置資源包括動態(tài)緩存資源在每個 CPU 上作了拷貝狈癞,將資源局部化,這使整個流從進入 LVS 到轉發(fā)出去訪問的資源都是固定在一個核上的本地資源茂契,使性能達到最大化蝶桶,實現(xiàn)線性提升。

改進后的 LVS 表現(xiàn)如下:

  • 出于對容災和性能提升的考慮掉冶,我們做了集群化部署真竖,每個 region 有不同機房,每個機房有多個調(diào)度單元厌小,每個單元有多臺 LVS 設備恢共;
  • 每臺 LVS 經(jīng)過優(yōu)化后,都能達到更高性能璧亚,大容量讨韭,單臺 LVS 可以達到 4000W PPS600W CPS癣蟋、單個 group 可以到達 1億 并發(fā)透硝;
  • 支持 region、IDC疯搅、集群和應用級的高可用濒生;
  • 實現(xiàn)了防攻擊功能,并在原版 LVS 上提供了更豐富的功能幔欧,可以基于各個維度做管理控制罪治,精確的統(tǒng)計丽声,流量的分析等。

Tengine

image

Tengine 在應用過程中也遇到了各種問題觉义,最嚴重的就是性能問題雁社,我們發(fā)現(xiàn)隨著 CPU 數(shù)量越來越多,QPS 值并沒有線性提升晒骇;Nginx 本身是多 worker 模型霉撵,每個 worker 是單進程模式,多 worker 架構做 CPU 親和厉碟,內(nèi)部基于事件驅動的模型喊巍,其本身已經(jīng)提供了很高的性能屠缭,單核 Nginx 可以跑到 1W5~2W QPS箍鼓。Nginx 往下第一層是 socket API,socket 往下有一層 VFS呵曹,再往下是 TCP款咖、IP,socket 層比較薄奄喂,經(jīng)過量化的分析和評估铐殃,性能開銷最大的是 TCP 協(xié)議棧和 VFS 部分,因為同步開銷大跨新,我們發(fā)現(xiàn)橫向擴展不行富腊,對此,我們做了一些優(yōu)化域帐。

七層反向代理的路徑更長赘被,處理更復雜,所以它的性能比 LVS 低很多肖揣,我們比較關注單機和集群的性能民假,集群性能可以靠堆設備去解決,單機如果不提升龙优,成本會一直增加羊异,從性能角度來看,有以下的優(yōu)化思路和方向:

  • 基于 Kernel 做開發(fā)彤断,比如優(yōu)化協(xié)議棧野舶;
  • 基于 AliSocket 的優(yōu)化,AliSocket 是阿里研發(fā)的高性能 TCP 協(xié)議棧平臺宰衙,底層是 DPDK筒愚,它將資源做了局部化處理,報文分發(fā)不同核處理菩浙,性能非常出色巢掺;
  • HTTPS 業(yè)務越來越多句伶,流量逐步遞增,我們采用硬件加速卡方式做一些加解密的性能提升陆淀,還有 HTTPS 的會話復用考余;
  • 基于 Web 傳輸層的性能優(yōu)化
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市轧苫,隨后出現(xiàn)的幾起案子楚堤,更是在濱河造成了極大的恐慌,老刑警劉巖含懊,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件身冬,死亡現(xiàn)場離奇詭異,居然都是意外死亡岔乔,警方通過查閱死者的電腦和手機酥筝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雏门,“玉大人嘿歌,你說我怎么就攤上這事∽掠埃” “怎么了宙帝?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長募闲。 經(jīng)常有香客問我步脓,道長,這世上最難降的妖魔是什么浩螺? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任靴患,我火速辦了婚禮,結果婚禮上年扩,老公的妹妹穿的比我還像新娘蚁廓。我一直安慰自己,他們只是感情好厨幻,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布相嵌。 她就那樣靜靜地躺著,像睡著了一般况脆。 火紅的嫁衣襯著肌膚如雪饭宾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天格了,我揣著相機與錄音看铆,去河邊找鬼。 笑死盛末,一個胖子當著我的面吹牛弹惦,可吹牛的內(nèi)容都是我干的否淤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼棠隐,長吁一口氣:“原來是場噩夢啊……” “哼石抡!你這毒婦竟也來了?” 一聲冷哼從身側響起助泽,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤啰扛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗡贺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隐解,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年诫睬,在試婚紗的時候發(fā)現(xiàn)自己被綠了煞茫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡岩臣,死狀恐怖溜嗜,靈堂內(nèi)的尸體忽然破棺而出宵膨,到底是詐尸還是另有隱情架谎,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布辟躏,位于F島的核電站谷扣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捎琐。R本人自食惡果不足惜会涎,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瑞凑。 院中可真熱鬧末秃,春花似錦、人聲如沸籽御。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽技掏。三九已至铃将,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哑梳,已是汗流浹背劲阎。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸠真,地道東北人悯仙。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓龄毡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锡垄。 傳聞我的和親對象是個殘疾皇子稚虎,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 摘要:2017阿里云網(wǎng)絡技術高峰論壇在線技術峰會,阿里云衛(wèi)崢帶來題為高性能負載均衡設計與實現(xiàn)的演講偎捎。本文主要從早期...
    肆虐的悲傷閱讀 358評論 0 2
  • 轉:http://kb.cnblogs.com/page/188170/ (一) 簡單理解四層和七層負載...
    菜鳥小玄閱讀 1,021評論 0 3
  • 本文部分觀點圖片采用于:http://chenx1242.blog.51cto.com 隨著智能機的逐漸普及蠢终,大量...
    BossHuang閱讀 3,157評論 0 16
  • 背負罵名與榮光寻拂,一生戎馬與輝煌,“兔死狗烹丈牢,鳥盡弓藏”祭钉,咸陽城內(nèi)收秦疆,烏江岸邊逼霸王己沛,長安建漢統(tǒng)中華慌核!一個不被父...
    回眸微笑閱讀 238評論 0 0
  • 14.1 基本概念 重載運算符:至少含有一個類類型參數(shù),除函數(shù)調(diào)用運算符外都不能含有默認實參申尼;優(yōu)先級垮卓、結合律、運算...
    咸魚翻身ing閱讀 439評論 0 0