劉 英,張 墨,黃茂海
(1. 中國科學(xué)院國家天文臺,北京 100101; 2. 中國科學(xué)院大學(xué)天文與空間科學(xué)學(xué)院,北京 100049;3. 中國科學(xué)院空間天文與技術(shù)重點實驗室,北京 100101)
中法合作天文衛(wèi)星(Space multi-band Variable Object Monitor, SVOM)的研究對象是來自宇宙深處的伽瑪射線爆發(fā),伽瑪暴是宇宙中極端明亮的瞬變源,產(chǎn)生于大質(zhì)量恒星塌縮或致密雙星并合時恒星級黑洞或磁星噴射出的在視線方向的極端相對論性噴流(1)A類先導(dǎo)專項實施方案-SVOM科學(xué)應(yīng)用系統(tǒng)二期。伽瑪暴爆發(fā)時,在很小的空間釋放了巨大的能量,如伽瑪暴和引力波暴等瞬變源光學(xué)對應(yīng)體的后隨觀測與搜索對研究瞬變源的物理屬性有重要作用[1]。伽瑪暴研究具有拓寬或根本改變對一些重大天體物理問題認(rèn)識的潛力。中法合作天文衛(wèi)星通過對科學(xué)目標(biāo)的實現(xiàn),為研究暫現(xiàn)源涉及的從恒星、星系到宇宙學(xué)等天體物理學(xué)中的多領(lǐng)域,解決相關(guān)天體物理學(xué)領(lǐng)域的若干重大問題提供觀測和數(shù)據(jù)基礎(chǔ)(2)A類先導(dǎo)專項實施方案-SVOM科學(xué)應(yīng)用系統(tǒng)二期。
天文數(shù)據(jù)檔案庫系統(tǒng)是中法合作天文衛(wèi)星中方科學(xué)中心的重要組成部分,實現(xiàn)科學(xué)數(shù)據(jù)產(chǎn)品長期存檔與數(shù)據(jù)產(chǎn)品查詢檢索,支持各級數(shù)據(jù)產(chǎn)品、工程數(shù)據(jù)、標(biāo)定數(shù)據(jù)、輔助數(shù)據(jù)等的管理,數(shù)據(jù)產(chǎn)品版本可控,保證數(shù)據(jù)的安全性與完整性。數(shù)據(jù)檔案系統(tǒng)提供統(tǒng)一的用戶及數(shù)據(jù)存取管理平臺,實現(xiàn)跨平臺對科學(xué)數(shù)據(jù)產(chǎn)品存儲、檢索、提取、維護(hù)、分析、控制功能(3)光學(xué)載荷數(shù)據(jù)處理存儲解決方案-用戶手冊。
作為國際合作項目,中法合作天文衛(wèi)星天文數(shù)據(jù)檔案庫系統(tǒng)需要在中法雙方不同單位和場景進(jìn)行測試、集成、調(diào)試。與一般基于互聯(lián)網(wǎng)的應(yīng)用部署不同,天文軟件一般在部署運行時需要非常多的第三方庫支持,運行時也有諸多參數(shù)以滿足不同要求。天文領(lǐng)域?qū)θ萜骷夹g(shù)的使用還停留在天文應(yīng)用軟件的封裝層面[2],如何讓天文學(xué)家快捷方便地使用天文數(shù)據(jù)檔案庫系統(tǒng),讓測試人員在中法雙方調(diào)試環(huán)境中,不會因服務(wù)器遷移而進(jìn)行重新部署測試環(huán)境的重復(fù)勞動,針對國際合作項目中服務(wù)器需要遷移的工作需求,即在中法雙方調(diào)試環(huán)境中運行,可以采用將容器鏡像導(dǎo)入法方服務(wù)器的方式,啟動需要的容器服務(wù),降低部署過程中出現(xiàn)問題的風(fēng)險,節(jié)約時間和人力成本。容器技術(shù)具有輕量級、易移植且保證環(huán)境一致性的特點,為天文數(shù)據(jù)檔案庫系統(tǒng)環(huán)境部署和測試的首選解決方案。
容器是基于Go語言實現(xiàn)的云開源項目,其核心解決的問題是利用LXC實現(xiàn)類似虛擬機(jī)的功能,用更加節(jié)省的硬件資源給用戶提供更多的計算資源。 容器的主要目標(biāo)是在任何地方構(gòu)建、發(fā)布和運行任何應(yīng)用程序,通過對應(yīng)用程序的封裝(Packaging)、分發(fā)(Distribution)、部署(Deployment)、運行(Runtime)等生命周期的管理,真正實現(xiàn) “一次封裝,隨處運行”[3]。
容器技術(shù)具有標(biāo)準(zhǔn)化、輕量級、遷移性和擴(kuò)展性等顯著特點,為了更好地理解容器技術(shù),需要了解兩個非常重要的基本概念:
(1)鏡像(Image):是類似虛擬機(jī)的鏡像,可以將它理解為一個面向容器引擎的只讀模板,包含文件系統(tǒng)[3]。鏡像可以從Docker Hub公共鏡像源中下載,也可以在本地自行創(chuàng)建。
(2)容器(Container):是運行起來的鏡像,所有容器運行在鏡像上,如果把鏡像理解為程序,那么容器可以看作是進(jìn)程。
在軟件測試中,軟件環(huán)境的搭建直接影響測試結(jié)果的準(zhǔn)確性和真實性。很多軟件測試人員都有使用虛擬機(jī)的經(jīng)驗,即在傳統(tǒng)物理機(jī)的基礎(chǔ)上克隆虛擬機(jī),這種鏡像具有真實Windows, Linux操作系統(tǒng)的功能,在此基礎(chǔ)上安裝軟件,配置參數(shù),解決軟件測試環(huán)境搭建和資源緊張的難題。
容器技術(shù)快速部署,高效構(gòu)建應(yīng)用,與宿主機(jī)共享內(nèi)核資源優(yōu)勢,使測試人員在保證測試環(huán)境的標(biāo)準(zhǔn)性、數(shù)據(jù)隔離性和缺陷環(huán)境重現(xiàn)中得到很好的應(yīng)用。特別是秒級的快速啟動容器服務(wù),軟件測試效率顯著提高。
容器相對于虛擬機(jī),在輕量級、資源利用率方面具有明顯的優(yōu)勢。從圖1(4)https://www.docker.com/resources/what-container的對比可以看到,由于容器技術(shù)是虛擬化操作系統(tǒng)而不是硬件,是應(yīng)用程序的抽象,多個容器可以在同一臺機(jī)器上運行,與其他容器共享操作系統(tǒng),占用空間少,可以處理更多的應(yīng)用程序,從而減少對操作系統(tǒng)的需求。虛擬機(jī)是物理硬件的抽象,每個虛擬機(jī)都包含操作系統(tǒng)、應(yīng)用程序及必要的二進(jìn)制文件和庫③。
圖1 容器與虛擬機(jī)的對比
Fig.1 Docker Vs VM
天文數(shù)據(jù)檔案庫主要實現(xiàn)科學(xué)數(shù)據(jù)產(chǎn)品長期存檔、數(shù)據(jù)產(chǎn)品查詢、檢索、提取及分析等功能,支持跨平臺運行,主要給用戶提供管理接口、數(shù)據(jù)注入接口、數(shù)據(jù)檢索接口以及數(shù)據(jù)獲取接口。軟件運行支持Linux平臺,在項目測試中,服務(wù)器端操作系統(tǒng)使用Ubuntu, 數(shù)據(jù)庫使用MySQL,網(wǎng)絡(luò)服務(wù)器使用Tomcat,客戶端運行使用赫歇爾空間天文臺的地面系統(tǒng)軟件平臺(Herschel Interactive Processing Environment),它是歐洲空間局最復(fù)雜的大型空間項目赫歇爾空間天文臺的地面系統(tǒng)軟件平臺[4]。
針對項目的實際運行情況,需要滿足數(shù)據(jù)處理功能要求、系統(tǒng)的長期可擴(kuò)展性、后期大系統(tǒng)集成測試和上天設(shè)備的同步運行等各種復(fù)雜因素,如果采用傳統(tǒng)的服務(wù)器客戶端部署系統(tǒng)環(huán)境測試,勢必造成每一次變動需要重新部署測試環(huán)境,耗費大量的時間和人力成本。
天文數(shù)據(jù)檔案庫系統(tǒng)作為中法雙方合作項目,不同科學(xué)家常常使用不同軟件開發(fā)語言版本,比如在中方運行環(huán)境中使用科學(xué)數(shù)據(jù)檢索Python2的腳本沒有錯誤,在法方部署環(huán)境中運行法國科學(xué)家創(chuàng)建的科學(xué)數(shù)據(jù)檢索Python3的腳本出現(xiàn)運行拋錯,雖然可以采用工具如Python Virtual Environment或者Anaconda幫助解決版本不同的問題,但是安裝工具Anaconda中本身碰到的錯誤,如選擇是否添加到系統(tǒng)路徑還是使用默認(rèn)Python的路徑不正確,直接導(dǎo)致使用Python運行出錯。如果有一種更為快捷的方式幫助測試人員快速進(jìn)行環(huán)境配置,準(zhǔn)確定位發(fā)現(xiàn)軟件的缺陷,使測試工作進(jìn)行更加順暢。
采用容器技術(shù),在軟件測試中保證復(fù)雜的天文軟件環(huán)境一致,重現(xiàn)測試中發(fā)現(xiàn)的軟件缺陷并復(fù)制測試環(huán)境,有效運用有限的測試環(huán)境資源和人力資源,極大地提高測試工作效率。
通過圖2可以看到,容器技術(shù)如何在實際項目測試環(huán)境搭建中的應(yīng)用。
圖2 天文數(shù)據(jù)檔案庫測試模塊及環(huán)境部署圖
Fig.2 Astronomical data archive system testing modules and environment deployment diagram
(1)首先建立一個宿主機(jī)環(huán)境,本項目使用Ubuntu 14.04.5并在該環(huán)境下安裝Docker軟件包和依賴包,
(2)建立數(shù)據(jù)庫容器,下載MySQL 5.7鏡像,使用命令
docker pull mysql/mysql-server: 5.7.24
啟動容器并指定端口3306,將數(shù)據(jù)庫容器的端口映射到宿主機(jī)上,使用命令
docker run -p 3306: 3306--name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
成功啟動數(shù)據(jù)庫容器并進(jìn)入,將數(shù)據(jù)庫配置文件my.cnf中port修改為容器啟動的端口3306,執(zhí)行SQL語句創(chuàng)建用戶管理庫及創(chuàng)建權(quán)限庫。
(3)建立天文數(shù)據(jù)檔案庫應(yīng)用程序容器,拉取Tomcat-7.0.67容器鏡像,使用命令
docker pull tomcat: 7.0.67
啟動容器并指定端口8000,使用命令
docker run -p 8000: 8000 tomcat: 7.0.67
運行容器,將數(shù)據(jù)檔案庫應(yīng)用程序war包復(fù)制到該容器對應(yīng)的路徑,并進(jìn)行相關(guān)參數(shù)以及數(shù)據(jù)庫的配置,輸入正確的數(shù)據(jù)庫容器IP和數(shù)據(jù)庫密碼,重新啟動容器使用命令
docker stop
docker start
可以通過curl命令在應(yīng)用程序容器里檢查天文數(shù)據(jù)檔案庫應(yīng)用程序容器和數(shù)據(jù)庫容器連接是否成功
curl http://ip: 3306
(4)建立用戶管理子系統(tǒng)容器, 拉取Tomcat-6.0.45容器鏡像并指定端口啟動容器,使用命令
docker pull tomcat: 6.0.45
成功啟動并進(jìn)入容器,對相應(yīng)配置文件和數(shù)據(jù)庫進(jìn)行配置,重啟容器,檢查數(shù)據(jù)注入是否成功
(5)建立天文數(shù)據(jù)檔案庫系統(tǒng)鏡像,對數(shù)據(jù)庫容器、天文數(shù)據(jù)檔案庫應(yīng)用程序容器、用戶管理子系統(tǒng)容器創(chuàng)建新的容器鏡像,使用命令
docker commit -a “tester” -m “test”
完成鏡像創(chuàng)建后,通過docker images查看新創(chuàng)建鏡像是否已經(jīng)在本地提交。
(6)導(dǎo)出導(dǎo)入鏡像,針對天文數(shù)據(jù)檔案庫系統(tǒng)需要在中法雙方調(diào)試的實際需求,可以通過導(dǎo)出在中方調(diào)試成功的鏡像,導(dǎo)入法方運行環(huán)境中,從而避免部署過程中出現(xiàn)問題,使測試人員更加關(guān)注軟件功能測試。導(dǎo)出鏡像使用命令
docker save -o test.tar test: v01
導(dǎo)入鏡像使用命令
docker load--input test.tar
(7)天文數(shù)據(jù)檔案庫系統(tǒng)中載荷數(shù)據(jù)處理存儲解決方案,提供應(yīng)用程序接口依賴于HIPE[4]提供的ProductStorage Java API接口②,實現(xiàn)天文數(shù)據(jù)檔案庫在HIPE中交互訪問,在HIPE腳本指令區(qū),通過腳本調(diào)用產(chǎn)品歸檔、檢索、獲取、分析功能,在HIPE控制臺區(qū),可以查看腳本運行的結(jié)果,即通過數(shù)據(jù)注入接口和數(shù)據(jù)查詢接口成功將數(shù)據(jù)產(chǎn)品存入天文數(shù)據(jù)檔案庫并查詢已存入的科學(xué)數(shù)據(jù)產(chǎn)品。
(8)通過圖3可以看到,容器技術(shù)在天文數(shù)據(jù)檔案庫系統(tǒng)測試中的應(yīng)用即容器創(chuàng)建、運行、提交鏡像的全流程,將數(shù)據(jù)庫、應(yīng)用程序、用戶管理子系統(tǒng)分別部署在3個不同的容器;對用戶管理子系統(tǒng)和應(yīng)用程序的各個模塊進(jìn)行測試,驗證科學(xué)數(shù)據(jù)產(chǎn)品存儲、檢索、提取、維護(hù)、分析、控制功能是否正常工作;將測試通過的容器鏡像提交到容器倉庫。
測試人員都有這樣的經(jīng)驗,同樣的環(huán)境配置和產(chǎn)品發(fā)布版本,在不同的機(jī)器或者不同的集成環(huán)境中安裝有可能失敗,造成這樣的結(jié)果有很多因素,而環(huán)境的標(biāo)準(zhǔn)化無疑是這種問題的有效解決方式。通過以上項目實例,容器技術(shù)在天文數(shù)據(jù)檔案庫系統(tǒng)測試中的主要優(yōu)勢有以下幾點:
圖3 天文數(shù)據(jù)檔案庫系統(tǒng)測試流程圖
(1)測試環(huán)境標(biāo)準(zhǔn)化:在傳統(tǒng)測試工作中,不同操作系統(tǒng)和數(shù)據(jù)庫版本有不同限制,比如Linux平臺中Ubuntu和Centos,運行安裝命令完全不同,Ubuntu安裝命令執(zhí)行apt-get,Centos安裝命令執(zhí)行yum。在天文數(shù)據(jù)檔案庫系統(tǒng)測試中,因為MySQL版本不同,SQL語句執(zhí)行datetime字段出現(xiàn)高版本5.7運行低版本SQL語句拋錯,數(shù)據(jù)不能導(dǎo)入的錯誤。
天文數(shù)據(jù)檔案庫系統(tǒng)測試環(huán)境選用Ubuntu14和MySQL5.7,在交付用戶的使用環(huán)境采用容器將操作系統(tǒng)和數(shù)據(jù)庫打包到新的鏡像,容器標(biāo)準(zhǔn)化使開發(fā)、測試、運維環(huán)境保持一致[5],避免用戶由于使用不同版本操作系統(tǒng)或數(shù)據(jù)庫造成運行程序拋錯,在需要調(diào)試排錯時,開發(fā)測試人員可以直接使用打包鏡像針對問題研究,而不會因環(huán)境問題損耗時間。
(2)測試安裝簡潔化:軟件測試過程中,安裝測試是測試工作的第1步,也是軟件功能、集成、壓力測試的重要保障。在傳統(tǒng)測試過程中,以天文數(shù)據(jù)檔案庫系統(tǒng)為例,由于項目設(shè)計需要安裝不同版本的網(wǎng)絡(luò)服務(wù)器Tomcat,在設(shè)置環(huán)境參數(shù)CATALINA_HOME時,不注意區(qū)分多版本共存的問題,極易導(dǎo)致啟動一個Tomcat而另一個版本的Tomcat也啟動。
選擇容器技術(shù),在同一個宿主機(jī)環(huán)境里,運行兩個不同版本Tomcat容器,在每個容器里配置對應(yīng)的環(huán)境參數(shù),通過不同的端口映射到宿主機(jī),分別啟動兩個容器,環(huán)境隔離有效避免了因環(huán)境參數(shù)配置的問題,導(dǎo)致啟動一個Tomcat 而另外一個啟動的錯誤。安裝測試時間減少,安裝測試步驟更加簡化,卸載安裝時只需要刪除容器,在幾秒鐘內(nèi)啟動一個新的基礎(chǔ)容器進(jìn)行環(huán)境配置,快速解決環(huán)境卸載不干凈的問題。
(3)測試功能擴(kuò)展性:天文數(shù)據(jù)檔案庫系統(tǒng)采用迭代開發(fā)模式,通過用戶使用反饋逐步完善產(chǎn)品功能,傳統(tǒng)測試過程中,每次發(fā)布新的應(yīng)用程序版本或產(chǎn)品功能修改更新,測試人員需要重新搭建測試環(huán)境,重復(fù)勞動造成測試工作效率降低。
運用容器技術(shù),可以把Tomcat6.0/7.0作為基礎(chǔ)鏡像,每次發(fā)布新的應(yīng)用程序版本,在基礎(chǔ)鏡像上更新配置快速搭建新環(huán)境,通過對各個獨立容器進(jìn)行擴(kuò)展實現(xiàn)無縫化伸縮,而不需要對整個應(yīng)用程序進(jìn)行重新開發(fā)。同時在SVOM VOEvent網(wǎng)絡(luò)系統(tǒng)中,也成功應(yīng)用容器技術(shù)部署VOEvent原型系統(tǒng),對中方科學(xué)中心的復(fù)雜項目集成測試工作流程和效率帶來極大提高[6]。
(4)測試數(shù)據(jù)隔離性:傳統(tǒng)軟件測試過程中,常常因為測試數(shù)據(jù)的增加,特別是天文軟件環(huán)境配置復(fù)雜,天文數(shù)據(jù)檔案庫系統(tǒng)需要多次采用不同類型和不同數(shù)據(jù)量的數(shù)據(jù)進(jìn)行測試,將各個子系統(tǒng)和數(shù)據(jù)庫都部署在一個環(huán)境,極易造成測試中產(chǎn)生臟數(shù)據(jù),重復(fù)讀取數(shù)據(jù)的問題。
采用將數(shù)據(jù)庫、應(yīng)用程序、用戶管理子系統(tǒng)分別部署在不同的容器,實現(xiàn)各自獨立,測試數(shù)據(jù)分離,測試環(huán)境干凈,可以隨時切換測試場景,方便定位軟件缺陷。同時,數(shù)據(jù)庫容器獨立,需要卸載數(shù)據(jù)庫,通過容器刪除命令就可以簡單實現(xiàn),避免卸載數(shù)據(jù)庫環(huán)境不干凈的問題。
(5)問題重現(xiàn)便捷性:軟件測試的一個重要目的是盡可能多地發(fā)現(xiàn)軟件的缺陷。作為測試人員,發(fā)現(xiàn)缺陷后重現(xiàn)問題環(huán)境是幫助推進(jìn)修正軟件缺陷的重要工作環(huán)節(jié),即使將代碼和數(shù)據(jù)同時發(fā)布,比如一些未做文檔記錄的假設(shè)項、依賴項、配置項都會使重現(xiàn)問題非常困難[7]。傳統(tǒng)測試過程中,由于測試數(shù)據(jù)交叉,測試案例復(fù)雜,發(fā)現(xiàn)軟件缺陷常常無法將測試環(huán)境共享給開發(fā)團(tuán)隊。如果用傳統(tǒng)虛擬機(jī)快照技術(shù)復(fù)制測試環(huán)境(包含操作系統(tǒng)),極易造成資源占用過大[8]。
對于本項目測試中碰到的SQL語句版本問題導(dǎo)致數(shù)據(jù)不能導(dǎo)入數(shù)據(jù)庫,因為需要對數(shù)據(jù)庫本身的調(diào)試和對天文數(shù)據(jù)檔案庫的集成調(diào)試,找到建立用戶系統(tǒng)不成功的根源,數(shù)據(jù)庫、應(yīng)用程序、用戶管理子系統(tǒng)幾個容器都需要保證問題環(huán)境完全相同,通過容器鏡像可以在幾秒內(nèi)把測試環(huán)境成功復(fù)制,容器共享宿主機(jī)操作系統(tǒng),層級簡化,磁盤空間占用少。在試驗中Docker1.4.1的環(huán)境新建一個容器需要12 KB磁盤空間,而同樣的測試環(huán)境用虛擬機(jī)做快照占用資源將超過100 MB[9]。
表1 天文數(shù)據(jù)檔案庫系統(tǒng)容器技術(shù)應(yīng)用和傳統(tǒng)測試方法對比
從表1可以看到,容器化服務(wù)器端環(huán)境并應(yīng)用于軟件測試中,相比傳統(tǒng)的測試方法,可以極大地節(jié)省測試人員部署調(diào)試環(huán)境的時間,使測試環(huán)境標(biāo)準(zhǔn)化、測試數(shù)據(jù)隔離性、重現(xiàn)問題環(huán)境更加便捷。同時各個系統(tǒng)部署在各自獨立的容器,進(jìn)行配置連接,形成統(tǒng)一的整體應(yīng)用程序,容器技術(shù)的這種高擴(kuò)展性對于可以將應(yīng)用程序獨立于各個容器設(shè)計的項目尤為適用。在整個項目測試過程中,同時運行多個容器,對中央處理器、磁盤、內(nèi)存等資源占用率小,啟動和備份相對于傳統(tǒng)虛擬機(jī)技術(shù)速度顯著加快。容器技術(shù)的應(yīng)用,為測試環(huán)境的穩(wěn)定性和標(biāo)準(zhǔn)化提供了快捷高效的解決方案,為軟件測試工作效率提高和成本降低提供了保障。
致謝:感謝劉飛飛老師對項目測試過程中的技術(shù)建議。感謝SVOM項目組工程人員在測試和系統(tǒng)搭建過程中給予的建議和幫助。