在過去的一年中,GitHub一直在開發(fā)一個新的負載均衡系統(tǒng)——GitHub Load Balancer(GLB)。這個系統(tǒng)想要通過擴展使用普通的硬件來應對每天數(shù)十億的連接。GitHub工程師Joe Williams和Theo Julienne講解了GLB的設(shè)計歷程。
GitHub根本的設(shè)計目標之一是希望能“擴展”IP,即,將單個公網(wǎng)IP的數(shù)據(jù)流量通過多個等價的連接分發(fā)到不同的目標機器。這通常是通過等價多路徑路由(ECMP)來實現(xiàn)的,從而擴大帶寬。然而,ECMP在各個ECMP節(jié)點發(fā)生變化,比如在節(jié)點失效或因維護需求而被移除時,表現(xiàn)不是很好。對GitHub來說這是使用ECMP最大的缺陷。
因此,GitHub工程師考慮使用L4/L7分離策略,將負載均衡節(jié)點分為兩層,L4和L7,OSI層據(jù)此來提供各個節(jié)點分發(fā)請求時需要的信息。L4使用來源及目標IP地址和TCP端口號進行路由,而L7使用應用層信息來路由,這通常使用HTTP協(xié)議。在L4/L7分離的設(shè)計中,L4節(jié)點通過ECMP拆分流量到L7節(jié)點,我們稱前者為“director”節(jié)點,后者為“proxy”節(jié)點。Williams和Julienne解釋到,通常ipvs/LVS被應用于L4節(jié)點,而L7節(jié)點使用haproxy或類似工具。
L4/L7分離帶來最大的好處是,只要簡單地將L7節(jié)點從服務新連接的節(jié)點池中移除,并服務到節(jié)點上現(xiàn)有連接全部結(jié)束,就可以在不影響正常運行的情況下移除一個L7節(jié)點。但另一方面,在L4節(jié)點失效或被移除時會導致訪問中斷。由于git無法進行重試或恢復已斷開的連接,解決這個問題對GitHub來說尤為關(guān)鍵。
GitHub通過使用Rendezvous哈希算法解決了這個最終問題,這個算法使director節(jié)點間協(xié)定應該由哪個proxy節(jié)點來處理某個請求。GLB結(jié)合使用Rendezvous哈希算法與服務器直接返回模式,后者使返回報文直接從proxy節(jié)點返回給客戶端,從而繞過了原來分配請求到proxy的director節(jié)點。在GLB中,使用Rendezvous哈希的基本思想是要將請求轉(zhuǎn)發(fā)表在各個director節(jié)點間共享并保持同步。這大體上能保證即使一個director節(jié)點失效或被移除,其他director節(jié)點可以代替并將現(xiàn)存連接分配到正確的proxy節(jié)點。
最后Williams和Julienne談到他們計劃如何平滑地發(fā)布這個新負載均衡系統(tǒng),并預計在近期開源該項目。
查看英文原文:How GitHub Designed its New Load Balancer