陽亦斌,楊 將,歐盛芬
(湖南中車時代通信信號有限公司,長沙 410119)
隨著2018年國家《網絡安全法》,2019年底《信息安全技術網絡安全等級保護基本要求》的正式實施,在中國制造向中國智造轉型的關鍵期,“國產、自主可控”已成為我國信息技術產業發展的時代標志,中國國家鐵路集團有限公司(以下簡稱“國鐵集團”)以及下屬18個鐵路局集團有限公司將信息系統網絡安全提升到前所未有的高度。為落實《中共中國鐵路總公司黨組關于進一步加強鐵路網絡安全和信息化工作的通知》(鐵總黨[2019]28號)的要求,由國鐵集團信息公司牽頭,聯合中華人民共和國公安部、中國鐵道科學研究院集團有限公司測評中心,2019年7月對全路3 896個信息系統進行網絡安全等級保護定級。按照《國鐵集團工電部關于做好工電信息系統整改相關工作的通知》(工電綜技電[2019]132號)的要求,全路各鐵路局集團有限公司對信息應用系統開展全面安全性整改。
LKJ信息系統具體包含LKJ設備運行監測管理系統、LKJ數據無線換裝系統、電務車載設備生產管理平臺、調車防護等系統。其中LKJ設備運行監測管理系統和LKJ數據無線換裝系統已被定級為信息安全等級保護第三級,各系統主要采用國外X86服務器,閉源Windows操作系統平臺,數據庫采用Oracle系列版本,消息中間件采用IBM MQ,整個業務系統體系基本搭建在國外的平臺基礎之上。
目前LKJ信息系統主要采用Windows服務器、IBM MQ中間件、Oracle數據庫等國外的技術和產品,因此需從操作系統、數據庫、消息中間件、業務系統等層面進行全面安全可控跨平臺移植。原始系統技術選型分析示意如圖1所示。

圖1 原始系統技術選型分析示意圖Fig.1 Analysis diagram of original system technology selection
LKJ信息系統對操作系統的應用要求主要體現在安全性、穩定性、兼容性、易用性和可維護性方面。Linux作為運行在全球數據中心服務器、大型計算機、超級計算機上的開源操作系統,應用廣泛,可滿足LKJ信息系統應用要求。Linux發行版本多,本文主要對主流Linux版本分支,結合應用需求進行對比分析。具體對比如表1所示。

表1 Linux版本分支對比表Tab.1 Comparison table of Linux revision branch
從表1中看出,Rhel、CentOS、Debian適用于服務器,穩定性和兼容性是其追求的主要目標,其內核版本的更新頻率較低;Fedora、Ubuntu、優麒麟、Deepin主要應用于個人辦公桌面,穩定性要求不高,追求功能的新穎性。綜合本次業務需求,采用CentOS 8.x作為數據庫、消息中間件、通信子系統、業務子系統的操作系統承載平臺,并在CentOS基礎上進行優化定制和安全加固。
Mysql被公認為是最流行的開源關系型數據庫,PostgreSQL被公認為是最先進的開源關系型數據庫,是Oracle的“開源版數據庫”。目前既有LKJ信息系統采用Oracle數據庫,PostgreSQL、Mysql數據庫均能滿足替代要求,重點從語法對數據庫移植復雜度、工作量和成本進行分析。具體對比如表2、3所示。
PostgreSQL、Mysql、Qracle、Ms sql server等數據庫語法結構差異較小,差異主要來源于數據庫提供的功能、數據庫字段類型、系統提供的函數。PostgreSQL在數據移植難度、數據完整性、大數據量操作、密集運算、重型負載方面的表現都要好于 Mysql數據庫和 Ms sql server,因此采用PostgreSQL數據庫。
消息中間件是指利用高效可靠的消息傳遞機制進行與平臺無關的數據交流,并基于數據通信來進行分布式系統的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環境下提供應用解耦、彈性伸縮、冗余存儲、流量削峰、異步通信、數據同步等功能,屬于分布式系統架構中的一個重要組件。

表2 數據類型對比表Tab.2 Comparison table of data type

表3 語法函數對比表Tab.3 Comparison table of syntax functions
目前開源的消息中間件種類較多,常見的有ActiveMQ、RabbitMQ、Kafka、Rocketmq、ZeroMQ等產品。根據LKJ信息系統業務的需要,對中間件進行定制、調優、改進、固化。具體對比如表4所示。
綜上從消息中間件在持久化、可靠性(消息)、性能、易用性(使用難度)等多個維度進行了對比分析,單純從吞吐量和TPS角度分析,Kafka、Memcacheq、ZeroMQ性能較好,經過測試,Kafaka在單臺服務器上處理小消息時TPS能夠達到100 W/S,在同等條件下RabbitMQ的吞吐量只有Kafka的1/10至1/5之間,但RabbitMQ在使用RAM模式時,其性能較高。Rocketmq和ActiveMQ的性能居于其間,約幾十萬條每秒。基于目前實際LKJ信息系統需求,并綜合性能考慮,Kafaka更具有優勢。

