牛 宵,董 林,蘇 醒
(1.山東省國土測繪院,山東 濟(jì)南 250102;2.北京圖新數(shù)聚科技有限公司,北京 100086;3.山東科技大學(xué),山東 青島 266590)
空間數(shù)據(jù)是測繪與地理信息相關(guān)領(lǐng)域的核心資產(chǎn),大部分研發(fā)與生產(chǎn)工作都是圍繞數(shù)據(jù)的采集與加工、更新與共享、分析與應(yīng)用展開的??臻g數(shù)據(jù)可以分為基于文件、基于數(shù)據(jù)庫、基于網(wǎng)絡(luò)服務(wù)以及應(yīng)用程序四類。各類數(shù)據(jù)的物理和邏輯存儲方式往往各不相同,部署、訪問與備份方法也有較大差異,缺乏統(tǒng)一高效的管理方案,數(shù)據(jù)安全方面也存在隱患。針對這一問題,本文提出一種基于Docker容器技術(shù)體系的方案,利用鏡像存儲各類空間數(shù)據(jù),通過Docker客戶端和私有倉庫實現(xiàn)數(shù)據(jù)管理。
Docker是一種開源的輕量化容器技術(shù),在IT領(lǐng)域已經(jīng)得以廣泛應(yīng)用[1-2]。最基本的Docker系統(tǒng)由應(yīng)用鏡像和容器引擎組成,前者用于存儲應(yīng)用及其依賴的軟件包,后者負(fù)責(zé)創(chuàng)建容器,將鏡像實例化為實際運(yùn)行狀態(tài)[3]。
與虛擬機(jī)(VM)類似,Docker能夠運(yùn)行不同的Linux發(fā)行版,容器之間彼此隔離,在很多場景下可以當(dāng)作輕量化、模塊化的VM使用。不同之處在于每個VM實例都要啟動其中的操作系統(tǒng)(OS)后才能運(yùn)行應(yīng)用程序,而Docker實例則是運(yùn)行于宿主OS的內(nèi)核上,因此不僅鏡像更小、啟動更快,能夠提供更接近于開封即用的用戶體驗,還可以避免VM中OS的授權(quán)費、運(yùn)行的資源消耗及獨立運(yùn)維成本(這些成本通常被稱作OS稅或VM稅)[3]。
Docker還有著完善的生態(tài)環(huán)境,Docker官方和第三方都提供了開源的鏡像管理和容器集群管理工具,可用于鏡像的編譯、發(fā)布、共享、版本管理以及容器或容器集群的啟停與參數(shù)配置;清華、中科大等高校及網(wǎng)易、阿里、騰訊等企業(yè)提供了Docker倉庫鏡像服務(wù);AWS、Azure、華為云等云計算平臺提供了對Docker集群的支持。此外,Docker與微服務(wù)架構(gòu)契合度很高,目前已經(jīng)成為該架構(gòu)主流的落地實施方案之一[4]。
得益于這些優(yōu)點,很多軟件選擇Docker鏡像作為發(fā)布形式,包括主流的Linux發(fā)行版、數(shù)據(jù)庫及很多領(lǐng)域的專業(yè)軟件以及大量的定制化應(yīng)用[5-8]。
基于容器技術(shù)的空間數(shù)據(jù)管理方案由數(shù)據(jù)持久化和數(shù)據(jù)管理2個子方案組成。前者負(fù)責(zé)以統(tǒng)一、規(guī)范、便利的形式實現(xiàn)各類數(shù)據(jù)的固化。在此基礎(chǔ)上,后者負(fù)責(zé)采用成熟、可靠、易用的技術(shù)方案實現(xiàn)共享、版本管理、部署、災(zāi)備等數(shù)據(jù)管理功能。
利用容器技術(shù)可以統(tǒng)一采用Docker鏡像的形式實現(xiàn)將各類空間數(shù)據(jù)的持久化。
1)基于文件的空間數(shù)據(jù)。將基于文件的空間數(shù)據(jù)打包為Docker鏡像主要是為了借助Docker相關(guān)工具進(jìn)行存儲管理??梢赃x擇Alpine Linux作為基礎(chǔ)鏡像(展開后大小僅為5.58 MB)進(jìn)行制作,使用時通過目錄映射進(jìn)行讀取。在此基礎(chǔ)上還可以向鏡像添加FTP、SFTP、NFS等文件服務(wù)功能,實現(xiàn)更多訪問方式。
2)空間數(shù)據(jù)庫??臻g數(shù)據(jù)庫可以打包為Docker鏡像,在需要時掛載執(zhí)行[9-10]。鏡像分為兩類:一是在包含數(shù)據(jù)庫管理系統(tǒng)的鏡像中集成壓縮后的數(shù)據(jù)庫備份文件,在鏡像實例化時執(zhí)行初始化和導(dǎo)入;二是直接提供開封即用的鏡像。前者體積較小,但是初始化可能需要一定的時間;后者存儲的是展開后的數(shù)據(jù)庫,體積較大,但是可以直接啟用??梢愿鶕?jù)數(shù)據(jù)庫使用的頻繁程度和緊急程度選擇合適的鏡像類別。
3)空間數(shù)據(jù)服務(wù)。與空間數(shù)據(jù)庫類似,也可以將配置好的空間數(shù)據(jù)服務(wù)發(fā)布工具以及所需的數(shù)據(jù)或者數(shù)據(jù)庫集成為Docker鏡像。集成時應(yīng)注意解耦,把邏輯上耦合相對緊密的服務(wù)打包為同一個Docker鏡像,較為松散的則拆分至不同鏡像。這樣既符合微服務(wù)的技術(shù)理念,也能夠減少單個實例的資源消耗,方便部署更多服務(wù)。基于同樣的理由,規(guī)模較小、內(nèi)容較簡單的服務(wù)還應(yīng)考慮使用不依賴數(shù)據(jù)庫的實現(xiàn)方式。
4)3S應(yīng)用程序。從存儲的角度來看,GIS、GPS和RS應(yīng)用程序也是一種數(shù)據(jù)。Docker技術(shù)原本的目的就包括簡化應(yīng)用部署、提高系統(tǒng)的可伸縮性,因此也可以為3S應(yīng)用帶來相應(yīng)的優(yōu)勢[6]。和普通IT領(lǐng)域的應(yīng)用不同,這些應(yīng)用往往依賴于數(shù)以百計的類庫,例如安裝集成GRASS GIS和Python插件的QGIS時需要安裝上千個軟件包。在裸機(jī)或虛擬機(jī)上進(jìn)行部署經(jīng)常會遇到版本沖突、軟件源缺失等問題,給應(yīng)用的開發(fā)、部署造成很大障礙。操作系統(tǒng)一旦升級也經(jīng)常會出現(xiàn)類似問題。利用Docker技術(shù)則可以通過虛擬化技術(shù)提供一個統(tǒng)一的、輕量化的系統(tǒng)環(huán)境,在應(yīng)用部署中有更明顯的優(yōu)勢。此外,容器運(yùn)行環(huán)境彼此隔離,可以配置多個實例而不出現(xiàn)資源共享沖突,對應(yīng)用快速擴(kuò)容和負(fù)載均衡有很大的幫助。
對于固化為Docker鏡像的空間數(shù)據(jù),可以通過圖1和圖2所示的空間數(shù)據(jù)管理體系實現(xiàn)數(shù)據(jù)的分發(fā)、共享、備份、版本管理以及應(yīng)用部署流程的標(biāo)準(zhǔn)化,降低運(yùn)維成本,以提高工作效率。
圖1 基于Docker的空間數(shù)據(jù)管理體系架構(gòu)
圖1為空間數(shù)據(jù)管理體系的整體架構(gòu),由組(例如一個項目組、一個部門等)、本地鏡像和容器應(yīng)用服務(wù)器、遠(yuǎn)程鏡像和容器應(yīng)用服務(wù)器以及冷備份設(shè)備組成,通過局域網(wǎng)和公共互聯(lián)網(wǎng)或?qū)S脧V域網(wǎng)(例如政務(wù)網(wǎng))進(jìn)行連接。圖2對工作組內(nèi)部組織架構(gòu)進(jìn)行了說明。
圖2 組內(nèi)架構(gòu)
該數(shù)據(jù)管理體系一般包括組、本地(單位層面)和遠(yuǎn)程3個層面的Docker倉庫與應(yīng)用系統(tǒng)。其核心理念在于利用Docker技術(shù)體系實現(xiàn)數(shù)據(jù)和應(yīng)用管理的規(guī)范化、便捷化,降低安全風(fēng)險和管理成本。在應(yīng)用中,可以按照實際情況靈活取舍,例如規(guī)模較小的單位可以僅保留本地和遠(yuǎn)程2個倉庫層級、倉庫僅保存核心數(shù)據(jù)資產(chǎn)等,規(guī)模較大的單位可以增加層級。
體系中,數(shù)據(jù)分發(fā)與共享通過各級鏡像倉庫和Docker官方客戶端來實現(xiàn)。個人或者組內(nèi)倉庫可以使用支持快速部署模式但權(quán)限管理功能較弱的Docker Registry實現(xiàn);本地和異地倉庫可以使用Nexus3倉庫發(fā)布工具實現(xiàn),該工具提供細(xì)粒度的權(quán)限管理功能,能夠單獨設(shè)定指定賬號對指定倉庫的讀寫及管理員權(quán)限,具有更高的安全性。數(shù)據(jù)的發(fā)布與同步、檢索、獲取通過Docker客戶端的push、search和pull命令以及Docker倉庫提供的HTTP API來實現(xiàn),也可以使用相應(yīng)的圖形界面客戶端。各級倉庫存儲內(nèi)容按需裁剪,例如個人倉庫可以存儲個人的臨時數(shù)據(jù),而組內(nèi)倉庫則存儲組內(nèi)需要共享或者備份的數(shù)據(jù),本地倉庫僅存儲要在單位范圍內(nèi)應(yīng)用的數(shù)據(jù),異地倉庫則是存儲關(guān)鍵數(shù)據(jù),公有倉庫僅存儲不涉密的數(shù)據(jù)。
數(shù)據(jù)的版本管理通過Docker鏡像版本標(biāo)簽來實現(xiàn),Docker鏡像使用了基于容器層的差分存儲技術(shù),在舊版本的基礎(chǔ)上生成新版本鏡像只需要新增發(fā)生改動的容器層,因此能夠在完整保留歷史版本的同時有效減少存儲資源的消耗。
應(yīng)用的部署可以通過Kubernetes等容器管理平臺來實現(xiàn)。本方案采用的是標(biāo)準(zhǔn)的Docker倉庫,與這些平臺完全兼容,支持應(yīng)用的動態(tài)加載和快速擴(kuò)容。
數(shù)據(jù)備份則通過鏡像倉庫的冷備份和各級鏡像倉庫的同步來實現(xiàn)。Nexus3以及Docker Registry等倉庫發(fā)布工具均通過統(tǒng)一的路徑來實現(xiàn)倉庫元數(shù)據(jù)和鏡像數(shù)據(jù)的存儲,這為冷備份提供了很大的便利;各級鏡像倉庫的同步可以保證最重要的數(shù)據(jù)能有多個備份;遠(yuǎn)程倉庫可以實現(xiàn)異地備份。采用這種數(shù)據(jù)備份模式,一方面能夠以較低的運(yùn)維成本實現(xiàn)兩地三中心這種高等級的容災(zāi)備份模式,另一方面Docker開封即用的技術(shù)特點也能為業(yè)務(wù)的迅速恢復(fù)提供有力支撐。
為促進(jìn)商業(yè)企業(yè)進(jìn)行營銷優(yōu)化,四維圖新商業(yè)服務(wù)部(圖新數(shù)聚)自2015年開始提供在線的客群覆蓋分析服務(wù),所使用的基礎(chǔ)數(shù)據(jù)每個季度更新一次,歷史數(shù)據(jù)歸檔。使用過程中發(fā)現(xiàn)該服務(wù)存在以下不足:一是數(shù)據(jù)量很大導(dǎo)致服務(wù)的部署與更新耗時較長,并且會影響其他服務(wù)的運(yùn)行;二是運(yùn)行所需計算資源較多,擴(kuò)容成本高;三是難以迅速啟用歷史版本;四是災(zāi)備對人工操作依賴度較高。
為解決這些問題,應(yīng)用本文所述方案對該服務(wù)進(jìn)行改造。服務(wù)各版本均打包為Docker鏡像,在北京、武漢以及云倉庫上進(jìn)行同步;服務(wù)根據(jù)需求使用內(nèi)網(wǎng)或云上的Docker管理平臺進(jìn)行指定版本的部署,服務(wù)的實例數(shù)動態(tài)調(diào)整。以上措施不僅使版本切換與服務(wù)擴(kuò)容變得易于實現(xiàn),也降低了服務(wù)的成本,還提供了高等級的容災(zāi)備份能力,較好的達(dá)到了改造目標(biāo)。
本文提出一種利用容器技術(shù)進(jìn)行空間數(shù)據(jù)管理的方案,能夠為空間數(shù)據(jù)共享與備份、應(yīng)用的分發(fā)與部署以及它們的檢索和版本管理提供一種規(guī)范、安全、低運(yùn)維成本,高可用性的模式。該方案已經(jīng)在四維圖新數(shù)據(jù)生產(chǎn)和工信部國產(chǎn)計算機(jī)平臺技術(shù)論證項目中得到了初步應(yīng)用,驗證了其可行性和有效性。筆者在https://github.com/asdawn/docker4gis對相關(guān)軟件安裝配置方法以及常見問題進(jìn)行了詳細(xì)說明。
需要特別指出的是,隨著國產(chǎn)計算機(jī)硬件和操作系統(tǒng)的逐步推廣,測繪系統(tǒng)內(nèi)大量已有應(yīng)用必然要針對ARM指令集CPU和Linux操作系統(tǒng)(例如飛騰處理器和麒麟操作系統(tǒng))進(jìn)行重構(gòu)。在此過程中,Docker技術(shù)在降低應(yīng)用開發(fā)難度、提高系統(tǒng)穩(wěn)定性和可用性方面能夠提供很大幫助。因此,采用該方案也有助于將后實現(xiàn)技術(shù)的平穩(wěn)過渡。