圖解:路由器架構(gòu)簡史
在過去的 50 年里,我們在互聯(lián)網(wǎng)的發(fā)展方面取得了很大的進步,從少量計算機相互連接的微小網(wǎng)絡(luò),發(fā)展成為擁有數(shù)十億節(jié)點的全球網(wǎng)絡(luò)。在這個過程中,我們學(xué)到了很多關(guān)于如何構(gòu)建網(wǎng)絡(luò)以及連接它們的路由器相關(guān)知識,同時所犯的每一個錯誤也都為后來學(xué)習(xí)它們的人提供了重要的經(jīng)驗教訓(xùn)。
起初,路由器就像一臺帶有多個網(wǎng)卡(NIC)的簡單計算機。
這在一定程度上是可行的。在這種架構(gòu)中,數(shù)據(jù)包進入網(wǎng)卡,并由 CPU 從網(wǎng)卡傳輸?shù)絻?nèi)存中。 CPU做出轉(zhuǎn)發(fā)決定,然后將數(shù)據(jù)包推送到出站網(wǎng)卡。CPU和內(nèi)存是集中的資源,受它們所能支持的內(nèi)容約束??偩€則有一個額外的限制:總線的帶寬必須能夠同時支持所有網(wǎng)卡的帶寬。
一旦想擴大規(guī)模,問題很快就會顯現(xiàn)出來。我們可以購買更快的 CPU,但總線如何擴展呢?如果把總線速度加倍,那么你必須把每個網(wǎng)卡和CPU卡上的總線接口速度加倍。這樣單個網(wǎng)卡的性能可能并沒有提高多少,但是價格卻變得十分昂貴。
1):路由器的成本應(yīng)該與容量呈線性增長。
想要擴大規(guī)模,權(quán)宜之計只有添加另外的總線和處理器:
算術(shù)邏輯單元 (ALU) 是一個數(shù)字信號處理 (DSP) 芯片,選擇它是因為其卓越的性價比。附加的總線增加了帶寬,但架構(gòu)仍然無法擴展。換句話說,想要通過繼續(xù)添加更多 ALU 和更多總線來獲得更高的性能是行不通的。
由于ALU仍然是一個重大限制,下一步是在架構(gòu)中添加一個FPGA來卸載最長前綴匹配(LPM)查找的工作量。
這樣做雖然能夠起到一些作用,但是作用十分有限,ALU仍然飽和。LPM占工作負載的很一大部分,但是如果去掉這部分問題,集中式架構(gòu)仍然無法擴展。
2):LPM 可以在定制芯片中實現(xiàn),并且不會成為性能障礙。
下一步是走向另一個方向:用通用處理器替換 ALU 和 FPGA。嘗試通過添加更多 CPU 和更多總線來擴展。這需要大量的投入,且只能獲得十分微小的增量增益,并且仍然受到集中總線帶寬的限制。
在互聯(lián)網(wǎng)發(fā)展的這個階段,更大的力量開始發(fā)揮作用。隨著網(wǎng)絡(luò)的普及,互聯(lián)網(wǎng)的巨大潛力愈發(fā)凸顯。電信公司收購了NSFnet區(qū)域網(wǎng)絡(luò)并開始部署商業(yè)骨干網(wǎng)。專用集成電路 (ASIC) 成為可靠的技術(shù),允許更多的功能直接在芯片上實現(xiàn)。對路由器需求的飆升,對可擴展性大幅改進的需求最終壓倒了原本的保守主義。為了滿足這一需求,許多初創(chuàng)公司涌現(xiàn)出來,提供了各種潛在的解決方案。
首先出場的是crossbar:
圖 4 — 隨著對路由器的需求猛增,一種替代方案是crossbar
在這種架構(gòu)中,每個網(wǎng)卡都是一個輸入和一個輸出。網(wǎng)卡上的處理器做出轉(zhuǎn)發(fā)決定,選擇輸出網(wǎng)卡并向crossbar發(fā)送調(diào)度請求。調(diào)度器接收來自網(wǎng)卡的所有請求,嘗試找出最佳解決方案,對crossbar進行編程,并提示輸入進行傳輸。
這樣做的問題是每個輸出一次只能偵聽一個輸入,并且互聯(lián)網(wǎng)流量是突發(fā)的。如果兩個數(shù)據(jù)包需要去同一個輸出,其中一個必須等待。如果必須等待的數(shù)據(jù)包導(dǎo)致同一輸入上的其他數(shù)據(jù)包也在等待,那么系統(tǒng)將遭受線路阻塞 (HOLB),從而導(dǎo)致路由器性能變得非常差。
3):即使在壓力條件下,路由器的內(nèi)部結(jié)構(gòu)也需要無阻塞。
另一種方法是將網(wǎng)卡排列在一個環(huán)面上:
這樣,每個網(wǎng)卡都與四個相鄰網(wǎng)卡相連,輸入網(wǎng)卡必須計算出穿過架構(gòu)的路徑才能到達輸出線卡。這里存在一個問題——帶寬不統(tǒng)一。南北方向的帶寬大于東西方向的帶寬。如果輸入流量模式需要東西向,就會出現(xiàn)阻塞。
4):路由器的內(nèi)部結(jié)構(gòu)必須具有統(tǒng)一的帶寬分布,因為我們無法預(yù)測流量的分布。
一種方法是創(chuàng)建網(wǎng)卡到網(wǎng)卡鏈接的全網(wǎng)狀網(wǎng)絡(luò)。
盡管吸取了以前的教訓(xùn),但新的問題還是暴露了出來。在這種架構(gòu)中,一切看起來都運行得很好,直到有人需要更換卡進行維修。由于每個網(wǎng)卡都保存了系統(tǒng)中所有數(shù)據(jù)包單元,當一張卡被拔出時,所有數(shù)據(jù)包都無法被重建,從而會導(dǎo)致中斷。
5):路由器不能有單點故障。
所有數(shù)據(jù)包都流入中央存儲器,然后到輸出網(wǎng)卡。這種方式很好,但擴展內(nèi)存是一個挑戰(zhàn)。用戶可以添加多個內(nèi)存控制器和內(nèi)存條,但在某些時候,聚合帶寬實在是太大了,無法進行物理設(shè)計。碰到實際的物理極限迫使我們往其他方向思考。
電話網(wǎng)絡(luò)提供了靈感。Charles Clos很久以前就意識到可以通過構(gòu)建較小交換機的網(wǎng)絡(luò)來構(gòu)建可擴展的交換機。事實證明,我們需要的就是Clos網(wǎng)絡(luò):
Clos 網(wǎng)絡(luò):
- 可以很好地擴展容量。
- 沒有單點故障。
- 支持足夠的冗余,具有抵御故障的能力。
- 通過在整個架構(gòu)上分配負載來處理突發(fā)擁塞。
同時實現(xiàn)輸入和輸出促進了折疊式 Clos 網(wǎng)絡(luò)的誕生,這就是我們今天在集群路由器中使用的網(wǎng)絡(luò)。
不過這種架構(gòu)也不是沒有問題的。隨之而來的芯片鎖定問題使得硬件升級更具挑戰(zhàn)性,新的cell交換機必須同時支持傳統(tǒng)鏈路和格式以實現(xiàn)互操作以及鏈路升級。
每個cell必須有一個地址,表明它應(yīng)該流向的輸出網(wǎng)卡。這種尋址必然是有限的,從而導(dǎo)致可擴展性的上限。到目前為止,集群的控制和管理完全是私有的,為軟件堆棧帶來了另一個供應(yīng)商鎖定的問題。
不過我們可以通過改變架構(gòu)來解決這些問題。在過去的 50 年里,我們一直在努力縱向擴展路由器的規(guī)模。我們從構(gòu)建大型云的經(jīng)驗中學(xué)到的是,橫向擴展的理念往往更成功。
在橫向擴展架構(gòu)中,與其嘗試構(gòu)建一個巨大的、速度極快的單個服務(wù)器,分而治之可能更為合適。裝滿小型服務(wù)器的機架可以完成同樣的工作,同時也更具彈性、靈活性和經(jīng)濟性。
當應(yīng)用到路由器時,思路是相似的。我們是否可以使用一些較小的路由器,并將它們安排在Clos拓撲中,這樣我們就有了類似的架構(gòu)優(yōu)勢,但又避免了上述問題?事實證明確實是這樣:
通過使用分組交換機(例如路由器)替換單元交換機并保留 Clos 拓撲,就可以確保其可擴展性。
我們可以在兩個維度上進行擴展:通過添加更多的入口路由器和分組交換機與現(xiàn)有層并行,或者增加額外的交換機層。由于現(xiàn)在各個路由器都相對通用,因此避免了供應(yīng)商鎖定。鏈路都是標準以太網(wǎng),互操作性上也沒有問題。
如果一個交換機需要更多鏈路,那么就換個更大的交換機。如果一個給定的鏈路需要升級并且鏈路的兩端都有擴展能力,那么只需升級光學(xué)器件即可。在結(jié)構(gòu)內(nèi)運行異構(gòu)鏈路速度不是問題,因為每個路由器都可以充當速度匹配設(shè)備。
這種架構(gòu)在數(shù)據(jù)中心領(lǐng)域中已經(jīng)很常見了,根據(jù)交換機的層數(shù),被稱為 leaf-spine或super-spine架構(gòu)。事實也證明,它非常健壯、穩(wěn)定和靈活的。
從轉(zhuǎn)發(fā)平面的角度來看,這是一個可行的替代架構(gòu),剩下的問題在于控制平面和管理平面。擴展控制平面需要在控制協(xié)議規(guī)模上有一個數(shù)量級的改進。另外,我們正在開發(fā)管理平面抽象,它使我們能夠?qū)⒄麄€ Clos 結(jié)構(gòu)作為單個路由器進行控制。這項工作是作為開放標準進行的,因此所涉及的技術(shù)都不是專有的。
在過去的 50 年里,隨著技術(shù)的不斷權(quán)衡,路由器架構(gòu)在斷斷續(xù)續(xù)的發(fā)展中也出現(xiàn)了許多失誤。顯然,進化尚未完成。在每次迭代中,都需要解決上一代的問題,同時又會發(fā)現(xiàn)一些新問題。
希望可以通過仔細總結(jié)過去和已有的經(jīng)驗,以更靈活和健壯的架構(gòu)前進!