linux+FBOSS
FBOSS負(fù)責(zé)管理交換機ASIC并提供更高級別的遠(yuǎn)程API,轉(zhuǎn)換為特定的ASIC SDK方法。外部處理的包括管理、控制,路由、配置和監(jiān)控流程。下圖說明了交換機中的FBOSS、其他軟件進(jìn)程和硬件組件。請注意,在我們的生產(chǎn)環(huán)境部署中,F(xiàn)BOSS與我們的服務(wù)器共享相同的Linux環(huán)境(例如,操作系統(tǒng)版本、打包系統(tǒng)),因此我們可以在服務(wù)器和交換機上使用相同的系統(tǒng)工具和庫。

FBOSS由多個互連組件組成,有這幾大類:交換機軟件開發(fā)工具包(SDK),HwSwitch,硬件抽象層,SwSwitch,狀態(tài)觀察器,本地配置生成器,Thrift管理接口和QSFP服務(wù)。 FBOSS代理是主進(jìn)程,運行著FBOSS大部分功能 。交換機SDK與FBOSS代理打包在一起并進(jìn)行編譯。SDK由外部的交換機ASIC供應(yīng)商提供。除QSFP服務(wù)之外的所有其他組件(作為其獨立進(jìn)程運行)駐留在FBOSS代理內(nèi)。