表4 中間件對比表Tab.4 Comparison table of middleware
根據LKJ信息系統跨平臺設計總體要求,實現高并發、高穩定車地平臺化通信,支持TCP和UDP協議,支持IPV4和IPV6網絡協議,支持車地通信協議的用戶自定義,且基于國產或開源操作系統。
Epoll是Linux下多路復用IO接口Select/Poll的增強版本,它能顯著提高程序在大量并發連接中只有少量活躍的情況下系統CPU利用率。在獲取事件時,無需遍歷整個被偵聽的描述符集,只要遍歷那些被內核IO事件異步喚醒而加入Ready隊列的描述符集合。Epoll除了提供Select/Poll那種IO事件的電平觸發(Level Triggered)外,還提供了邊沿觸發(Edge Triggered),使得用戶空間程序有可能緩存IO狀態,減少Epoll_Wait/Epoll_Pwait的調用,提高應用程序效率。綜合考慮采用基于開源的Epoll第三方通信庫進行設計完成替代。
LKJ信息系統由操作系統、數據庫、消息中間件、及各個子系統等組成。LKJ信息系統跨平臺總體系統架構示意如圖2所示。
對本方案中涉及到的關鍵信息進行分層,總體可以分為車載設備、車地傳輸層(通信子系統)、數據分發層(消息中間件:Kafka)、數據處理層、數據存儲層(數據庫:PostgreSQL)、應用服務層、終端應用層,以及操作系統承載層(操作系統:Linux CentOS 8.x 平臺操作系統 )。
LKJ信息系統跨平臺技術架構示意如圖3所示。
根據LKJ信息系統跨平臺設計總體要求,所有子系統均進行跨平臺設計,兼容Linux和Windows平臺。各個子系統均使用標準的C/C++語言和STL標準模板庫,避免使用與系統相關的API接口;使用PostgreSQL數據庫,均支持在Linux平臺和Windows平臺上部署,具有良好的跨平臺部署能力;使用Kafka消息中間件,在業界比較常用且有大量實踐案例,API支持多種語言,支持Windows和Linux雙平臺。系統采用Reactor網絡編程模型,利用Reactor實例、多路復用器、事件處理器以及事件源四個核心組件,引入開源高性能事件驅動I/O庫,進行平臺通用模塊框架設計,實現對Linux CentOS/Windows Server操作系統平臺的兼容。

圖2 總體系統架構示意圖Fig.2 Overall system architecture

圖3 技術架構示意圖Fig.3 Technical architecture
根據對LKJ信息系統通信子系統性能分析,影響高并發、高性能的主要技術瓶頸在網絡IO的快速收發、業務包的高速處理和轉發。
通過網絡IO模型的選型,使用復雜度O(1)的Epoll模型,在網絡IO層面實現快速的網絡吞吐,為了充分使用SMP多核的并發處理優勢,在包的解析處理和轉發層面,通信子系統使用可配置數量的業務線程池技術,避免線程頻繁的創建和銷毀,并充分利用硬件多核資源,以應對在多終端大并發連接情況下對通信數據包的高效處理。
在通信子系統內部,按照消息流向,可以架構為消息收發(Epoll)、消息處理(工作線程池)、消息分發(內部消息中間件處理)這3個流程。
通信子系統基礎架構示意如圖4所示。

圖4 通信子系統基礎架構示意圖Fig.4 Communication subsystem infrastructure
目前LKJ信息系統采用國外Windows操作系統平臺,通過前期可行性替代研究,同時考慮對Kafka消息中間件、PostgreSQL數據庫版本的支持,通過定制化的Linux操作系統平臺,是實現操作系統安全可控的有效替換方案。CentOS是基于Linux 平臺的操作系統,其內核kernel代碼全部安全可控,可定制成具有高性能、高可用、高可靠和高易用等特征,支持多核、雙態、多進程,可用于業務功能復雜、擴展性、穩定性、安全性較高的綜合業務,滿足業務對系統的實時性需求,同時支持QT應用或Web應用開發,并支持運行上層桌面,方便集成應用組件。操作系統軟件架構示意如圖5所示。

