馬 濤,岳 敏,袁 超,茍世哲,王永平,張 瑋
(中國(guó)科學(xué)院 近代物理研究所,甘肅 蘭州 730000)
強(qiáng)流重離子加速器裝置(HIAF)是目前在建的超導(dǎo)直線加速器、超導(dǎo)同步加速器和儲(chǔ)存環(huán)組合的先進(jìn)重離子研究裝置。HIAF采用實(shí)驗(yàn)物理和工業(yè)控制系統(tǒng)(EPICS)作為控制架構(gòu),目前在蘭州重離子研究裝置(HIRFL)上使用Control System Studio(CSS)提供的存儲(chǔ)工具作為HIRFL運(yùn)行數(shù)據(jù)采集、存儲(chǔ)的工具[1]。在長(zhǎng)時(shí)間的部署使用后,發(fā)現(xiàn)當(dāng)前基于EPICS的存儲(chǔ)工具在HIAF或更大規(guī)模的研究裝置上使用時(shí)會(huì)存在以下不足:1) 僅支持Oracle、MySQL等關(guān)系型數(shù)據(jù)庫(kù)的存儲(chǔ)接口,對(duì)大數(shù)據(jù)量和多元數(shù)據(jù)格式的存儲(chǔ)缺乏靈活性,系統(tǒng)性能存在瓶頸;2) 提供的存儲(chǔ)模式較單一,不支持對(duì)不同子系統(tǒng)數(shù)據(jù)和實(shí)驗(yàn)相關(guān)信息的手動(dòng)存儲(chǔ)方式,導(dǎo)致歷史數(shù)據(jù)利用率低;3) 未考慮數(shù)據(jù)量累積后利用分庫(kù)分表的方案來(lái)提升系統(tǒng)可用性和可靠性的方法。
本文針對(duì)實(shí)際使用中出現(xiàn)的具體問(wèn)題,從非關(guān)系型數(shù)據(jù)庫(kù)接口支持、基于標(biāo)志位PV的手動(dòng)存儲(chǔ)模式添加及數(shù)據(jù)庫(kù)分布式部署和優(yōu)化的角度實(shí)現(xiàn)基于MongoDB的HIAF運(yùn)行數(shù)據(jù)存儲(chǔ)系統(tǒng)(Archive Engine)。
基于EPICS的存儲(chǔ)系統(tǒng)通過(guò)注冊(cè)PV的方式從IOC獲取需要采集的PV信息,同時(shí)提供了基于SQL的關(guān)系型數(shù)據(jù)庫(kù)接口[2],圖1為基于EPICS的存儲(chǔ)系統(tǒng)中數(shù)據(jù)庫(kù)表的邏輯模型。可看出,對(duì)于復(fù)雜的數(shù)據(jù)類型,如浮點(diǎn)數(shù)數(shù)組類型的數(shù)據(jù)存儲(chǔ),需通過(guò)標(biāo)識(shí)位記錄數(shù)據(jù)類型,數(shù)據(jù)表只存入數(shù)組第1個(gè)值,其余值存入單獨(dú)表中的多表操作實(shí)現(xiàn)。對(duì)于圖像、視頻等實(shí)驗(yàn)數(shù)據(jù)的存儲(chǔ)也同樣缺少靈活性。根據(jù)實(shí)際使用情況,HIAF Archive Engine選擇MongoDB作為非關(guān)系型數(shù)據(jù)庫(kù),為Archive工具擴(kuò)展非關(guān)系數(shù)據(jù)庫(kù)接口的支持。
MongoDB是一種分布式文件存儲(chǔ)數(shù)據(jù)庫(kù),其可嵌套的數(shù)據(jù)存儲(chǔ)方式可為復(fù)雜的數(shù)據(jù)類型提供簡(jiǎn)單易用的存儲(chǔ)方案,無(wú)需多表間的join操作[3]。提供動(dòng)態(tài)查詢、排序、第二索引等豐富的功能接口,可方便地對(duì)內(nèi)嵌數(shù)據(jù)進(jìn)行查詢。同時(shí)GridFS作為MongoDB的內(nèi)置功能,能很好地實(shí)現(xiàn)對(duì)其他文件類型數(shù)據(jù)的存儲(chǔ)[4]。此外,MongoDB有非常好的可擴(kuò)展性,可在本地或網(wǎng)絡(luò)上快速部署分布式分片。
圖1 基于EPICS的存儲(chǔ)系統(tǒng)中關(guān)系型數(shù)據(jù)庫(kù)表邏輯模型Fig.1 Relational database logical model of archive tool based on EPICS
HIAF Archive Engine在支持關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)的基礎(chǔ)上,從配置模塊的配置參數(shù)加載和導(dǎo)出、數(shù)據(jù)存儲(chǔ)模塊的數(shù)據(jù)讀取和寫入層上增加對(duì)MongoDB的接口支持。使用中只需配置文件中指定MongoDB的URL路徑。且MongoDB支持JavaScript腳本對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理,本文為Archive Engine的MongoDB數(shù)據(jù)庫(kù)實(shí)現(xiàn)了一鍵部署的功能。利用MongoDB可嵌套文件存儲(chǔ)的特點(diǎn)對(duì)表結(jié)構(gòu)進(jìn)行簡(jiǎn)化后,Archive Engine的寫入效率得到了極大提升,圖2為用float類型數(shù)據(jù)持續(xù)寫入時(shí)MongoDB Archive Engine和Oracle Archive Engine寫入速率的對(duì)比。
基于EPICS的存儲(chǔ)系統(tǒng)提供3種模式的數(shù)據(jù)存儲(chǔ)方案:1) Monitored模式,將每個(gè)采集到的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)存儲(chǔ);2) Monitored with Threshold模式,當(dāng)接收到的值和上一次存儲(chǔ)的值相比,其變化幅度超過(guò)用戶預(yù)設(shè)的threshold值時(shí)才將該值寫入數(shù)據(jù)庫(kù);3) Scanned模式,將數(shù)據(jù)按照用戶設(shè)定的Period間隔時(shí)間寫入數(shù)據(jù)庫(kù)存儲(chǔ)[5]。
其數(shù)據(jù)存儲(chǔ)流程如圖3a所示。
圖2 MongoDB Archive Engine和Oracle Archive Engine持續(xù)寫入速率對(duì)比Fig.2 Writing speed comparison between Oracle Archive Engine and MongoDB Archive Engine
運(yùn)行歷史數(shù)據(jù)的持續(xù)存儲(chǔ)是加速器裝置運(yùn)行歷史數(shù)據(jù)記錄和后期實(shí)驗(yàn)數(shù)據(jù)分析處理的基礎(chǔ)[6],但現(xiàn)有的基于EPICS的存儲(chǔ)系統(tǒng)提供的存儲(chǔ)策略缺少對(duì)實(shí)驗(yàn)離子類型、實(shí)驗(yàn)條件和實(shí)驗(yàn)人員等實(shí)驗(yàn)信息的記錄,導(dǎo)致歷史數(shù)據(jù)有效信息檢索困難、數(shù)據(jù)利用率低的問(wèn)題[7]。HIAF Archive Engine 實(shí)現(xiàn)了基于標(biāo)志位PV的手動(dòng)存儲(chǔ)方案,前端由CSS界面為實(shí)驗(yàn)人員提供數(shù)據(jù)存儲(chǔ)界面(圖4)。后端Archive Engine注冊(cè)相關(guān)子系統(tǒng)和存儲(chǔ)命令的PV監(jiān)聽(tīng),收到存儲(chǔ)命令后讀取相關(guān)實(shí)驗(yàn)信息的PV值作為檢索條件存入數(shù)據(jù)庫(kù),并開(kāi)始對(duì)該子系統(tǒng)下運(yùn)行數(shù)據(jù)的采集和存儲(chǔ),流程如圖3b所示。
圖3 HIAF Archive Engine自動(dòng)(a)和手動(dòng)(b)存儲(chǔ)策略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ù)存儲(chǔ)負(fù)載將持續(xù)增加。傳統(tǒng)的數(shù)據(jù)庫(kù)分區(qū)方案中,多表操作和事務(wù)操作等會(huì)受到分區(qū)方案影響,甚至大規(guī)模數(shù)據(jù)遷移時(shí)會(huì)造成服務(wù)中斷,MongoDB有更高效的自動(dòng)分片和動(dòng)態(tài)均衡技術(shù)[8]。
Archive Engine的MongoDB分片主要分為3個(gè)部分,即分片節(jié)點(diǎn)Shard、配置節(jié)點(diǎn)Config Server和路由節(jié)點(diǎn)Mongos(圖5)。其中路由節(jié)點(diǎn)Mongos主要負(fù)責(zé)在Archive Engine和分片節(jié)點(diǎn)間做數(shù)據(jù)路由、數(shù)據(jù)遷移和負(fù)載平衡;分片節(jié)點(diǎn)Shard是實(shí)際的數(shù)據(jù)節(jié)點(diǎn);配置節(jié)點(diǎn)Config Server存儲(chǔ)元數(shù)據(jù),記錄數(shù)據(jù)的位置和分片節(jié)點(diǎn)的部署情況[9]。Archive Engine根據(jù)數(shù)據(jù)檢索以單次實(shí)驗(yàn)子系統(tǒng)數(shù)據(jù)為檢索條件的特點(diǎn),將子系統(tǒng)名稱和時(shí)間戳組合作為分片的Shard Key,有效提升Archive Engine的讀寫性能[10]。
圖5 Archive Engine MongoDB分片部署結(jié)構(gòu)Fig.5 Archive Engine MongoDB sharding structure
HIAF Archive Engine在現(xiàn)有的運(yùn)行數(shù)據(jù)歸檔系統(tǒng)的基礎(chǔ)上,增加了基于MongoDB的NoSQL接口支持,提升了運(yùn)行數(shù)據(jù)存儲(chǔ)系統(tǒng)對(duì)非格式化數(shù)據(jù)存儲(chǔ)的靈活性和效率;增加了手動(dòng)存儲(chǔ)數(shù)據(jù)的方案,提升了歷史數(shù)據(jù)檢索的準(zhǔn)確性和數(shù)據(jù)利用率;通過(guò)部署分布式分片的MongoDB數(shù)據(jù)庫(kù),解決了歷史數(shù)據(jù)累積后整個(gè)系統(tǒng)運(yùn)行效率降低的問(wèn)題。HIAF Archive Engine在后續(xù)使用中還將根據(jù)新的需求持續(xù)改進(jìn)。