陳雷 樊野
中國(guó)移動(dòng)通信集團(tuán)江蘇有限公司
在通訊領(lǐng)域中,核心網(wǎng)側(cè)的網(wǎng)元節(jié)點(diǎn)之間的信息傳送需要極高的效率和可用性,系統(tǒng)可用性目標(biāo)MTBF/(MTBF+MTTR)往往要達(dá)到5個(gè)9,也就是99.999%,比多數(shù)互聯(lián)網(wǎng)企業(yè)的99.99%目標(biāo)要高一個(gè)數(shù)量級(jí)。而電信節(jié)點(diǎn)間傳遞的消息,往往因?yàn)槭聞?wù)性場(chǎng)景不同,需要既能支持同步消息,也要支持異步消息,甚至是混合支持。同步消息場(chǎng)景下,要能夠保障消息串行執(zhí)行,確保時(shí)序性、事務(wù)性;異步消息場(chǎng)景下,需要充分利用帶寬和資源,實(shí)現(xiàn)高并發(fā)的消息投遞及高效的并行處理,在有限的資源下完成最多的業(yè)務(wù)服務(wù)。
本文討論的是通過在業(yè)務(wù)系統(tǒng)中,構(gòu)造最小化信息核單元,依靠一二級(jí)緩存和索引定位機(jī)制,實(shí)現(xiàn)高效的串并行結(jié)合的消息處理方式,實(shí)現(xiàn)高達(dá)970CPS/秒的信息投遞。同時(shí),通過同步核單元方式,以軟方式實(shí)現(xiàn)應(yīng)用級(jí)雙機(jī)熱備。在故障切換時(shí),可在0.7秒內(nèi)完成切換和業(yè)務(wù)恢復(fù),恢復(fù)業(yè)務(wù)可從中斷處接續(xù)執(zhí)行,兼顧業(yè)務(wù)完整性和效率,實(shí)現(xiàn)電信級(jí)高可用。
本實(shí)踐的更大優(yōu)勢(shì)是完全使用軟方式實(shí)現(xiàn)以上能力,不依賴其他商用雙機(jī)軟件以及輔助保活設(shè)備,具備管理虛擬IP能力的服務(wù)器均可進(jìn)行部署和應(yīng)用,從而大幅降低企業(yè)成本。
以當(dāng)前江蘇南京5G指令開通的業(yè)務(wù)受理場(chǎng)景為例。正常情況下,業(yè)務(wù)支撐系統(tǒng)每秒需發(fā)送近113條同異步指令到達(dá)核心網(wǎng)網(wǎng)元側(cè),進(jìn)行相關(guān)業(yè)務(wù)功能啟效或停用。目前這些指令來自于BOSS系統(tǒng)或其他渠道的CRM系統(tǒng),指令以文本方式存儲(chǔ)在指令文件中,傳遞至網(wǎng)關(guān)并由信令接口機(jī)解析發(fā)送至核心網(wǎng)網(wǎng)元側(cè),同時(shí)將網(wǎng)元側(cè)的回應(yīng)消息記錄在回應(yīng)結(jié)果文件中作為業(yè)務(wù)日志進(jìn)行保存。指令及相關(guān)文件示意如圖1所示。

圖1 指令文件示意圖
指令文件在解析處理時(shí),需要判斷每條指令的歸屬終端用戶,若屬于一個(gè)終端用戶的指令集,需要按順序處理和投遞,保障業(yè)務(wù)時(shí)序性,且在得到核心網(wǎng)網(wǎng)元的應(yīng)答消息后才能繼續(xù)處理和發(fā)送下一指令。而對(duì)于不同終端用戶的指令,則需要充分利用帶寬,高并發(fā)地并行投遞,以避免產(chǎn)生指令積壓,導(dǎo)致業(yè)務(wù)受阻。與核心網(wǎng)網(wǎng)元交互的示意圖如圖2所示。