圖5 操作系統軟件架構示意圖Fig.5 Operating system software architecture
通過對業務場景的需求分析以及數據庫軟件技術選型,LKJ信息系統跨平臺選用PostgreSQL12(64位)數據庫作為系統架構的數據庫系統。
1)數據庫接口機設計
在需要入庫的業務和數據庫之間,建立一層緩存機制,避免大量數據入庫時PostgreSQL數據庫處理不過來導致阻塞,影響查詢等業務;接口機會匯聚多個入庫請求,批量進行入庫提交,以極大的提供入庫的效率;在PostgreSQL數據庫發生異常時,接口機會將入庫數據緩存到文件中,當數據庫上線時,再將數據插入至數據庫中,提高系統整體的容災能力。
為保證接口機數據高速寫入,數據緩存采用內存緩存和磁盤文件相結合的方式。接口機的數據先寫入到內存中,當小塊數據緩存到較大數據量時,再調用接口批量寫入到磁盤文件中,通過內存緩存累積成大塊IO寫入文件,來提高寫入磁盤的效率。
入庫數據流示意如圖6所示。

圖6 入庫數據流示意圖Fig.6 Inbound data flow
2)PostgreSQL數據庫優化
LKJ信息系統跨平臺設計需完成既有基于Oracle數據庫的腳本移植(包括數據結構、字段類型、字段長度)、數據庫內置存儲過程觸發器定時任務的移植,客戶端訪問數據庫語句的代碼移植,數據庫的優化遵循由“硬”及“軟”的方式進行調優。
數據庫調優主要考慮LKJ信息系統單表海量數據,為確保操作數據的效率,對數據庫進行分表分區設計,提升數據庫的并發訪問能力,避免單臺數據庫服務器成為瓶頸。按照日期對主表進行水平拆分,以一日一表的原則建立表結構相同的虛擬主表,按照每5 s 1 000條實時數據的量來進行計算,日表數據量約172.8萬條。為避免主表拆分后對用戶查詢數據帶來的額外開銷,數據庫設計時提供存儲過程調用,用戶操作主表,將查詢語句提交給存儲過程,存儲過程根據傳入的時間及條件,返回翻譯后的查詢、修改、刪除等語句供業務系統調用,用戶不再關注數據存放在哪張虛擬主表中。
數據庫虛擬主表示意如圖7所示。

圖7 數據庫虛擬主表示意圖Fig.7 Database virtual main table
3)PostgreSQL數據庫可靠性設計
雙機熱備,以主備兩臺數據庫為基礎構建高可用框架,提升整套數據系統的穩定性、數據安全性和性能,雙機方案基于ROSE HA框架進行部署。ROSE負責數據庫雙機的資源管理層和消息傳遞,負責仲裁指定誰雙機中的活動節點、IP地址的轉移、本地資源管理系統、雙機的心跳信息(heartbeat),以及負責數據庫服務的啟動、停止和狀態查看。
數據同步,主數據庫A對外提供讀寫,將數據同步至從數據庫B,從數據庫B不斷從主數據庫A接收到數據并入庫,主從數據同步基于時間點的備份(簡稱PITR),其中把數據庫變動日志記錄WAL日志傳送到另外一臺服務器上有兩種方式,WAL日志歸檔(base-file)和流復制(streaming replication)。
數據庫異常及恢復,當數據庫雙機處于正常運行狀態時,浮動IP位于數據庫主數據庫A上,客戶端數據采集器通過浮動IP連接到A的接口機,數據由A進行緩存并入庫,客戶端通過該IP地址進行數據庫連接和操作。從數據庫B異常時,不影響數據庫A的正常工作,待數據庫B恢復后,繼續進行數據的同步;主數據庫A異常時,雙機軟件會將浮動IP切換到從數據庫B,從數據庫B上的數據接口機接收外部傳入的數據并緩存到本地文件中,此時數據并不入庫,只提供數據的讀取操作,不提供數據的修改、刪除、插入操作。待主數據庫A修復后,雙機軟件將切回至主數據庫A,此時主數據庫接口機主動將從數據庫B緩存的本地數據文件拷貝至主數據庫A,由主數據庫A上的入庫接口機進行入庫操作,以保證數據的完整性。
鑒于目前國內外形勢,結合《信息安全技術網絡安全等級保護基本要求》,本文采用基于國產或開源的操作系統、數據庫、消息中間件等對LKJ信息系統進行跨平臺設計、轉型給出具體替代方案。通過部署與試用,所設計的替代方案滿足LKJ信息系統工程化應用所需的安全性、可靠性及其他各項性能指標要求,有效保障了既有LKJ信息系統應用的平穩過渡,為今后在軌道交通領域信息系統自主化設計提供了具體思路。