陽(yáng)亦斌,楊 將,歐盛芬
(湖南中車時(shí)代通信信號(hào)有限公司,長(zhǎng)沙 410119)
隨著2018年國(guó)家《網(wǎng)絡(luò)安全法》,2019年底《信息安全技術(shù)網(wǎng)絡(luò)安全等級(jí)保護(hù)基本要求》的正式實(shí)施,在中國(guó)制造向中國(guó)智造轉(zhuǎn)型的關(guān)鍵期,“國(guó)產(chǎn)、自主可控”已成為我國(guó)信息技術(shù)產(chǎn)業(yè)發(fā)展的時(shí)代標(biāo)志,中國(guó)國(guó)家鐵路集團(tuán)有限公司(以下簡(jiǎn)稱“國(guó)鐵集團(tuán)”)以及下屬18個(gè)鐵路局集團(tuán)有限公司將信息系統(tǒng)網(wǎng)絡(luò)安全提升到前所未有的高度。為落實(shí)《中共中國(guó)鐵路總公司黨組關(guān)于進(jìn)一步加強(qiáng)鐵路網(wǎng)絡(luò)安全和信息化工作的通知》(鐵總黨[2019]28號(hào))的要求,由國(guó)鐵集團(tuán)信息公司牽頭,聯(lián)合中華人民共和國(guó)公安部、中國(guó)鐵道科學(xué)研究院集團(tuán)有限公司測(cè)評(píng)中心,2019年7月對(duì)全路3 896個(gè)信息系統(tǒng)進(jìn)行網(wǎng)絡(luò)安全等級(jí)保護(hù)定級(jí)。按照《國(guó)鐵集團(tuán)工電部關(guān)于做好工電信息系統(tǒng)整改相關(guān)工作的通知》(工電綜技電[2019]132號(hào))的要求,全路各鐵路局集團(tuán)有限公司對(duì)信息應(yīng)用系統(tǒng)開展全面安全性整改。
LKJ信息系統(tǒng)具體包含LKJ設(shè)備運(yùn)行監(jiān)測(cè)管理系統(tǒng)、LKJ數(shù)據(jù)無(wú)線換裝系統(tǒng)、電務(wù)車載設(shè)備生產(chǎn)管理平臺(tái)、調(diào)車防護(hù)等系統(tǒng)。其中LKJ設(shè)備運(yùn)行監(jiān)測(cè)管理系統(tǒng)和LKJ數(shù)據(jù)無(wú)線換裝系統(tǒng)已被定級(jí)為信息安全等級(jí)保護(hù)第三級(jí),各系統(tǒng)主要采用國(guó)外X86服務(wù)器,閉源Windows操作系統(tǒng)平臺(tái),數(shù)據(jù)庫(kù)采用Oracle系列版本,消息中間件采用IBM MQ,整個(gè)業(yè)務(wù)系統(tǒng)體系基本搭建在國(guó)外的平臺(tái)基礎(chǔ)之上。
目前LKJ信息系統(tǒng)主要采用Windows服務(wù)器、IBM MQ中間件、Oracle數(shù)據(jù)庫(kù)等國(guó)外的技術(shù)和產(chǎn)品,因此需從操作系統(tǒng)、數(shù)據(jù)庫(kù)、消息中間件、業(yè)務(wù)系統(tǒng)等層面進(jìn)行全面安全可控跨平臺(tái)移植。原始系統(tǒng)技術(shù)選型分析示意如圖1所示。
圖1 原始系統(tǒng)技術(shù)選型分析示意圖Fig.1 Analysis diagram of original system technology selection
LKJ信息系統(tǒng)對(duì)操作系統(tǒng)的應(yīng)用要求主要體現(xiàn)在安全性、穩(wěn)定性、兼容性、易用性和可維護(hù)性方面。Linux作為運(yùn)行在全球數(shù)據(jù)中心服務(wù)器、大型計(jì)算機(jī)、超級(jí)計(jì)算機(jī)上的開源操作系統(tǒng),應(yīng)用廣泛,可滿足LKJ信息系統(tǒng)應(yīng)用要求。Linux發(fā)行版本多,本文主要對(duì)主流Linux版本分支,結(jié)合應(yīng)用需求進(jìn)行對(duì)比分析。具體對(duì)比如表1所示。
表1 Linux版本分支對(duì)比表Tab.1 Comparison table of Linux revision branch
從表1中看出,Rhel、CentOS、Debian適用于服務(wù)器,穩(wěn)定性和兼容性是其追求的主要目標(biāo),其內(nèi)核版本的更新頻率較低;Fedora、Ubuntu、優(yōu)麒麟、Deepin主要應(yīng)用于個(gè)人辦公桌面,穩(wěn)定性要求不高,追求功能的新穎性。綜合本次業(yè)務(wù)需求,采用CentOS 8.x作為數(shù)據(jù)庫(kù)、消息中間件、通信子系統(tǒng)、業(yè)務(wù)子系統(tǒng)的操作系統(tǒng)承載平臺(tái),并在CentOS基礎(chǔ)上進(jìn)行優(yōu)化定制和安全加固。
Mysql被公認(rèn)為是最流行的開源關(guān)系型數(shù)據(jù)庫(kù),PostgreSQL被公認(rèn)為是最先進(jìn)的開源關(guān)系型數(shù)據(jù)庫(kù),是Oracle的“開源版數(shù)據(jù)庫(kù)”。目前既有LKJ信息系統(tǒng)采用Oracle數(shù)據(jù)庫(kù),PostgreSQL、Mysql數(shù)據(jù)庫(kù)均能滿足替代要求,重點(diǎn)從語(yǔ)法對(duì)數(shù)據(jù)庫(kù)移植復(fù)雜度、工作量和成本進(jìn)行分析。具體對(duì)比如表2、3所示。
PostgreSQL、Mysql、Qracle、Ms sql server等數(shù)據(jù)庫(kù)語(yǔ)法結(jié)構(gòu)差異較小,差異主要來(lái)源于數(shù)據(jù)庫(kù)提供的功能、數(shù)據(jù)庫(kù)字段類型、系統(tǒng)提供的函數(shù)。PostgreSQL在數(shù)據(jù)移植難度、數(shù)據(jù)完整性、大數(shù)據(jù)量操作、密集運(yùn)算、重型負(fù)載方面的表現(xiàn)都要好于 Mysql數(shù)據(jù)庫(kù)和 Ms sql server,因此采用PostgreSQL數(shù)據(jù)庫(kù)。
消息中間件是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無(wú)關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來(lái)進(jìn)行分布式系統(tǒng)的集成。通過(guò)提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下提供應(yīng)用解耦、彈性伸縮、冗余存儲(chǔ)、流量削峰、異步通信、數(shù)據(jù)同步等功能,屬于分布式系統(tǒng)架構(gòu)中的一個(gè)重要組件。
表2 數(shù)據(jù)類型對(duì)比表Tab.2 Comparison table of data type
表3 語(yǔ)法函數(shù)對(duì)比表Tab.3 Comparison table of syntax functions
目前開源的消息中間件種類較多,常見的有ActiveMQ、RabbitMQ、Kafka、Rocketmq、ZeroMQ等產(chǎn)品。根據(jù)LKJ信息系統(tǒng)業(yè)務(wù)的需要,對(duì)中間件進(jìn)行定制、調(diào)優(yōu)、改進(jìn)、固化。具體對(duì)比如表4所示。
綜上從消息中間件在持久化、可靠性(消息)、性能、易用性(使用難度)等多個(gè)維度進(jìn)行了對(duì)比分析,單純從吞吐量和TPS角度分析,Kafka、Memcacheq、ZeroMQ性能較好,經(jīng)過(guò)測(cè)試,Kafaka在單臺(tái)服務(wù)器上處理小消息時(shí)TPS能夠達(dá)到100 W/S,在同等條件下RabbitMQ的吞吐量只有Kafka的1/10至1/5之間,但RabbitMQ在使用RAM模式時(shí),其性能較高。Rocketmq和ActiveMQ的性能居于其間,約幾十萬(wàn)條每秒?;谀壳皩?shí)際LKJ信息系統(tǒng)需求,并綜合性能考慮,Kafaka更具有優(yōu)勢(shì)。
表4 中間件對(duì)比表Tab.4 Comparison table of middleware
根據(jù)LKJ信息系統(tǒng)跨平臺(tái)設(shè)計(jì)總體要求,實(shí)現(xiàn)高并發(fā)、高穩(wěn)定車地平臺(tái)化通信,支持TCP和UDP協(xié)議,支持IPV4和IPV6網(wǎng)絡(luò)協(xié)議,支持車地通信協(xié)議的用戶自定義,且基于國(guó)產(chǎn)或開源操作系統(tǒng)。
Epoll是Linux下多路復(fù)用IO接口Select/Poll的增強(qiáng)版本,它能顯著提高程序在大量并發(fā)連接中只有少量活躍的情況下系統(tǒng)CPU利用率。在獲取事件時(shí),無(wú)需遍歷整個(gè)被偵聽的描述符集,只要遍歷那些被內(nèi)核IO事件異步喚醒而加入Ready隊(duì)列的描述符集合。Epoll除了提供Select/Poll那種IO事件的電平觸發(fā)(Level Triggered)外,還提供了邊沿觸發(fā)(Edge Triggered),使得用戶空間程序有可能緩存IO狀態(tài),減少Epoll_Wait/Epoll_Pwait的調(diào)用,提高應(yīng)用程序效率。綜合考慮采用基于開源的Epoll第三方通信庫(kù)進(jìn)行設(shè)計(jì)完成替代。
LKJ信息系統(tǒng)由操作系統(tǒng)、數(shù)據(jù)庫(kù)、消息中間件、及各個(gè)子系統(tǒng)等組成。LKJ信息系統(tǒng)跨平臺(tái)總體系統(tǒng)架構(gòu)示意如圖2所示。
對(duì)本方案中涉及到的關(guān)鍵信息進(jìn)行分層,總體可以分為車載設(shè)備、車地傳輸層(通信子系統(tǒng))、數(shù)據(jù)分發(fā)層(消息中間件:Kafka)、數(shù)據(jù)處理層、數(shù)據(jù)存儲(chǔ)層(數(shù)據(jù)庫(kù):PostgreSQL)、應(yīng)用服務(wù)層、終端應(yīng)用層,以及操作系統(tǒng)承載層(操作系統(tǒng):Linux CentOS 8.x 平臺(tái)操作系統(tǒng) )。
LKJ信息系統(tǒng)跨平臺(tái)技術(shù)架構(gòu)示意如圖3所示。
根據(jù)LKJ信息系統(tǒng)跨平臺(tái)設(shè)計(jì)總體要求,所有子系統(tǒng)均進(jìn)行跨平臺(tái)設(shè)計(jì),兼容Linux和Windows平臺(tái)。各個(gè)子系統(tǒng)均使用標(biāo)準(zhǔn)的C/C++語(yǔ)言和STL標(biāo)準(zhǔn)模板庫(kù),避免使用與系統(tǒng)相關(guān)的API接口;使用PostgreSQL數(shù)據(jù)庫(kù),均支持在Linux平臺(tái)和Windows平臺(tái)上部署,具有良好的跨平臺(tái)部署能力;使用Kafka消息中間件,在業(yè)界比較常用且有大量實(shí)踐案例,API支持多種語(yǔ)言,支持Windows和Linux雙平臺(tái)。系統(tǒng)采用Reactor網(wǎng)絡(luò)編程模型,利用Reactor實(shí)例、多路復(fù)用器、事件處理器以及事件源四個(gè)核心組件,引入開源高性能事件驅(qū)動(dòng)I/O庫(kù),進(jìn)行平臺(tái)通用模塊框架設(shè)計(jì),實(shí)現(xiàn)對(duì)Linux CentOS/Windows Server操作系統(tǒng)平臺(tái)的兼容。
圖2 總體系統(tǒng)架構(gòu)示意圖Fig.2 Overall system architecture
圖3 技術(shù)架構(gòu)示意圖Fig.3 Technical architecture
根據(jù)對(duì)LKJ信息系統(tǒng)通信子系統(tǒng)性能分析,影響高并發(fā)、高性能的主要技術(shù)瓶頸在網(wǎng)絡(luò)IO的快速收發(fā)、業(yè)務(wù)包的高速處理和轉(zhuǎn)發(fā)。
通過(guò)網(wǎng)絡(luò)IO模型的選型,使用復(fù)雜度O(1)的Epoll模型,在網(wǎng)絡(luò)IO層面實(shí)現(xiàn)快速的網(wǎng)絡(luò)吞吐,為了充分使用SMP多核的并發(fā)處理優(yōu)勢(shì),在包的解析處理和轉(zhuǎn)發(fā)層面,通信子系統(tǒng)使用可配置數(shù)量的業(yè)務(wù)線程池技術(shù),避免線程頻繁的創(chuàng)建和銷毀,并充分利用硬件多核資源,以應(yīng)對(duì)在多終端大并發(fā)連接情況下對(duì)通信數(shù)據(jù)包的高效處理。
在通信子系統(tǒng)內(nèi)部,按照消息流向,可以架構(gòu)為消息收發(fā)(Epoll)、消息處理(工作線程池)、消息分發(fā)(內(nèi)部消息中間件處理)這3個(gè)流程。
通信子系統(tǒng)基礎(chǔ)架構(gòu)示意如圖4所示。
圖4 通信子系統(tǒng)基礎(chǔ)架構(gòu)示意圖Fig.4 Communication subsystem infrastructure
目前LKJ信息系統(tǒng)采用國(guó)外Windows操作系統(tǒng)平臺(tái),通過(guò)前期可行性替代研究,同時(shí)考慮對(duì)Kafka消息中間件、PostgreSQL數(shù)據(jù)庫(kù)版本的支持,通過(guò)定制化的Linux操作系統(tǒng)平臺(tái),是實(shí)現(xiàn)操作系統(tǒng)安全可控的有效替換方案。CentOS是基于Linux 平臺(tái)的操作系統(tǒng),其內(nèi)核kernel代碼全部安全可控,可定制成具有高性能、高可用、高可靠和高易用等特征,支持多核、雙態(tài)、多進(jìn)程,可用于業(yè)務(wù)功能復(fù)雜、擴(kuò)展性、穩(wěn)定性、安全性較高的綜合業(yè)務(wù),滿足業(yè)務(wù)對(duì)系統(tǒng)的實(shí)時(shí)性需求,同時(shí)支持QT應(yīng)用或Web應(yīng)用開發(fā),并支持運(yùn)行上層桌面,方便集成應(yīng)用組件。操作系統(tǒng)軟件架構(gòu)示意如圖5所示。
圖5 操作系統(tǒng)軟件架構(gòu)示意圖Fig.5 Operating system software architecture
通過(guò)對(duì)業(yè)務(wù)場(chǎng)景的需求分析以及數(shù)據(jù)庫(kù)軟件技術(shù)選型,LKJ信息系統(tǒng)跨平臺(tái)選用PostgreSQL12(64位)數(shù)據(jù)庫(kù)作為系統(tǒng)架構(gòu)的數(shù)據(jù)庫(kù)系統(tǒng)。
1)數(shù)據(jù)庫(kù)接口機(jī)設(shè)計(jì)
在需要入庫(kù)的業(yè)務(wù)和數(shù)據(jù)庫(kù)之間,建立一層緩存機(jī)制,避免大量數(shù)據(jù)入庫(kù)時(shí)PostgreSQL數(shù)據(jù)庫(kù)處理不過(guò)來(lái)導(dǎo)致阻塞,影響查詢等業(yè)務(wù);接口機(jī)會(huì)匯聚多個(gè)入庫(kù)請(qǐng)求,批量進(jìn)行入庫(kù)提交,以極大的提供入庫(kù)的效率;在PostgreSQL數(shù)據(jù)庫(kù)發(fā)生異常時(shí),接口機(jī)會(huì)將入庫(kù)數(shù)據(jù)緩存到文件中,當(dāng)數(shù)據(jù)庫(kù)上線時(shí),再將數(shù)據(jù)插入至數(shù)據(jù)庫(kù)中,提高系統(tǒng)整體的容災(zāi)能力。
為保證接口機(jī)數(shù)據(jù)高速寫入,數(shù)據(jù)緩存采用內(nèi)存緩存和磁盤文件相結(jié)合的方式。接口機(jī)的數(shù)據(jù)先寫入到內(nèi)存中,當(dāng)小塊數(shù)據(jù)緩存到較大數(shù)據(jù)量時(shí),再調(diào)用接口批量寫入到磁盤文件中,通過(guò)內(nèi)存緩存累積成大塊IO寫入文件,來(lái)提高寫入磁盤的效率。
入庫(kù)數(shù)據(jù)流示意如圖6所示。
圖6 入庫(kù)數(shù)據(jù)流示意圖Fig.6 Inbound data flow
2)PostgreSQL數(shù)據(jù)庫(kù)優(yōu)化
LKJ信息系統(tǒng)跨平臺(tái)設(shè)計(jì)需完成既有基于Oracle數(shù)據(jù)庫(kù)的腳本移植(包括數(shù)據(jù)結(jié)構(gòu)、字段類型、字段長(zhǎng)度)、數(shù)據(jù)庫(kù)內(nèi)置存儲(chǔ)過(guò)程觸發(fā)器定時(shí)任務(wù)的移植,客戶端訪問(wèn)數(shù)據(jù)庫(kù)語(yǔ)句的代碼移植,數(shù)據(jù)庫(kù)的優(yōu)化遵循由“硬”及“軟”的方式進(jìn)行調(diào)優(yōu)。
數(shù)據(jù)庫(kù)調(diào)優(yōu)主要考慮LKJ信息系統(tǒng)單表海量數(shù)據(jù),為確保操作數(shù)據(jù)的效率,對(duì)數(shù)據(jù)庫(kù)進(jìn)行分表分區(qū)設(shè)計(jì),提升數(shù)據(jù)庫(kù)的并發(fā)訪問(wèn)能力,避免單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器成為瓶頸。按照日期對(duì)主表進(jìn)行水平拆分,以一日一表的原則建立表結(jié)構(gòu)相同的虛擬主表,按照每5 s 1 000條實(shí)時(shí)數(shù)據(jù)的量來(lái)進(jìn)行計(jì)算,日表數(shù)據(jù)量約172.8萬(wàn)條。為避免主表拆分后對(duì)用戶查詢數(shù)據(jù)帶來(lái)的額外開銷,數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)提供存儲(chǔ)過(guò)程調(diào)用,用戶操作主表,將查詢語(yǔ)句提交給存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程根據(jù)傳入的時(shí)間及條件,返回翻譯后的查詢、修改、刪除等語(yǔ)句供業(yè)務(wù)系統(tǒng)調(diào)用,用戶不再關(guān)注數(shù)據(jù)存放在哪張?zhí)摂M主表中。
數(shù)據(jù)庫(kù)虛擬主表示意如圖7所示。
圖7 數(shù)據(jù)庫(kù)虛擬主表示意圖Fig.7 Database virtual main table
3)PostgreSQL數(shù)據(jù)庫(kù)可靠性設(shè)計(jì)
雙機(jī)熱備,以主備兩臺(tái)數(shù)據(jù)庫(kù)為基礎(chǔ)構(gòu)建高可用框架,提升整套數(shù)據(jù)系統(tǒng)的穩(wěn)定性、數(shù)據(jù)安全性和性能,雙機(jī)方案基于ROSE HA框架進(jìn)行部署。ROSE負(fù)責(zé)數(shù)據(jù)庫(kù)雙機(jī)的資源管理層和消息傳遞,負(fù)責(zé)仲裁指定誰(shuí)雙機(jī)中的活動(dòng)節(jié)點(diǎn)、IP地址的轉(zhuǎn)移、本地資源管理系統(tǒng)、雙機(jī)的心跳信息(heartbeat),以及負(fù)責(zé)數(shù)據(jù)庫(kù)服務(wù)的啟動(dòng)、停止和狀態(tài)查看。
數(shù)據(jù)同步,主數(shù)據(jù)庫(kù)A對(duì)外提供讀寫,將數(shù)據(jù)同步至從數(shù)據(jù)庫(kù)B,從數(shù)據(jù)庫(kù)B不斷從主數(shù)據(jù)庫(kù)A接收到數(shù)據(jù)并入庫(kù),主從數(shù)據(jù)同步基于時(shí)間點(diǎn)的備份(簡(jiǎn)稱PITR),其中把數(shù)據(jù)庫(kù)變動(dòng)日志記錄WAL日志傳送到另外一臺(tái)服務(wù)器上有兩種方式,WAL日志歸檔(base-file)和流復(fù)制(streaming replication)。
數(shù)據(jù)庫(kù)異常及恢復(fù),當(dāng)數(shù)據(jù)庫(kù)雙機(jī)處于正常運(yùn)行狀態(tài)時(shí),浮動(dòng)IP位于數(shù)據(jù)庫(kù)主數(shù)據(jù)庫(kù)A上,客戶端數(shù)據(jù)采集器通過(guò)浮動(dòng)IP連接到A的接口機(jī),數(shù)據(jù)由A進(jìn)行緩存并入庫(kù),客戶端通過(guò)該IP地址進(jìn)行數(shù)據(jù)庫(kù)連接和操作。從數(shù)據(jù)庫(kù)B異常時(shí),不影響數(shù)據(jù)庫(kù)A的正常工作,待數(shù)據(jù)庫(kù)B恢復(fù)后,繼續(xù)進(jìn)行數(shù)據(jù)的同步;主數(shù)據(jù)庫(kù)A異常時(shí),雙機(jī)軟件會(huì)將浮動(dòng)IP切換到從數(shù)據(jù)庫(kù)B,從數(shù)據(jù)庫(kù)B上的數(shù)據(jù)接口機(jī)接收外部傳入的數(shù)據(jù)并緩存到本地文件中,此時(shí)數(shù)據(jù)并不入庫(kù),只提供數(shù)據(jù)的讀取操作,不提供數(shù)據(jù)的修改、刪除、插入操作。待主數(shù)據(jù)庫(kù)A修復(fù)后,雙機(jī)軟件將切回至主數(shù)據(jù)庫(kù)A,此時(shí)主數(shù)據(jù)庫(kù)接口機(jī)主動(dòng)將從數(shù)據(jù)庫(kù)B緩存的本地?cái)?shù)據(jù)文件拷貝至主數(shù)據(jù)庫(kù)A,由主數(shù)據(jù)庫(kù)A上的入庫(kù)接口機(jī)進(jìn)行入庫(kù)操作,以保證數(shù)據(jù)的完整性。
鑒于目前國(guó)內(nèi)外形勢(shì),結(jié)合《信息安全技術(shù)網(wǎng)絡(luò)安全等級(jí)保護(hù)基本要求》,本文采用基于國(guó)產(chǎn)或開源的操作系統(tǒng)、數(shù)據(jù)庫(kù)、消息中間件等對(duì)LKJ信息系統(tǒng)進(jìn)行跨平臺(tái)設(shè)計(jì)、轉(zhuǎn)型給出具體替代方案。通過(guò)部署與試用,所設(shè)計(jì)的替代方案滿足LKJ信息系統(tǒng)工程化應(yīng)用所需的安全性、可靠性及其他各項(xiàng)性能指標(biāo)要求,有效保障了既有LKJ信息系統(tǒng)應(yīng)用的平穩(wěn)過(guò)渡,為今后在軌道交通領(lǐng)域信息系統(tǒng)自主化設(shè)計(jì)提供了具體思路。