圖2 與核心網(wǎng)網(wǎng)元交互示意圖
該場(chǎng)景需要做到7×24小時(shí)不間斷運(yùn)行,而做到完全不間斷運(yùn)行非常困難。出于對(duì)應(yīng)用系統(tǒng)穩(wěn)定、可靠、有效、持續(xù)運(yùn)行、災(zāi)備等要求,一般都會(huì)部署2個(gè)或以上的應(yīng)用節(jié)點(diǎn)。一個(gè)是主用節(jié)點(diǎn),用于業(yè)務(wù)處理;一個(gè)是備用節(jié)點(diǎn),作為主節(jié)點(diǎn)的備份,在主節(jié)點(diǎn)故障時(shí),備用節(jié)點(diǎn)會(huì)接管主用節(jié)點(diǎn)進(jìn)行業(yè)務(wù)處理。在采用傳統(tǒng)雙機(jī)HA軟件的房中,備用節(jié)點(diǎn)應(yīng)用在切換時(shí)需要完成啟動(dòng)、初始化、狀態(tài)同步后才能進(jìn)入工作態(tài),實(shí)現(xiàn)任務(wù)接續(xù)執(zhí)行,而這一過程一般都需要十幾秒以上才能完成,無法滿足業(yè)務(wù)場(chǎng)景需要,因此需要能夠保證秒級(jí)切換并接續(xù)執(zhí)行。
基于高可用和效率等方面的綜合考慮,本實(shí)踐采用應(yīng)用級(jí)雙機(jī)熱備方式進(jìn)行業(yè)務(wù)支撐。主用節(jié)點(diǎn)和備用節(jié)點(diǎn)的應(yīng)用系統(tǒng)都啟動(dòng)并運(yùn)行于工作態(tài),實(shí)時(shí)同步主備間的任務(wù)執(zhí)行和狀態(tài)信息,以及偵活探測(cè),確保主用節(jié)點(diǎn)故障時(shí),備用節(jié)點(diǎn)能瞬時(shí)進(jìn)行接管,接續(xù)任務(wù)執(zhí)行。
為能高效在主備節(jié)點(diǎn)之間信息同步,在應(yīng)用的運(yùn)行內(nèi)存中構(gòu)建包含所有控制信息和狀態(tài)的最小化“核”控制單元,保存自身及執(zhí)行任務(wù)的各方面狀態(tài)與進(jìn)展數(shù)據(jù)。同時(shí)通過一二緩沖機(jī)制以及寄存單元,實(shí)現(xiàn)串并行兼容的處理方式,利用資源開銷最小的TCP/IP消息方式進(jìn)行主備通訊,實(shí)現(xiàn)主備信息同步。
為縮小“核”單元大小,采用了索引標(biāo)記方式進(jìn)行狀態(tài)保存和更新,不保存具體指令,這樣“核”單元可縮小至940字節(jié),可保存在一個(gè)TCP/IP消息包中,一個(gè)信息交互即可完成全部信息同步。建立并維護(hù)主備間一致的運(yùn)行“快照”,當(dāng)切換時(shí),備用節(jié)點(diǎn)均可以此來恢復(fù)任務(wù)的執(zhí)行狀態(tài),進(jìn)行接續(xù)執(zhí)行。
核單元位于應(yīng)用的運(yùn)行內(nèi)存中,由控制單元、寄存器、一級(jí)緩存組成。一級(jí)緩存由多個(gè)指針操控的雙向隊(duì)列組成,完成對(duì)不同終端用戶數(shù)據(jù)的組織和排序,在特定的定時(shí)器消息觸發(fā)下進(jìn)行協(xié)調(diào)執(zhí)行。
指令組織過程是通過解析用戶指令信息,對(duì)其中的用戶標(biāo)識(shí)使用HASH算法計(jì)算其唯一Key值,保存在寄存器中,同時(shí)也在寄存器中完成過濾和排重,并以寄存器下標(biāo)作為索引,在一級(jí)緩存中建立多用戶的消息發(fā)送隊(duì)列。實(shí)現(xiàn)一個(gè)用戶指令保存在同一隊(duì)列中,不同用戶指令保存在不同隊(duì)列中,以實(shí)現(xiàn)單用戶指令串行執(zhí)行,多用戶指令并行執(zhí)行的串并行結(jié)合執(zhí)行方式。核單元整體架構(gòu)模式如圖3所示。

