胡 洋,唐乙雙,向 偉
(1.中國(guó)電子科技集團(tuán)公司第三十研究所,四川 成都 610041;2.南部戰(zhàn)區(qū)海軍參謀部15 號(hào),廣東 湛江 524001)
網(wǎng)絡(luò)設(shè)備的一個(gè)重要的特點(diǎn)是能夠長(zhǎng)期、可靠的運(yùn)行。分布交換機(jī)一般位于整個(gè)網(wǎng)絡(luò)的匯聚層或核心層,所以如何提高分布式交換機(jī)的高可靠性對(duì)于整個(gè)網(wǎng)絡(luò)至關(guān)重要。主控板作為分布交換機(jī)的關(guān)鍵核心部件,相比較雙機(jī)熱備技術(shù)而言,其熱備冗余技術(shù)具有數(shù)據(jù)實(shí)時(shí)性強(qiáng)、切換時(shí)間短用戶(hù)體驗(yàn)感高的優(yōu)點(diǎn)[1]。本文主要從主備選舉、主備切換、熱備同步通道、文件同步以及表項(xiàng)同步幾個(gè)方面展開(kāi)分析,設(shè)計(jì)雙主控?zé)醾淙哂喾桨浮?/p>
分布式交換機(jī)一般采用雙主控板板設(shè)計(jì),即插入兩張主控板,一張角色為主(master),一張為備(standby)。作為主角色的主控板處于工作狀態(tài),維護(hù)整個(gè)交換機(jī)的管理平面和控制平面。作為備角色的主控板處于待命狀態(tài),不參與整個(gè)管理平臺(tái)和控制平面的維護(hù)。一旦主出現(xiàn)異常(軟件宕機(jī)、硬件IO 故障或掉電),備將在最短的時(shí)間內(nèi)升級(jí)為主角色,接管異常的主的工作。
一般主備角色的選舉有幾種方式。
(1)上電時(shí)間先后順序。先上電者為主,后上電者為備。如何定義先后順序,可以做如下規(guī)定:如果兩者上電時(shí)間差在30 s 以?xún)?nèi),可視為同時(shí)上電;如果上電時(shí)間差大于30 s,則先上電者為主,后上電者為備。
(2)版本號(hào)選舉。對(duì)于處于不同軟件版本號(hào)的主控板,若兩者同時(shí)上電,選取版本號(hào)更高的為主,版本號(hào)低的為備。
(3)槽位號(hào)選舉。每張主控板工作時(shí)候是插入機(jī)箱的某個(gè)固定槽位,分別對(duì)應(yīng)與MPU-0 槽位和MPU-1 槽位。若兩者同時(shí)上電,可將MPU-0 作為主,MPU-1 作為備。
(4)系統(tǒng)mac 選舉。兩張主控板在出廠時(shí)候會(huì)預(yù)先設(shè)置一個(gè)系統(tǒng)mac,若兩者同時(shí)上電可將系統(tǒng)mac 值大的作為主,系統(tǒng)mac 值小的作為備[2]。
綜合考慮設(shè)計(jì)的復(fù)雜性,本文采用的主備選舉采用第1 種方式和第3 種方式。它的優(yōu)先級(jí)為上電時(shí)間先后順序選舉高于槽位選舉。
主備角色選舉的流程如圖1 所示。
圖1 主備選舉流程
圖1 中,如何判斷主控板上電初始化完成的關(guān)鍵在于如下內(nèi)容。
(1)Watchdog 進(jìn)程加載順序位于所有進(jìn)程加載順序的最后,Watchdog 進(jìn)程通過(guò)周期型對(duì)與本板CPLD IO 相連的GPIO 管腳進(jìn)行喂狗操作。復(fù)雜可編程邏輯器件(Complex Programmable Logic Device,CPLD)檢測(cè)到周期型的喂狗信號(hào),認(rèn)為軟件已經(jīng)初始化完成。
(2)主備之間的CPLD 通過(guò)機(jī)框背板互發(fā)周期性的心跳信號(hào)收到對(duì)端的心跳信號(hào),根據(jù)自己的槽位號(hào)選舉出主備角色,并將各自的主備角色寫(xiě)入本板的CPLD 寄存器。
(3)CPLD 通過(guò)專(zhuān)用的IO 管腳產(chǎn)生GPIO 中斷給本板處理器,本板處理器在中斷服務(wù)程序中通過(guò)I2C 總線讀取本板CPLD 寄存器來(lái)獲取主備角色。
本文采用透明進(jìn)程通信協(xié)議(Transparent Inter-Process Communication,TIPC)作為主備同步通道。原因有以下幾點(diǎn)。
(1)主備之間的物理通道可以多種多樣,但常用的還是以太網(wǎng)接口,軟件協(xié)議層面是基于以太網(wǎng)的協(xié)議。主備互聯(lián)的以太網(wǎng)接口為整機(jī)內(nèi)部接口,一般不會(huì)選擇傳輸控制協(xié)議/網(wǎng)際協(xié)議(Transmission Control Protocol/Internet Protocol,TCP/IP)協(xié)議,因?yàn)門(mén)CP/IP 是基于IP 地址的通信,主控板一般會(huì)再提供一路網(wǎng)口作為整機(jī)的管理網(wǎng)口。如果內(nèi)部接口也配置IP 地址,那么IP 地址可能會(huì)與管理口IP 地址沖突。
(2)TIPC 是進(jìn)程間通信的一種協(xié)議,一般用于集群/分布式系統(tǒng)。它允許設(shè)計(jì)人員能夠創(chuàng)建可以和其他應(yīng)用快速可靠地通信應(yīng)用,無(wú)須考慮在其他需要通信的應(yīng)用在集群環(huán)境中的IP 位置。使用TIPC,在創(chuàng)建socket 的時(shí)候在內(nèi)核中注冊(cè)自己的服務(wù)類(lèi)型/實(shí)例號(hào),在發(fā)送端只需要指定服務(wù)類(lèi)型/實(shí)例號(hào)就可以由內(nèi)核路由到相應(yīng)的socket。這時(shí)對(duì)應(yīng)用層來(lái)講,對(duì)端地址僅僅是一個(gè)服務(wù)類(lèi)型/實(shí)例號(hào)。顯然內(nèi)核維護(hù)著這樣一張路由表,可以根據(jù)服務(wù)類(lèi)型去找到對(duì)應(yīng)的socket。每臺(tái)設(shè)備都有這樣的路由表,它們的信息能夠像普通路由表一樣共享到整個(gè)集群網(wǎng)絡(luò)中,所有設(shè)備都可以進(jìn)行socket 查找。因此有了TIPC,無(wú)需關(guān)心socket 使用哪個(gè)IP 哪個(gè)端口,而這非常符合主備通信的特點(diǎn)。
(3)TIPC 網(wǎng)絡(luò)地址是和整個(gè)物理結(jié)點(diǎn)相關(guān)聯(lián)的,地址模式映射到邏輯網(wǎng)絡(luò)拓?fù)?。<Z,C,N>方式重,Z(Zone,8 位),C(Cluster,12 位),N(Node,12 位),共32 位。一個(gè)網(wǎng)絡(luò)可包括255 個(gè)域(Zone),主備主控板各自對(duì)應(yīng)一個(gè)網(wǎng)絡(luò)地址,可將Z、C設(shè)為同一個(gè)值,N值與對(duì)應(yīng)的槽位號(hào)綁定,這樣每張主控板就對(duì)應(yīng)一個(gè)唯一的可識(shí)別的網(wǎng)絡(luò)地址[3]。
(4)如圖2 所示,TIPC 將兩張主控板的進(jìn)程統(tǒng)一到一個(gè)平面。對(duì)于開(kāi)發(fā)者而言,不關(guān)心你的進(jìn)程是在主或者備,每個(gè)進(jìn)程只要分配一個(gè)唯一的實(shí)例號(hào),與目的進(jìn)程通信只要知道對(duì)方的實(shí)例號(hào)即可。
圖2 TIPC 統(tǒng)一平面
主備切換有兩種方式。
(1)手工切換。通過(guò)命令或插拔強(qiáng)制主下線。
(2)故障感知自動(dòng)切換。當(dāng)主發(fā)生軟硬件故障時(shí),如核心軟件進(jìn)程掛掉或操作系統(tǒng)內(nèi)核宕機(jī)[4]。
如圖3 所示,主下線將導(dǎo)致主不能即使發(fā)送喂狗信號(hào)給本地CPLD,本地CPLD 將不再發(fā)送心跳給備CPLD,備CPLD 沒(méi)有收到主CPLD 周期性發(fā)送過(guò)來(lái)的心跳信號(hào),便發(fā)送一個(gè)GPIO 中斷給備CPU,告訴備主控板需要將自己的角色升級(jí)為主。如果故障主控板恢復(fù)正常后,重新發(fā)送心跳信號(hào)給對(duì)端主控板,重新協(xié)商自己的角色。由于已經(jīng)對(duì)方是主,便主控將自己的角色變?yōu)閭洌粫?huì)再次發(fā)生一次主備切換。
圖3 主備切換流程
主備之間需要文件的同步,如交換機(jī)的命令配置文件。每當(dāng)配置更新后,命令配置文件將會(huì)更新,需要將更新后的配置文件實(shí)時(shí)同步到備,以保證主備切換后,備的配置為當(dāng)前的最新配置。
本文采用Inotify+xfer 的方式設(shè)計(jì)文件同步。Inotify 是Linux 內(nèi)核2.6.13 版本之后新增的一個(gè)子系統(tǒng),提供了一種監(jiān)控文件系統(tǒng)(基于inode)事件的機(jī)制,可以監(jiān)控文件系統(tǒng)的變化,如文件修改、新增、刪除等,并可以將相應(yīng)的事件通知給應(yīng)用程序[5]。Inotify 既可以監(jiān)控文件,也可以監(jiān)控目錄。當(dāng)監(jiān)控目錄時(shí),它可以同時(shí)監(jiān)控目錄和目錄中的各子目錄及文件。此外,Inotify 使用文件描述符作為接口,因而可以使用通常的文件I/O 操作select、poll 和epoll 來(lái)監(jiān)視文件系統(tǒng)的變化。
xfer 借鑒簡(jiǎn)單文件傳送協(xié)議(Trivial File Transfer Protocol,TFTP)的方式進(jìn)行,用TIPC 協(xié)議代替TCP/IP 協(xié)議。TFTP 分為客戶(hù)端和服務(wù)端。xfer 同樣分為客戶(hù)端和服務(wù)端。其中,主為客戶(hù)端,備為服務(wù)端。本文采用xfer 而不是TFTP,原因在于熱備之間的通道不能基于IP 地址,而是采用TIPC 的無(wú)IP 方式。Inotify 將文件變化信息通知xfer客戶(hù)端進(jìn)程,xfer 客戶(hù)端進(jìn)程將變化的文件推送給xfer 服務(wù)端。
設(shè)計(jì)xfer 需要注意以下幾點(diǎn)。
(1)如何設(shè)定目的地址?TFTP 傳輸文件需要設(shè)置對(duì)端的目的IP 地址,而xfer 是不能基于IP 的。由于每張主控板都有唯一的槽位號(hào),可將槽位號(hào)定位自己的唯一地址,再調(diào)用TIPC 的套接字進(jìn)行文件傳輸。
(2)主備誰(shuí)作為客戶(hù)端,誰(shuí)作為服務(wù)端?因?yàn)槲募淖兓谥?,主知道何時(shí)需要文件推送,主具有文件傳輸?shù)闹鲃?dòng)權(quán)??蛻?hù)端和服務(wù)端兩者之間,客戶(hù)端相比服務(wù)端具有更高的行為主動(dòng)權(quán)。所以,將主設(shè)置為客戶(hù)端,備設(shè)置為服務(wù)端更合適。
如圖4 所示,先創(chuàng)建一個(gè)文件列表,將需要監(jiān)控的文件放在文件列表,一旦被監(jiān)控的文件內(nèi)容更新,將觸發(fā)Inotify 進(jìn)程獲取更新的文件名,同時(shí)啟動(dòng)xfer 將更新后的文件通過(guò)TIPC 通道傳輸?shù)絺涞哪硞€(gè)文件路徑。
圖4 Inotify+xfer 進(jìn)行文件同步
交換機(jī)有ARP 表、路由表、mac 表等各種表項(xiàng),這些表為交換機(jī)2、3 層轉(zhuǎn)發(fā)的核心。主備表項(xiàng)的一致性是保證主備切換后業(yè)務(wù)快速恢復(fù),甚至不丟包,是熱備冗余的核心。以mac 表項(xiàng)為例,mac 表項(xiàng)同步分為實(shí)時(shí)同步和批量同步兩種情況。
如圖5 所示,如果當(dāng)前有兩張主控板,且主備協(xié)商已經(jīng)完畢。當(dāng)接收到的報(bào)文的轉(zhuǎn)發(fā)表項(xiàng)不存在與接口板的硬表,接口板的交換芯片會(huì)觸發(fā)mac 學(xué)習(xí)流程產(chǎn)生新的mac 表項(xiàng),同時(shí)表項(xiàng)通過(guò)TIPC 套接字傳輸?shù)街髦骺匕瀹a(chǎn)生對(duì)應(yīng)的軟表項(xiàng)。由于備主控板在線,主學(xué)到的mac 軟表項(xiàng)通過(guò)TIPC 套接字同步到備主控板,在備上也產(chǎn)生同樣的一個(gè)軟表項(xiàng)。
圖5 主備實(shí)時(shí)mac 同步流程
如果當(dāng)前只有一張主控板,后續(xù)再插入一張主控板,新插入的成員角色將被選舉成備。備由于剛上電不久,沒(méi)有任何mac 軟表項(xiàng),那么需要主將當(dāng)前的軟表項(xiàng)進(jìn)行一次批量同步到備,才能保持主備之間的mac 表同步。
如圖6 所示,備在啟動(dòng)過(guò)程中,會(huì)向主發(fā)送一個(gè)板上線請(qǐng)求信號(hào)。主收到該信號(hào)后,回復(fù)應(yīng)答信號(hào)給備,備進(jìn)入接收批量同步狀態(tài),同時(shí)發(fā)送請(qǐng)求開(kāi)始同步給主。主收到該信號(hào)后,便開(kāi)始進(jìn)行批量傳輸,其同步通道仍是TIPC 通道。
圖6 主備批量mac 同步流程
本文介紹了分布式交換機(jī)的主控板之間的熱備冗余技術(shù),從主備選舉、主備切換,主備同步通道、文件同步以及表項(xiàng)同步幾個(gè)方面進(jìn)行設(shè)計(jì)。實(shí)踐證明:本方案合理可靠運(yùn)行,效果良好,可應(yīng)用于高可靠的網(wǎng)絡(luò)環(huán)境。