交換機SDK。交換機SDK是ASIC供應(yīng)商提供的軟件,它暴露出用于與底層ASIC功能交互的API。這些API包括ASIC初始化、安裝轉(zhuǎn)發(fā)表規(guī)則和監(jiān)聽事件處理程序。
HwSwitch。 HwSwitch代表交換機硬件的抽象。 HwSwitch的接口提供了用于配置交換機端口、向這些端口發(fā)送和接收數(shù)據(jù)包、以及為端口上的狀態(tài)更改和這些端口上發(fā)生的數(shù)據(jù)包輸入/輸出事件注冊回調(diào)的通用抽象。除了通用抽象之外,ASIC特定實現(xiàn)也被推送到硬件抽象層,允許與交換機硬件進(jìn)行交換機無關(guān)的交互。雖然不是一個完美的抽象,但FBOSS已被移植到兩個ASIC系列,并且正在進(jìn)行更多移植。
狀態(tài)觀察器(State Observers)。通過保持協(xié)議狀態(tài)變化,SwSwitch可以實現(xiàn)ARP,NDP,LACP和LLDP等底層控制協(xié)議。通過稱為狀態(tài)觀察(State Observation)的機制向協(xié)議通知狀態(tài)變化。具體而言,任何對象在初始化時都可以將自身注冊為狀態(tài)觀察者。通過這樣做,每個未來的狀態(tài)更改都會調(diào)用對象提供的回調(diào)?;卣{(diào)提供了對有問題的狀態(tài)更改、允許對象做出相應(yīng)的反應(yīng)。例如,NDP將自身注冊為狀態(tài)觀察器,以便它可以對端口更改事件做出反應(yīng)。通過這種方式,狀態(tài)觀察機制允許協(xié)議實現(xiàn)與關(guān)于狀態(tài)管理的問題分離。
Thrift管理接口。網(wǎng)絡(luò)的配置管理平面是與網(wǎng)絡(luò)分離的。每個FBOSS實例都包含一個本地控制平面,運行如BGP等協(xié)議,在微服務(wù)器上通過Thrift管理接口與集中式網(wǎng)絡(luò)管理系統(tǒng)進(jìn)行通信。FBOSS Thrift接口的完整開源規(guī)范可公開獲取的。鑒于可以修改接口以滿足我們的需求,Thrift為我們提供了一種簡單而靈活的方式來管理和操作網(wǎng)絡(luò),從而提高穩(wěn)定性和高可用性。
QSFP服務(wù)。 QSFP服務(wù)管理一組QSFP端口。 該服務(wù)檢測QSFP模塊的插入或移除、讀取QSFP產(chǎn)品信息(例如制造商)、控制QSFP硬件功能(即改變功率配置)、監(jiān)視QSFP模塊。FBOSS最初在FBOSS代理內(nèi)部擁有QSFP服務(wù)。 但是隨著該服務(wù)的不斷發(fā)展,我們必須重新啟動FBOSS代理和交換機來應(yīng)用更改。 因此,我們將QSFP服務(wù)分離為一個單獨的流程,以提高FBOSS的模塊性和可靠性。因此,F(xiàn)BOSS代理更可靠,因為QSFP服務(wù)中的任何重新啟動或錯誤都不會直接影響代理。但是由于QSFP服務(wù)是一個單獨的進(jìn)程,因此需要單獨的工具進(jìn)行打包、部署和監(jiān)控。 此外,現(xiàn)在需要在QSFP服務(wù)和FBOSS代理之間進(jìn)行精細(xì)的進(jìn)程同步。
狀態(tài)管理。FBOSS的軟件狀態(tài)管理機制專為高并發(fā)、快速讀取和簡單安全的更新而設(shè)計。狀態(tài)被建模為版本化的copy-on-write (寫時復(fù)制)樹。樹的根是主交換機狀態(tài)類,根的每個子節(jié)點代表交換機狀態(tài)的不同類別,例如端口或VLAN條目。當(dāng)樹的一個分支發(fā)生更新時,如果有必要,將會復(fù)制并更新分支中一直到根的每個節(jié)點。下圖說明了由VLAN ARP表條目更新調(diào)用的交換機狀態(tài)更新過程。我們可以看到只重建了從修改后的ARP表到根目錄的節(jié)點和鏈接。在創(chuàng)建新樹時,F(xiàn)BOSS代理仍然與先前的狀態(tài)交互,而不需要捕獲任何狀態(tài)上的鎖。一旦完成整個樹的copy-on-write過程,F(xiàn)BOSS將從新的交換機狀態(tài)進(jìn)行讀取。

硬件特定狀態(tài)。硬件狀態(tài)是保留在ASIC內(nèi)部的狀態(tài)。每當(dāng)需要在軟件中更新硬件狀態(tài)時,軟件必須調(diào)用交換機SDK以檢索新狀態(tài)。 FBOSS HwSwitch在硬件狀態(tài)的相應(yīng)部分上獲得讀鎖和寫鎖,直到更新完成?;阪i定的狀態(tài)更新的選擇可能因SDK實現(xiàn)而異。
部署。FBOSS不使用像Chef或Jenkins這樣的現(xiàn)有自動化軟件部署框架,而是使用自研的名為fbossdeploy的部署軟件。開發(fā)我們自己的部署軟件的主要原因之一是允許與現(xiàn)有外部監(jiān)視器進(jìn)行更緊密的反饋循環(huán)。我們有幾個現(xiàn)有的外部監(jiān)視器,可以持續(xù)檢查網(wǎng)絡(luò)的健康狀況。這些監(jiān)視器檢查鏈路故障、BGP收斂時間、網(wǎng)絡(luò)可達(dá)性等屬性。雖然為部署通用軟件而構(gòu)建的現(xiàn)有部署框架可以很好地防止軟件相關(guān)錯誤的傳播,例如死鎖或內(nèi)存泄漏,但它們不是為了檢測和防止整個網(wǎng)絡(luò)范圍的故障而構(gòu)建的,因為這些故障可能很難從單個節(jié)點檢測出來。因此,構(gòu)建fbossdeploy可以快速響應(yīng)部署期間可能發(fā)生的整個網(wǎng)絡(luò)范圍的故障,例如可達(dá)性故障。FBOSS部署過程(代號叫金絲雀)與其他持續(xù)部署過程非常相似,并分為三個不同的部分:持續(xù)部署、每日部署和分階段部署。這三個部分中的每一個都是為了可靠部署這個目的。我們目前是大體按月的部署周期,按月的部署周期包含“持續(xù)部署”、“每日部署”和“分階段部署”,以確保高度的運營穩(wěn)定性。
配置設(shè)計。網(wǎng)絡(luò)設(shè)備的配置在數(shù)據(jù)中心環(huán)境中高度標(biāo)準(zhǔn)化。給定一個特定拓?fù)洌總€設(shè)備都使用模板和自動生成的配置數(shù)據(jù)進(jìn)行自動配置。例如,交換機的IP地址配置由交換機的類型(例如,ToR或aggregation),還有集群中的交換機上游/下游鄰居確定。
配置生成和部署。配置數(shù)據(jù)由我們的網(wǎng)絡(luò)管理系統(tǒng)Robotron生成,并分發(fā)給每個交換機。然后,F(xiàn)BOSS代理中的本地配置生成器使用配置數(shù)據(jù)并創(chuàng)建活動配置文件。如果對數(shù)據(jù)文件進(jìn)行了任何修改,則會生成新的活動配置文件,并將舊配置存儲為分階段配置文件。這種配置過程有許多優(yōu)點。首先,它不允許多個實體并發(fā)修改配置,這避免了配置出現(xiàn)不一致。其次,它使配置可重現(xiàn)且確定,因為配置是版本化的,并且FBOSS代理總是在重新啟動時讀取最新配置。最后,它避免了人為配置錯誤。另一方面,我們的全自動配置系統(tǒng)也存在缺點 – 它缺乏功能強大的人機交互式CLI,使得手動調(diào)試錯誤變得困難;此外,不支持增量配置更改,這又使得每次配置更改都需要重新啟動FBOSS代理。
監(jiān)控和故障處理。傳統(tǒng)上,數(shù)據(jù)中心運營商使用標(biāo)準(zhǔn)化的網(wǎng)絡(luò)管理協(xié)議(如SNMP)從供應(yīng)商網(wǎng)絡(luò)設(shè)備收集交換機統(tǒng)計信息,例如CPU/內(nèi)存利用率、鏈路負(fù)載、數(shù)據(jù)包丟包情況和其他系統(tǒng)運行健康狀態(tài)。相比之下,F(xiàn)BOSS允許外部系統(tǒng)通過兩種不同的接口收集交換機統(tǒng)計信息:Thrift管理接口和Linux系統(tǒng)日志。 Thrift管理接口以Thrift模型中指定的形式提供查詢。該接口主要用于監(jiān)控交換機上層的使用情況和鏈路統(tǒng)計信息。鑒于FBOSS作為Linux進(jìn)程運行,我們也可以直接訪問交換機微服務(wù)器的系統(tǒng)日志。這些日志專門用于記錄事件類別和失敗事件。這允許管理系統(tǒng)監(jiān)視底層系統(tǒng)運行狀況和硬件故障。對于收集的統(tǒng)計數(shù)據(jù),我們的監(jiān)控系統(tǒng)FbFlow 根據(jù)數(shù)據(jù)類型將數(shù)據(jù)存儲到Scuba或Gorilla數(shù)據(jù)庫中。存儲數(shù)據(jù)后,我們的工程師可以在很長一段時間內(nèi)在高層次查詢和分析數(shù)據(jù)。監(jiān)控系統(tǒng)可以輕松獲得監(jiān)控數(shù)據(jù)。
ONIE+ONL+SAI+SONIC
SONiC由微軟提供,SONiC是構(gòu)建網(wǎng)絡(luò)設(shè)備(如交換機)所需功能的軟件集合。它可以通過交換機換抽象接口(SAI)運行在不同的ASIC平臺。正是由于SAI的存在,SONiC的的App(網(wǎng)絡(luò)功能)才能夠支持多個廠家的ASIC。SONiC的網(wǎng)絡(luò)應(yīng)用都是基于容器構(gòu)建的,可以非常方便的在生產(chǎn)環(huán)境實現(xiàn)不停機部署或升級應(yīng)用。需要注意的是,SAI沒有公開源代碼,ASIC廠家只提供二進(jìn)制格式的SAI文件。雖然SAI沒有開源,但是SAI向上給SONiC提供了一套統(tǒng)一的API 接口,向下則對接不同的ASIC。

SONiC得到了交換機芯片廠家、系統(tǒng)廠商、應(yīng)用等的廣泛支持。

SONiC和SAI支持的ASIC芯片廠商及其對應(yīng)產(chǎn)品為:

SONiC是構(gòu)建交換機網(wǎng)絡(luò)功能的軟件集合,需要運行在Base OS上。SONiC所使用的Base OS 是ONL (Open Network Linux ) 。ONL是一款為白盒交換機而設(shè)計的開源Linux操作系統(tǒng),ONL中包括了許多硬件(溫度傳感器、風(fēng)扇、電源、CPLD控制器等)的驅(qū)動程序。

SONiC支持非常完善的網(wǎng)絡(luò)協(xié)議,支持BGP、ECMP、QoS-ECN、PFC、WRED、CoS、SNMP、Syslog、LLDP、NTP、LAG,ACL、DHCP、IPv6等也馬上會支持……