圖3 核單元內(nèi)部結(jié)構(gòu)圖
指令文件和二級(jí)緩存保存在“核”單元外部,在“控制單元”的統(tǒng)一控制下,批量將文件中指定塊大小的記錄一次讀至內(nèi)存緩沖區(qū)中,經(jīng)解析、格式化后形成待處理的指令消息,插入二級(jí)緩存中,相關(guān)批指令文件訪問偏移保存在“控制單元”中,完成指令集的第一次緩存。
而后,依次從二級(jí)緩存中指令記錄,通過HASH算法得到用戶標(biāo)識(shí)Key值,存儲(chǔ)在寄存器中,并進(jìn)行過濾和重排。一級(jí)緩存單元下標(biāo)以Key值所處寄存器單元序號(hào)為標(biāo)識(shí)索引,依次將二級(jí)緩存中的指令地址下標(biāo),保存在一級(jí)緩存的雙向消息隊(duì)列中。在此過程中會(huì)有兩種場(chǎng)景,一種是屬于某一用戶終端指令集,即通過HASH計(jì)算的Key值相同,此場(chǎng)景會(huì)插入到一級(jí)緩存的同一隊(duì)列中。另一種場(chǎng)景是不同用戶指令,此時(shí)會(huì)插入另外一個(gè)雙向消息隊(duì)列中,直至一級(jí)緩存數(shù)據(jù)滿無法再插入。
通過上述過程完成了指令的組織和存儲(chǔ),當(dāng)特定的定時(shí)器消息到達(dá)后,應(yīng)用會(huì)掃描一級(jí)緩存各個(gè)隊(duì)列,找到待執(zhí)行的隊(duì)列單元,根據(jù)單元中保存的下標(biāo)信息,將二級(jí)緩存中對(duì)應(yīng)的指令消息發(fā)送至核心網(wǎng)元,然后置該隊(duì)列為等待回應(yīng)狀態(tài),然后繼續(xù)掃描下一隊(duì)列繼續(xù)處理。
當(dāng)核心網(wǎng)元返回一條用戶指令的回應(yīng)消息到達(dá)時(shí),找到對(duì)應(yīng)的一級(jí)緩存隊(duì)列單元,并釋放該單元,通過指針指向下一待執(zhí)行單元。如該隊(duì)列全部單元均已經(jīng)執(zhí)行完畢,則清除相應(yīng)一級(jí)緩存、寄存器、控制單元中對(duì)應(yīng)的數(shù)據(jù),繼續(xù)加載二級(jí)緩存中的指令數(shù)據(jù)。
以上這些處理均是在不同定時(shí)器下協(xié)同下完成,該方式既完成了多指令并行處理和單用戶指令的串行執(zhí)行,又保證了核單元中的控制單元+寄存器+一級(jí)緩存最小(約940字節(jié)),但卻能保存整個(gè)應(yīng)用的各種狀態(tài)以及指令處理任務(wù)進(jìn)展信息。對(duì)核單元的每一次數(shù)據(jù)變更,均可通過一個(gè)TCP/IP消息同步
至備用節(jié)點(diǎn),確保主備狀態(tài)一致。
主備節(jié)點(diǎn)運(yùn)行相同的應(yīng)用程序,并都處于運(yùn)行態(tài),主用節(jié)點(diǎn)運(yùn)行于工作運(yùn)行態(tài),備用節(jié)點(diǎn)運(yùn)行于工作備用態(tài),相互之間通過特定的心跳消息,偵測(cè)對(duì)方存活狀態(tài)。當(dāng)主用節(jié)點(diǎn)因故障引起切換,或是心跳消息久無回應(yīng)時(shí),則開始切換,備用節(jié)點(diǎn)由工作備用態(tài)轉(zhuǎn)為工作運(yùn)行態(tài),通過同步的核單元信息恢復(fù)主用節(jié)點(diǎn)各狀態(tài),即時(shí)接管主用節(jié)點(diǎn)應(yīng)用。
具體過程為:備用節(jié)點(diǎn)依靠上次同步的核單元信息,加載共享磁陣上指定的指令文件,根據(jù)保存的偏移信息,重新構(gòu)造二級(jí)緩存,并根據(jù)當(dāng)前核單元中的一級(jí)緩存、控制單元、寄存器記錄,進(jìn)行任務(wù)接續(xù)執(zhí)行。主備節(jié)點(diǎn)架構(gòu)以及各資源示意圖如圖4所示。

圖4 主備節(jié)點(diǎn)以及各資源架構(gòu)示意圖
本實(shí)踐由C語言實(shí)現(xiàn),擁有較高的執(zhí)行效率。同時(shí)通過最小化“核”控制單元,依靠一二級(jí)緩存,結(jié)合共享內(nèi)存和雙向隊(duì)列,實(shí)現(xiàn)串并行結(jié)合的執(zhí)行方式。以周期定時(shí)器消息和核心網(wǎng)網(wǎng)元的應(yīng)答消息為觸發(fā)條件,統(tǒng)一進(jìn)行消息組織、狀態(tài)維護(hù)、指令執(zhí)行,保障數(shù)據(jù)一致性和事務(wù)性的同時(shí),又通過一個(gè)TCP/IP報(bào)文完成主備之間的狀態(tài)、信息同步,實(shí)現(xiàn)了系統(tǒng)的高可靠性。
經(jīng)實(shí)際驗(yàn)證,性能高達(dá)970CPS/秒,實(shí)現(xiàn)每秒近65MB指令消息發(fā)送至核心網(wǎng)網(wǎng)元側(cè)。故障切換可在0.7秒內(nèi)完成,千時(shí)無失效概率達(dá)99.999%,且任務(wù)能從斷點(diǎn)處接續(xù)執(zhí)行,保障了業(yè)務(wù)的高可用性和處理高效性。該實(shí)踐不需部署雙機(jī)輔助設(shè)備及商用雙機(jī)軟件等,完全以軟方式實(shí)現(xiàn),具有低成本、高效率以及高可靠性等特點(diǎn)。