馬 濤,岳 敏,袁 超,茍世哲,王永平,張 瑋
(中國科學院 近代物理研究所,甘肅 蘭州 730000)
強流重離子加速器裝置(HIAF)是目前在建的超導直線加速器、超導同步加速器和儲存環(huán)組合的先進重離子研究裝置。HIAF采用實驗物理和工業(yè)控制系統(tǒng)(EPICS)作為控制架構(gòu),目前在蘭州重離子研究裝置(HIRFL)上使用Control System Studio(CSS)提供的存儲工具作為HIRFL運行數(shù)據(jù)采集、存儲的工具[1]。在長時間的部署使用后,發(fā)現(xiàn)當前基于EPICS的存儲工具在HIAF或更大規(guī)模的研究裝置上使用時會存在以下不足:1) 僅支持Oracle、MySQL等關(guān)系型數(shù)據(jù)庫的存儲接口,對大數(shù)據(jù)量和多元數(shù)據(jù)格式的存儲缺乏靈活性,系統(tǒng)性能存在瓶頸;2) 提供的存儲模式較單一,不支持對不同子系統(tǒng)數(shù)據(jù)和實驗相關(guān)信息的手動存儲方式,導致歷史數(shù)據(jù)利用率低;3) 未考慮數(shù)據(jù)量累積后利用分庫分表的方案來提升系統(tǒng)可用性和可靠性的方法。
本文針對實際使用中出現(xiàn)的具體問題,從非關(guān)系型數(shù)據(jù)庫接口支持、基于標志位PV的手動存儲模式添加及數(shù)據(jù)庫分布式部署和優(yōu)化的角度實現(xiàn)基于MongoDB的HIAF運行數(shù)據(jù)存儲系統(tǒng)(Archive Engine)。
基于EPICS的存儲系統(tǒng)通過注冊PV的方式從IOC獲取需要采集的PV信息,同時提供了基于SQL的關(guān)系型數(shù)據(jù)庫接口[2],圖1為基于EPICS的存儲系統(tǒng)中數(shù)據(jù)庫表的邏輯模型。可看出,對于復雜的數(shù)據(jù)類型,如浮點數(shù)數(shù)組類型的數(shù)據(jù)存儲,需通過標識位記錄數(shù)據(jù)類型,數(shù)據(jù)表只存入數(shù)組第1個值,其余值存入單獨表中的多表操作實現(xiàn)。對于圖像、視頻等實驗數(shù)據(jù)的存儲也同樣缺少靈活性。根據(jù)實際使用情況,HIAF Archive Engine選擇MongoDB作為非關(guān)系型數(shù)據(jù)庫,為Archive工具擴展非關(guān)系數(shù)據(jù)庫接口的支持。
MongoDB是一種分布式文件存儲數(shù)據(jù)庫,其可嵌套的數(shù)據(jù)存儲方式可為復雜的數(shù)據(jù)類型提供簡單易用的存儲方案,無需多表間的join操作[3]。提供動態(tài)查詢、排序、第二索引等豐富的功能接口,可方便地對內(nèi)嵌數(shù)據(jù)進行查詢。同時GridFS作為MongoDB的內(nèi)置功能,能很好地實現(xiàn)對其他文件類型數(shù)據(jù)的存儲[4]。此外,MongoDB有非常好的可擴展性,可在本地或網(wǎng)絡(luò)上快速部署分布式分片。

圖1 基于EPICS的存儲系統(tǒng)中關(guān)系型數(shù)據(jù)庫表邏輯模型Fig.1 Relational database logical model of archive tool based on EPICS
HIAF Archive Engine在支持關(guān)系型數(shù)據(jù)庫存儲的基礎(chǔ)上,從配置模塊的配置參數(shù)加載和導出、數(shù)據(jù)存儲模塊的數(shù)據(jù)讀取和寫入層上增加對MongoDB的接口支持。使用中只需配置文件中指定MongoDB的URL路徑。且MongoDB支持JavaScript腳本對數(shù)據(jù)庫進行管理,本文為Archive Engine的MongoDB數(shù)據(jù)庫實現(xiàn)了一鍵部署的功能。利用MongoDB可嵌套文件存儲的特點對表結(jié)構(gòu)進行簡化后,Archive Engine的寫入效率得到了極大提升,圖2為用float類型數(shù)據(jù)持續(xù)寫入時MongoDB Archive Engine和Oracle Archive Engine寫入速率的對比。
基于EPICS的存儲系統(tǒng)提供3種模式的數(shù)據(jù)存儲方案:1) Monitored模式,將每個采集到的數(shù)據(jù)寫入數(shù)據(jù)庫存儲;2) Monitored with Threshold模式,當接收到的值和上一次存儲的值相比,其變化幅度超過用戶預設(shè)的threshold值時才將該值寫入數(shù)據(jù)庫;3) Scanned模式,將數(shù)據(jù)按照用戶設(shè)定的Period間隔時間寫入數(shù)據(jù)庫存儲[5]。
其數(shù)據(jù)存儲流程如圖3a所示。

