軟體架構的可靠性設計
2023-07-04 14:23:43
在網絡設備軟體功能越來越複雜的今天,軟體架構的可靠性佔有非常重要的地位。沒有一個可靠的軟體架構,設備的可靠性將無從談起。本文以H3CComware V7軟體平臺為例,介紹其採用的軟體架構可靠性設計方法。
故障隔離和自愈
軟體和Bug是一對伴生的兄弟。在一個龐大的軟體系統中,即使是經驗再豐富的程式設計師也無法保證沒有任何Bug。硬體設備工作再穩定,如果不幸遇到軟體Bug,也會引起異常,設備將無法正常工作。因此,故障隔離和自愈是軟體設計中必須要考慮的問題。
故障隔離
故障隔離指在軟體發生故障的時候,把故障造成的危害限制在最小範圍內。為了達到此目標,Comware V7系統採用了Linux作業系統架構,絕大部分程序都是用戶態程序。在Linux系統中,每個用戶態程序擁有獨立的進程空間,這樣,一旦某個程序崩潰,並不會對其他的程序產生影響。我們稱這種進程空間獨立的架構設計為真正的模塊化設計。
舉例來說,路由協議中,OSPF是一個獨立的用戶態程序,IS-IS也是一個獨立的用戶態程序。運行期間,在某個極其特殊的情況下,OSPF走入某個代碼異常分支處理流程,而在這裡有一個Bug,運行到這就會引起整個OSPF進程崩潰。但IS-IS作為一個獨立的路由協議,擁有獨立的進程空間,它的運行不受任何影響,還可以正常運行。
故障自愈
故障自愈是讓系統從故障中恢復到正常的工作狀態。想要做到自愈,首先要發現錯誤。Comware V7系統有一套完整的進程運行狀態監控機制,可以及時發現某個用戶態程序「異常」。其基本工作原理如下
1. 所有的用戶態程序都是系統初始化進程SCM(Service Control Manager)的子進程,SCM可以感知所有子進程的狀態,一旦發現某個用戶態程序崩潰,會主動回收它的資源,然後重新啟動一個相同的用戶態程序,接替崩潰的程序繼續工作。
2. 有時一個用戶態程序出了問題,無法正常工作,但還沒有達到崩潰的地步,這時Comware系統中另外一套主動檢測機制則起作用,過程如圖1所示。
圖1 進程故障發現與自愈過程
這個特殊的監控程序——Monitor,會周期性的檢查各個用戶態程序,主動向其他的用戶態程序發送查詢消息。其他的用戶態程序在收到Monitor發來的這個消息後,會進行自檢,並將自身的情況回應給Monitor,Monitor根據回復的消息得知某個用戶態程序異常。在更為嚴重的異常情況下,用戶態程序無法處理Monitor發來的消息,無法應答,Monitor在一段時間內沒有收到應答,則判斷這個用戶態程序「異常」。
一旦監控進程發現某個用戶態程序異常,就會通知SCM,SCM重複步驟一:回收它的資源,然後重新啟動一個相同的用戶態程序,接替崩潰的程序繼續工作。
以上是對故障隔離與自愈機制的簡單描述,Comware V7實際的工作方式要複雜的多。因為作為一個通信系統,各個獨立的用戶態程序之間並不是真正完全「孤立」的,它們之間會進行各種通信,協作完成網絡設備的各種功能。所以,想要讓重新運行的用戶態程序真正的正常工作,還需要記錄大量的程序正常工作時的狀態信息,以便在重啟以後,使其恢復到故障之前的正常狀態。
同時,Comware V7擁有EEM(Embedded Event Manager)系統,系統管理員可以編寫腳本,在異常發生時通過EEM觸發這個腳本。這樣,除上述所提到的中止異常程序重新運行的動作外,還能夠按照腳本做更為複雜的動作,進行異常的遠程上報、進一步的異常診斷分析,或者其他任何可以通過腳本觸發的動作。這樣,軟體系統的可維護性也大大提升。
進程級備份
故障隔離與自愈功能,僅僅是單硬體系統上的行為。單硬體系統是指只有一個硬體主板的集中式系統(大部分盒式產品都屬於這種情況),或者是分布式設備上的IO板,沒有另外一塊單板作為備份(如分布式設備的大部分接口板、業務板)。
在硬體有冗餘備份的情況下,則需要進程級備份功能,也稱為進程級HA。所謂進程級備份,是相對於單板級HA而言的,主要是指參與備份和倒換的實體不再是整個單板,而是單板上的一個個用戶態進程。具體過程如圖2所示。
圖2 進程級HA倒換過程示意
在主板Master和備板Slave上都有相同的用戶態程序OSPF在運行,一個工作在「主」狀態,一個工作在「備」狀態。初始化時,OSPF的「主」進程運行在Master Board上,「備」進程運行在Slave Board上。一旦「主」狀態的程序異常,Master Board上的Monitor發現以後,就會通知本板的HA,同時也通知本板SCM。SCM關閉本端的異常程序,再重新啟動,並使其工作在「備」狀態;而HA接到通知後,就會通知Slave Board上的HA,Slave Board上的HA在通知本板的OSPF進程由「備」升級為「主」。
可見,進程級HA是在自愈機制的基礎上,增加了進程級的主備倒換。那麼它能帶來哪些額外的好處呢?
自愈過程中,系統會中止「舊」程序、重啟「新」程序,而新程序從啟動到正常工作需要一段時間,在某些情況下可能會很長。在這段時間內,由於程序還不能夠正常工作,無法完成同外界設備的交互,會引起網絡上的振蕩,造成流量中斷。而進程級HA,工作在「備」狀態的程序「時刻準備著」接替「主」用程序,一旦發現異常,立即切換工作狀態,可以大大縮短切換時間,讓外界幾乎感覺不到設備曾經「切換過」。
進程級HA的另一個特點是可以通過人為控制,讓一部分程序的「主」進程工作在Master Board上,另一部分程序的「主」進程工作在Slave Board上,這樣就可以達到負載分擔的效果,避免所有的「主」進程都工作在Master上,減輕Master的壓力。
當然,進程級HA需要硬體支持冗餘備份,因此適用於堆疊產品,或者分布式產品的主控板,分布式產品的接口板或其他集中式產品都不具備這樣的硬體條件,因此還要依靠自愈來提升可靠性。
上述兩種設計方法配合使用,極大的提升了Comware V7系統的可靠性,並使得Comware V7系統的可靠性設計變得非常富有「彈性」,可以適應各種不同產品形態的需要。
結束語
本文介紹了比較直接的提升軟體可靠性的機制和方法。實際上,在軟體整體架構中,還有其他的提升可靠性的設計原則和方法,目標是設計出真正的高內聚低耦合的軟體系統,減少在維護和功能擴展過程中,軟體開發人員「犯錯誤」的機會。總之,良好的軟體架構是軟體可靠性的基礎,是設備可靠性的最重要的保障。
Comware V7是H3C下一代的網絡產品軟體平臺。Comware V7系統構建在Linux體系架構之上,對其中網絡協議、通訊接口、分布式和高可靠性的方面進行了徹底的改造和擴展,以適應網絡設備的需要。ComwareV7的絕大部分程序都運行在用戶態,是真正的模塊化系統,最大程度的提升了軟體系統整體的可靠性。同時,它支持多線程並發和搶佔,支持SMP對稱多處理,支持64位CPU,支持設備虛擬化,支持進程級備份以及完整的ISSU。