GitHub將開(kāi)源內(nèi)部負(fù)載均衡軟件
GitHub 負(fù)載均衡系統(tǒng)最初是為了處理 Git 的數(shù)十億日常連接而開(kāi)發(fā)的。GitHub 將發(fā)布開(kāi)源版的 GitHub 負(fù)載均衡軟件(GLB),這是內(nèi)部開(kāi)發(fā)的負(fù)載均衡系統(tǒng)。
開(kāi)發(fā) GLB 的初衷是滿足 GitHub 的這一要求:每天處理數(shù)十億的 HTTP 連接、Git 連接和 SSH 連接。而如今,這家公司將通過(guò)開(kāi)源來(lái)發(fā)布 GLB 的組件,到時(shí)會(huì)透露設(shè)計(jì)方面的細(xì)節(jié)。
GitHub 的高級(jí)基礎(chǔ)設(shè)施工程師喬·威廉斯(Joe Williams)和 GitHub 的基礎(chǔ)設(shè)施工程經(jīng)理西奧·朱利恩(Theo Julienne)在一篇共同撰寫(xiě)的公告中說(shuō):“在過(guò)去,我們的負(fù)載均衡層一向是比較復(fù)雜的組件之一。傳統(tǒng)上,我們縱向擴(kuò)展這個(gè)部分,運(yùn)行一小批運(yùn)行 haproxy 的超大型機(jī)器,并使用非常特定的硬件配置,以便實(shí)現(xiàn)專(zhuān)門(mén)的 10G 鏈路故障切換機(jī)制。”
但是這個(gè)負(fù)載均衡平臺(tái)遇到瓶頸后,該公司開(kāi)始著手開(kāi)發(fā)自己的解決方案。這個(gè)新平臺(tái)要滿足某些目標(biāo),包括橫向擴(kuò)展、高可用性、支持連接清空 (connection draining),并且能應(yīng)對(duì)分布式拒絕服務(wù)(DDoS)攻擊。“為了實(shí)現(xiàn)這些目標(biāo),我們需要重新考慮 IP 地址與主機(jī)之間的關(guān)系、我們的負(fù)載均衡層包括的各個(gè)層,以及連接是如何路由、控制和終結(jié)的。
GitHub 在設(shè)計(jì)負(fù)載均衡平臺(tái)時(shí),為流量引導(dǎo)器(traffic director)這層竭力改進(jìn)常見(jiàn)模式。該公司最后選用了一種支持多個(gè)查詢的聚集哈希(rendezvous hashing)。每個(gè)代理主機(jī)存儲(chǔ)起來(lái),并被分配一個(gè)狀態(tài),然后處理連接清空。固定大小的轉(zhuǎn)發(fā)表生成后,使用聚集哈希的排序組件,每一行都填滿了代理服 務(wù)器的地址。表和代理主機(jī)狀態(tài)被發(fā)送到引導(dǎo)器服務(wù)器,并保持同步。
TCP 數(shù)據(jù)包一發(fā)送到引導(dǎo)器,源端 IP 就經(jīng)過(guò)哈希處理,生成指向轉(zhuǎn)發(fā)表的一致性索引。數(shù)據(jù)包在注定發(fā)送到代理服務(wù)器內(nèi)部 IP 的另一個(gè) IP 數(shù)據(jù)包里面加以封裝,并通過(guò)網(wǎng)絡(luò)發(fā)送出去。代理服務(wù)器收到經(jīng)過(guò)封裝的數(shù)據(jù)包后,拆開(kāi)數(shù)據(jù)包,在本地處理原始數(shù)據(jù)包。出站數(shù)據(jù)包使用服務(wù)器直接返回 (Direct Server Return)模式,那樣發(fā)送到客戶端的數(shù)據(jù)包就直接發(fā)送到客戶端、繞過(guò)引導(dǎo)器這一層。
這兩位工程師說(shuō):“我們著手設(shè)計(jì)一種新的引導(dǎo)器層,它具有無(wú)狀態(tài)性,讓引導(dǎo)器和代理節(jié)點(diǎn)都可以從容地退出輪轉(zhuǎn),在任何可能的情況下,對(duì)用戶沒(méi)有 干擾。一些用戶生活在互聯(lián)網(wǎng)連接不盡如人意的國(guó)家,所以合理大小的代碼庫(kù)的長(zhǎng)時(shí)間運(yùn)行副本不會(huì)在合理時(shí)間的計(jì)劃維護(hù)期間出現(xiàn)故障,對(duì)我們來(lái)說(shuō)很重要。”