圖2 MongoDB Archive Engine和Oracle Archive Engine持續(xù)寫入速率對比Fig.2 Writing speed comparison between Oracle Archive Engine and MongoDB Archive Engine
運行歷史數(shù)據(jù)的持續(xù)存儲是加速器裝置運行歷史數(shù)據(jù)記錄和后期實驗數(shù)據(jù)分析處理的基礎(chǔ)[6],但現(xiàn)有的基于EPICS的存儲系統(tǒng)提供的存儲策略缺少對實驗離子類型、實驗條件和實驗人員等實驗信息的記錄,導致歷史數(shù)據(jù)有效信息檢索困難、數(shù)據(jù)利用率低的問題[7]。HIAF Archive Engine 實現(xiàn)了基于標志位PV的手動存儲方案,前端由CSS界面為實驗人員提供數(shù)據(jù)存儲界面(圖4)。后端Archive Engine注冊相關(guān)子系統(tǒng)和存儲命令的PV監(jiān)聽,收到存儲命令后讀取相關(guān)實驗信息的PV值作為檢索條件存入數(shù)據(jù)庫,并開始對該子系統(tǒng)下運行數(shù)據(jù)的采集和存儲,流程如圖3b所示。

圖3 HIAF Archive Engine自動(a)和手動(b)存儲策略Fig.3 Automatic archive strategy (a) and manual archive strategy (b) of HIAF Archive Engine

圖4 數(shù)據(jù)保存CSS界面Fig.4 Manual archive GUI in CSS
隨著歷史數(shù)據(jù)的積累,Archive Engine的數(shù)據(jù)存儲負載將持續(xù)增加。傳統(tǒng)的數(shù)據(jù)庫分區(qū)方案中,多表操作和事務操作等會受到分區(qū)方案影響,甚至大規(guī)模數(shù)據(jù)遷移時會造成服務中斷,MongoDB有更高效的自動分片和動態(tài)均衡技術(shù)[8]。
Archive Engine的MongoDB分片主要分為3個部分,即分片節(jié)點Shard、配置節(jié)點Config Server和路由節(jié)點Mongos(圖5)。其中路由節(jié)點Mongos主要負責在Archive Engine和分片節(jié)點間做數(shù)據(jù)路由、數(shù)據(jù)遷移和負載平衡;分片節(jié)點Shard是實際的數(shù)據(jù)節(jié)點;配置節(jié)點Config Server存儲元數(shù)據(jù),記錄數(shù)據(jù)的位置和分片節(jié)點的部署情況[9]。Archive Engine根據(jù)數(shù)據(jù)檢索以單次實驗子系統(tǒng)數(shù)據(jù)為檢索條件的特點,將子系統(tǒng)名稱和時間戳組合作為分片的Shard Key,有效提升Archive Engine的讀寫性能[10]。

圖5 Archive Engine MongoDB分片部署結(jié)構(gòu)Fig.5 Archive Engine MongoDB sharding structure
HIAF Archive Engine在現(xiàn)有的運行數(shù)據(jù)歸檔系統(tǒng)的基礎(chǔ)上,增加了基于MongoDB的NoSQL接口支持,提升了運行數(shù)據(jù)存儲系統(tǒng)對非格式化數(shù)據(jù)存儲的靈活性和效率;增加了手動存儲數(shù)據(jù)的方案,提升了歷史數(shù)據(jù)檢索的準確性和數(shù)據(jù)利用率;通過部署分布式分片的MongoDB數(shù)據(jù)庫,解決了歷史數(shù)據(jù)累積后整個系統(tǒng)運行效率降低的問題。HIAF Archive Engine在后續(xù)使用中還將根據(jù)新的需求持續(xù)改進。