胡 洋,唐乙雙,向 偉
(1.中國電子科技集團公司第三十研究所,四川 成都 610041;2.南部戰區海軍參謀部15 號,廣東 湛江 524001)
網絡設備的一個重要的特點是能夠長期、可靠的運行。分布交換機一般位于整個網絡的匯聚層或核心層,所以如何提高分布式交換機的高可靠性對于整個網絡至關重要。主控板作為分布交換機的關鍵核心部件,相比較雙機熱備技術而言,其熱備冗余技術具有數據實時性強、切換時間短用戶體驗感高的優點[1]。本文主要從主備選舉、主備切換、熱備同步通道、文件同步以及表項同步幾個方面展開分析,設計雙主控熱備冗余方案。
分布式交換機一般采用雙主控板板設計,即插入兩張主控板,一張角色為主(master),一張為備(standby)。作為主角色的主控板處于工作狀態,維護整個交換機的管理平面和控制平面。作為備角色的主控板處于待命狀態,不參與整個管理平臺和控制平面的維護。一旦主出現異常(軟件宕機、硬件IO 故障或掉電),備將在最短的時間內升級為主角色,接管異常的主的工作。
一般主備角色的選舉有幾種方式。
(1)上電時間先后順序。先上電者為主,后上電者為備。如何定義先后順序,可以做如下規定:如果兩者上電時間差在30 s 以內,可視為同時上電;如果上電時間差大于30 s,則先上電者為主,后上電者為備。
(2)版本號選舉。對于處于不同軟件版本號的主控板,若兩者同時上電,選取版本號更高的為主,版本號低的為備。
(3)槽位號選舉。每張主控板工作時候是插入機箱的某個固定槽位,分別對應與MPU-0 槽位和MPU-1 槽位。若兩者同時上電,可將MPU-0 作為主,MPU-1 作為備。
(4)系統mac 選舉。兩張主控板在出廠時候會預先設置一個系統mac,若兩者同時上電可將系統mac 值大的作為主,系統mac 值小的作為備[2]。
綜合考慮設計的復雜性,本文采用的主備選舉采用第1 種方式和第3 種方式。它的優先級為上電時間先后順序選舉高于槽位選舉。
主備角色選舉的流程如圖1 所示。

圖1 主備選舉流程
圖1 中,如何判斷主控板上電初始化完成的關鍵在于如下內容。
(1)Watchdog 進程加載順序位于所有進程加載順序的最后,Watchdog 進程通過周期型對與本板CPLD IO 相連的GPIO 管腳進行喂狗操作。復雜可編程邏輯器件(Complex Programmable Logic Device,CPLD)檢測到周期型的喂狗信號,認為軟件已經初始化完成。
(2)主備之間的CPLD 通過機框背板互發周期性的心跳信號收到對端的心跳信號,根據自己的槽位號選舉出主備角色,并將各自的主備角色寫入本板的CPLD 寄存器。
(3)CPLD 通過專用的IO 管腳產生GPIO 中斷給本板處理器,本板處理器在中斷服務程序中通過I2C 總線讀取本板CPLD 寄存器來獲取主備角色。
本文采用透明進程通信協議(Transparent Inter-Process Communication,TIPC)作為主備同步通道。原因有以下幾點。
(1)主備之間的物理通道可以多種多樣,但常用的還是以太網接口,軟件協議層面是基于以太網的協議。主備互聯的以太網接口為整機內部接口,一般不會選擇傳輸控制協議/網際協議(Transmission Control Protocol/Internet Protocol,TCP/IP)協議,因為TCP/IP 是基于IP 地址的通信,主控板一般會再提供一路網口作為整機的管理網口。如果內部接口也配置IP 地址,那么IP 地址可能會與管理口IP 地址沖突。
(2)TIPC 是進程間通信的一種協議,一般用于集群/分布式系統。它允許設計人員能夠創建可以和其他應用快速可靠地通信應用,無須考慮在其他需要通信的應用在集群環境中的IP 位置。使用TIPC,在創建socket 的時候在內核中注冊自己的服務類型/實例號,在發送端只需要指定服務類型/實例號就可以由內核路由到相應的socket。這時對應用層來講,對端地址僅僅是一個服務類型/實例號。顯然內核維護著這樣一張路由表,可以根據服務類型去找到對應的socket。每臺設備都有這樣的路由表,它們的信息能夠像普通路由表一樣共享到整個集群網絡中,所有設備都可以進行socket 查找。因此有了TIPC,無需關心socket 使用哪個IP 哪個端口,而這非常符合主備通信的特點。
(3)TIPC 網絡地址是和整個物理結點相關聯的,地址模式映射到邏輯網絡拓撲。<Z,C,N>方式重,Z(Zone,8 位),C(Cluster,12 位),N(Node,12 位),共32 位。一個網絡可包括255 個域(Zone),主備主控板各自對應一個網絡地址,可將Z、C設為同一個值,N值與對應的槽位號綁定,這樣每張主控板就對應一個唯一的可識別的網絡地址[3]。
(4)如圖2 所示,TIPC 將兩張主控板的進程統一到一個平面。對于開發者而言,不關心你的進程是在主或者備,每個進程只要分配一個唯一的實例號,與目的進程通信只要知道對方的實例號即可。

