張志遠 陳建鋒 沈立人
(中國科學院上海應用物理研究所 上海 201800)
上海光源(SSRF)是高性能的中能第三代同步輻射光源[1,2],電子束能量3.5 GeV,其同步輻射光覆蓋紅外至硬X射線,是一座可供數(shù)百位科研人員同時開展工作的科學平臺。上海光源采用 EPICS[3]作為分布式控制系統(tǒng),這是美國洛斯阿拉莫斯國家實驗室和阿貢國家實驗室聯(lián)合開發(fā)的典型分布式控制系統(tǒng)軟件開發(fā)環(huán)境,廣泛應用于許多大型科研裝置。為方便用戶查詢、分析系統(tǒng)參數(shù)和加速器運行數(shù)據(jù),EPICS提供了Channel Archiver存檔工具來采集、存儲和檢索系統(tǒng)運行過程中的機器參數(shù)和歷史數(shù)據(jù)。本文對EPICS現(xiàn)有存檔系統(tǒng)進行分析,提出其在日常應用中的不足,并針對這些不足,設計了基于Oracle數(shù)據(jù)庫的新存檔系統(tǒng),實現(xiàn)穩(wěn)定、可配置的數(shù)據(jù)采集及利用。
EPICS系統(tǒng)中,Channel Archiver是OPI層工具,其通過基于TCP/IP的通道訪問協(xié)議(Channel access,CA)訪問運行于底層的IOC(Input/Output Controller)服務器。存檔引擎采集到IOC回傳的數(shù)據(jù)后,以特定格式將數(shù)據(jù)保存到本地磁盤;當文件大小達到設定值時,系統(tǒng)會自動建立一個新的數(shù)據(jù)文件。SSRF控制系統(tǒng)每年存檔的數(shù)據(jù)量可達1 TB以上,可為科研人員提供海量的歷史數(shù)據(jù)。但Channel Archiver原有的存檔方式在實際應用中也存在諸多不足[4],具體表現(xiàn)在:(1) Archiver Engine的數(shù)據(jù)存儲格式固定,用戶只能按時間戳等少有的幾個條件查詢,不能滿足用戶實際需求;(2) 歷史數(shù)據(jù)分散在眾多文件中,不利于各種應用程序訪問數(shù)據(jù)且管理不便。
為彌補EPICS自帶的Channel Archiver工具集的不足,同時用Windows操作系統(tǒng)下豐富的軟件和工具以便于程序功能的擴展,本存檔系統(tǒng)將工作于Linux平臺的Channel Archiver工具移植到Windows平臺,并改寫存檔引擎的數(shù)據(jù)存儲及檢索功能,引擎采集到的數(shù)據(jù)不再按照特定格式以文本形式存入本地磁盤,而是用Oracle作為中央數(shù)據(jù)庫集中存放。存檔引擎從IOC采集到的數(shù)據(jù)經(jīng)過緩沖區(qū)短暫保存后通過網(wǎng)絡實時寫入中央數(shù)據(jù)庫。中央數(shù)據(jù)庫提供強大的搜索計算功能,實現(xiàn)通用的數(shù)據(jù)管理,便捷了應用程序?qū)?shù)據(jù)的利用,并有利于以后的系統(tǒng)擴展。在中央數(shù)據(jù)庫的基礎上,為進一步提高數(shù)據(jù)通用性,系統(tǒng)采用Web Service的統(tǒng)一數(shù)據(jù)庫接口,極大地方便了以后各種應用程序的開發(fā)與功能擴展。
改進后的存檔系統(tǒng)軟件結(jié)構(gòu)如圖 1。存檔引擎啟動后讀取xml格式的配置信息,根據(jù)配置文件中提供的pv(process variable)信息,與IOC建立起基于CA的通道連接。連接建立完成后,按照scan、monitor和scan using monitors三種模式向IOC發(fā)送數(shù)據(jù)采集請求。當接收到從IOC傳送回的數(shù)據(jù)時,存檔引擎將數(shù)據(jù)臨時存放于為各個通道配置的buffer中,再通過引擎與中央數(shù)據(jù)庫的接口向中央數(shù)據(jù)庫寫入存檔數(shù)據(jù)。
圖1 存檔系統(tǒng)結(jié)構(gòu)圖Fig.1 Archiving system.
存檔系統(tǒng)中,中央數(shù)據(jù)庫表的設計尤為關鍵,關系到數(shù)據(jù)管理效率及應用程序利用數(shù)據(jù)是否便捷。存檔系統(tǒng)中的中央數(shù)據(jù)庫由通道數(shù)據(jù)表、通道表和通道參數(shù)表組成。通道數(shù)據(jù)表(表1)為存檔數(shù)據(jù)庫主表,保存通道連接后采集的通道數(shù)據(jù),用常規(guī)類型字段結(jié)合XMLType字段的方式,將通道類型、通道數(shù)據(jù)個數(shù)、報警狀態(tài)等主要數(shù)據(jù)以常規(guī)類型字段保存,將不適合常規(guī)字段保存的特殊格式數(shù)據(jù)用XMLType字段保存。通道表是通道名稱與通道id的對照表,用整型id代替以字符串形式表示的通道名,可提高存儲和查詢效率,并能有效節(jié)省存儲空間。通道參數(shù)表保存每次通道連接后的通道參數(shù)信息。通道的參數(shù)信息通常不變,只在重新連接后變化,因此用一張表單獨保存以節(jié)省空間。
表1 通道數(shù)據(jù)表Table 1 Channel data table.
對一條通道數(shù)據(jù)表中保存的數(shù)據(jù),可通過select語句查詢pv_id為1021的通道數(shù)據(jù)而獲得,各字段數(shù)值間以頓號隔開,分別對應表1中pv_id之后的字段:5、6、1、21-12月-0903.46.24.942000 下午、2、349598253、630189716、2、。
存檔系統(tǒng)中,中央數(shù)據(jù)庫采用Oracle 10g Enterprise Edition Release 10.2.0.4.0,運行平臺為惠普公司的ProLiant DL580 G3服務器,服務器操作系統(tǒng)為Centos4.5。本存檔引擎在Windows XP Professional操作系統(tǒng)下運行。EPICS本身沒有Oracle數(shù)據(jù)庫接口,本文用OTL作為存檔程序與Oracle操控接口。OTL(Oracle, Odbc and DB2-CLI Template Library)是一個C++編譯中操控關系數(shù)據(jù)庫的模板庫,其通過Oracle提供的OCI接口直接操作Oracle數(shù)據(jù)庫,有運行效率極高、代碼簡潔、部署容易、無需.net framework支持等優(yōu)點。OTL框架的實現(xiàn)是對流觀念的實現(xiàn),系統(tǒng)主要通過otl_stream操作數(shù)據(jù),主要操作語句如下:
當OTL緩沖區(qū)被SQL填滿時,OTL流將自動刷新緩沖區(qū),批量執(zhí)行緩沖區(qū)中所有的SQL語句。存檔系統(tǒng)中的SQL操作主要為INSERT語句,緩沖區(qū)的大小將影響其執(zhí)行時機及服務器磁盤I/O性能,合理設置緩沖區(qū)大小對存檔系統(tǒng)有重要意義。
在配置為CPU主頻2.4 GHz、內(nèi)存2 G的機器測試插入105條數(shù)據(jù)響應耗時,當緩沖區(qū)大小為1100條記錄時,響應耗時5385 ms,當緩沖區(qū)大小分別為1150和1050時,響應耗時為5423 ms和5437 ms,繼續(xù)增大或減小緩沖區(qū),響應耗時會繼續(xù)增長??梢姡摍C器上運行存檔引擎的最佳緩沖區(qū)大小為1100條。
Web應用程序訪問數(shù)據(jù)庫的主流接口實現(xiàn)技術(shù)主要有CGI(Common Gateway Interface)和Web Service技術(shù)。CGI是Web服務器與CGI應用程序間信息傳遞的一種標準,幾乎所有Web服務器都支持CGI標準。但由于CGI應用程序一般都是一個獨立的可執(zhí)行實體,與Web服務器各自占據(jù)不同進程,且一個CGI程序只能處理一個用戶請求,大量的用戶請求會導致極其可觀的內(nèi)存和CPU占用。Web Service是分布式計算領域發(fā)展的前沿技術(shù),是一種可接收從Internet或其它系統(tǒng)中傳遞請求的輕量級、獨立的通訊技術(shù)。Web Service采取簡單易理解的標準Web協(xié)議作組件界面描述和協(xié)同描述規(guī)范,通過XML、SOAP、WSDL和UDDI等技術(shù)[5]和規(guī)則屏蔽不同軟件平臺的差異[6],有高度通用性和易用性、高度集成性及容易發(fā)布和部署等優(yōu)點。Web Service能向外界提供一個通過網(wǎng)絡調(diào)用的API(Application Programming Interface, 應用程序編程接口)。Web Service發(fā)布后,用編程的方法通過web調(diào)用這個應用程序,而調(diào)用服務的應用程序就是Web Service的客戶端。
Web Service用面向服務的體系架構(gòu)(SOA)[7]。SOA結(jié)構(gòu)中共有三種角色:服務提供者(Services provider)發(fā)布自己的服務,并對使用自身服務的請求進行響應;服務注冊者(Services broker)注冊已發(fā)布的服務提供者,對其分類,并提供搜索服務;服務請求者(Services requester)用服務注冊者查找所需的服務,然后使用該服務。這些角色間通過發(fā)布、查找和綁定等操作相聯(lián)系。
本系統(tǒng)采用Web Service提供應用程序訪問中央數(shù)據(jù)庫的統(tǒng)一接口,存檔系統(tǒng)采用的數(shù)據(jù)庫接口中間件的 Web服務體系結(jié)構(gòu)如圖 2。為實現(xiàn) Web Service中事務處理、安全性和身份識別等功能,系統(tǒng)中用 XFire技術(shù)開發(fā) Web Services應用程序。XFire[8]是 codehaus推出的設計上面向文檔的 Java SOAP框架,是新一代Web Services引擎。XFire通過提供簡單的API及支持標準協(xié)議,方便地開發(fā)面向服務的應用程序。XFire內(nèi)建在STAX基于流的XML解析引擎基礎上,有很高的性能。XFire框架是一種基于Servlet技術(shù)的SOA應用開發(fā)框架,要在基于XFire應用框架開發(fā)的企業(yè)中正常運行,需JDK和Servlet容器的支持。本系統(tǒng)采用JDK版本5.0,用Tomcat(版本為5.5.9)作XFire的運行容器,XFire為1.2.6版本。
圖2 Web服務體系結(jié)構(gòu)圖Fig.2 Web services architecture.
系統(tǒng)中用于生成web services應用java文件的主體為通過JDBC連接到Oracle的鏈接類,其主要偽代碼如下:
上海光源(SSRF)采用EPICS控制系統(tǒng)作軟件平臺,Channel Archiver作EPICS自帶的數(shù)據(jù)存檔工具。由于SSRF數(shù)據(jù)量龐大,Channel Archiver采用的文本文件形式的本地存儲方案及數(shù)據(jù)格式不能完全滿足日常應用需求。新設計的存檔系統(tǒng)采用Oracle作為中央數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)的實時存檔及管理,并用Web Service技術(shù)提供不同系統(tǒng)環(huán)境及編程語言下應用程序訪問中央數(shù)據(jù)庫的統(tǒng)一接口,增強了系統(tǒng)的功能性與擴展性。存檔系統(tǒng)中引擎的設計根據(jù)Channel Archiver源代碼改寫。經(jīng)測試表明,系統(tǒng)可長時間穩(wěn)定運行。
1 國家上海同步輻射裝置中心(籌).上海同步輻射裝置工程初步設計, 2001 National Center for Shanghai Synchrotron Radiation Facility (plan).Shanghai Synchrotron Radiation Facility project preliminary design, 2001
2 EPICS–Experimental Physics and Industrial Control System.http://www.aps.anl.gov/epics/
3 Shanghai Synchrotron Radiation Facility.http://ssrf.sinap.ac.cn/english/1/Introduction.htm
4 祝 晴, 蔣舸揚, 李 林, 等.核電子學與探測技術(shù),2007, 5(3): 521–522 ZHU Qing, JIANG Geyang, LI Lin, et al.Nucl Electron Detect Technol, 2007, 5(3): 521–522
5 W3C.org.Web Services Architecture.http://www.w3.org/TR/ws-arch/
6 鄔海波, 吳保國.電腦知識與技術(shù), 2009, 11(31):8628–8631 WU Haibo, WU Baoguo.Comput Knowl Technol, 2009,11(31): 8628–8631
7 Kuassi Mensah.Oracle database programming using Java and Web Services.USA: Elsevier Digital Press, 2006
8 Codehaus XFire.http://xfire.codehaus.org/