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

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

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

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

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

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

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

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