圖2 TIPC 統一平面
主備切換有兩種方式。
(1)手工切換。通過命令或插拔強制主下線。
(2)故障感知自動切換。當主發生軟硬件故障時,如核心軟件進程掛掉或操作系統內核宕機[4]。
如圖3 所示,主下線將導致主不能即使發送喂狗信號給本地CPLD,本地CPLD 將不再發送心跳給備CPLD,備CPLD 沒有收到主CPLD 周期性發送過來的心跳信號,便發送一個GPIO 中斷給備CPU,告訴備主控板需要將自己的角色升級為主。如果故障主控板恢復正常后,重新發送心跳信號給對端主控板,重新協商自己的角色。由于已經對方是主,便主控將自己的角色變為備,不會再次發生一次主備切換。

圖3 主備切換流程
主備之間需要文件的同步,如交換機的命令配置文件。每當配置更新后,命令配置文件將會更新,需要將更新后的配置文件實時同步到備,以保證主備切換后,備的配置為當前的最新配置。
本文采用Inotify+xfer 的方式設計文件同步。Inotify 是Linux 內核2.6.13 版本之后新增的一個子系統,提供了一種監控文件系統(基于inode)事件的機制,可以監控文件系統的變化,如文件修改、新增、刪除等,并可以將相應的事件通知給應用程序[5]。Inotify 既可以監控文件,也可以監控目錄。當監控目錄時,它可以同時監控目錄和目錄中的各子目錄及文件。此外,Inotify 使用文件描述符作為接口,因而可以使用通常的文件I/O 操作select、poll 和epoll 來監視文件系統的變化。
xfer 借鑒簡單文件傳送協議(Trivial File Transfer Protocol,TFTP)的方式進行,用TIPC 協議代替TCP/IP 協議。TFTP 分為客戶端和服務端。xfer 同樣分為客戶端和服務端。其中,主為客戶端,備為服務端。本文采用xfer 而不是TFTP,原因在于熱備之間的通道不能基于IP 地址,而是采用TIPC 的無IP 方式。Inotify 將文件變化信息通知xfer客戶端進程,xfer 客戶端進程將變化的文件推送給xfer 服務端。
設計xfer 需要注意以下幾點。
(1)如何設定目的地址?TFTP 傳輸文件需要設置對端的目的IP 地址,而xfer 是不能基于IP 的。由于每張主控板都有唯一的槽位號,可將槽位號定位自己的唯一地址,再調用TIPC 的套接字進行文件傳輸。
(2)主備誰作為客戶端,誰作為服務端?因為文件的變化在主,主知道何時需要文件推送,主具有文件傳輸的主動權。客戶端和服務端兩者之間,客戶端相比服務端具有更高的行為主動權。所以,將主設置為客戶端,備設置為服務端更合適。
如圖4 所示,先創建一個文件列表,將需要監控的文件放在文件列表,一旦被監控的文件內容更新,將觸發Inotify 進程獲取更新的文件名,同時啟動xfer 將更新后的文件通過TIPC 通道傳輸到備的某個文件路徑。

圖4 Inotify+xfer 進行文件同步
交換機有ARP 表、路由表、mac 表等各種表項,這些表為交換機2、3 層轉發的核心。主備表項的一致性是保證主備切換后業務快速恢復,甚至不丟包,是熱備冗余的核心。以mac 表項為例,mac 表項同步分為實時同步和批量同步兩種情況。
如圖5 所示,如果當前有兩張主控板,且主備協商已經完畢。當接收到的報文的轉發表項不存在與接口板的硬表,接口板的交換芯片會觸發mac 學習流程產生新的mac 表項,同時表項通過TIPC 套接字傳輸到主主控板產生對應的軟表項。由于備主控板在線,主學到的mac 軟表項通過TIPC 套接字同步到備主控板,在備上也產生同樣的一個軟表項。

圖5 主備實時mac 同步流程
如果當前只有一張主控板,后續再插入一張主控板,新插入的成員角色將被選舉成備。備由于剛上電不久,沒有任何mac 軟表項,那么需要主將當前的軟表項進行一次批量同步到備,才能保持主備之間的mac 表同步。
如圖6 所示,備在啟動過程中,會向主發送一個板上線請求信號。主收到該信號后,回復應答信號給備,備進入接收批量同步狀態,同時發送請求開始同步給主。主收到該信號后,便開始進行批量傳輸,其同步通道仍是TIPC 通道。

圖6 主備批量mac 同步流程
本文介紹了分布式交換機的主控板之間的熱備冗余技術,從主備選舉、主備切換,主備同步通道、文件同步以及表項同步幾個方面進行設計。實踐證明:本方案合理可靠運行,效果良好,可應用于高可靠的網絡環境。