楊永毅,趙芳,趙思亮
(重慶市氣象信息與技術保障中心,重慶 401147)
近年來重慶市氣象局開始進行虛擬資源池建設,截至目前為止,已創建并分配虛擬機300多個,多個氣象業務平臺由物理服務器移植到虛擬機。虛擬資源池的建設,實現了硬件資源的集中式管理、集約化分配,提高了資源的利用率。
當前出現了多種虛擬化技術,包括VMware vSphere、KVM、Docker等。其中VMware vSphere是一個虛擬化平臺,將CPU、存儲和網絡資源等聚合為一個虛擬資源池,并使用統一的軟件,創建和運行虛擬機和虛擬設備[1]。然而隨著虛擬資源池規模的不斷擴大,VMware vSphere性能損耗高,體量占用大,遷移擴展復雜等弊端逐漸凸顯。KVM是一個開源軟件,基于內核的虛擬化技術,實際是嵌入系統的一個虛擬化模塊,虛擬機使用Linux自身的調度器進行管理[2]。KVM與Linux內核集成,運行速度快,但KVM需要CPU中虛擬化功能的支持,只可在具有虛擬化支持的CPU上運行[3],對硬件環境要求較高。而Docker技術將應用程序與基礎架構分離,以管理應用程序相同的方式來管理基礎架構。本文擬使用Docker技術中的容器發現發布、進程隔離、彈性伸縮,計算環境遷移等功能,解決氣象云平臺服務中遇到的虛擬化問題。
本文通過對Docker技術的深入剖析,結合重慶市氣象局實際業務環境,提出了Docker技術在氣象云平臺服務中的應用方法。并根據提出的方法,搭建了一個MySQL數據庫容器,實現了Docker技術在氣象服務中的應用。
Docker是2013年由美國dotCloud公司開源的一個基于LXC的高級容器引擎,其源代碼托管在Github上。Docker使用go語言開發,并遵從Apache2.0協議開源。Docker容器引擎讓開發者可以打包應用及依賴包到可移植容器中,容器可發布到任意版本的Linux服務器上,容器是完全使用沙箱機制,相互之間沒有任何接口[4-7]。
傳統方式的虛擬機是在硬件層面實現虛擬化,需要有額外的虛擬機管理應用和虛擬機操作系統層。每套虛擬系統都需要配置,軟件環境也需逐一安裝部署,缺乏靈活性。Docker容器是在操作系統層面上實現虛擬化,直接復用本地主機的操作系統。從資源占用上來說,更加輕量級;從應用上來說,針對容器的虛擬移植性更強,靈活性更高[8]。Docker與傳統虛擬機技術的區別如圖1所示。

圖1 傳統虛擬方式與Docker對比
Docker采用的是Client/Server架構,客戶端向服務器發送請求,服務器負責構建、運行和分發容器??蛻舳撕头掌骺梢赃\行在同一個Host上,客戶端也可以通過socket或REST API與遠程服務器通信。Docker機制包括Image(鏡像)、Container(容器)和Repository(倉庫)。Docker鏡像類似于虛擬機鏡像,為只讀模板,包含了文件系統。容器是從鏡像創建的運行實例,可啟動、開始、停止、刪除,而容器間是相互隔離,獨立進程的。鏡像是創建容器的基礎,倉庫是Docker集中存放鏡像文件的場所[9-10]。Docker架構如圖2所示。

圖2 Docker系統架構
根據氣象云計算的資源共享層次,氣象云平臺可以劃分為3層:IaaS(基礎設施即服務)、PaaS(平臺即服務)和SaaS(軟件即服務),如圖3所示。IaaS的發展以虛擬機為最小粒度資源調度單位,PaaS在IaaS基礎上發展而來[11]。隨著氣象業務越來越復雜,出現了資源浪費、調度困難、標準不統一等問題,而容器技術可以解決以上問題。本課題依托重慶市氣象局現有的信息環境,提出Docker技術在重慶氣象云平臺的應用方法。

圖3 IaaS、PaaS、SaaS分類
重慶市氣象局從2007年開始建立重慶市氣象信息共享服務接口系統,采用SOA架構,通過服務接口的方式提供數據共享服務,同時規定新建氣象信息系統必須遵循SOA標準。
Docker非常適合SOA的微服務架構,每一個單獨的Dockerfile代表一個微服務,這些微服務與SOA架構的傳統服務不同。傳統的服務通常是整體性的,模塊化和重用化困難,微服務則專注于體量小、重用性高的組件,盡可能與運行環境獨立。Docker提供服務的隔離,可以部署在多種環境執行微服務。基于Docker容器的部署,可以進一步深化SOA的氣象微服務架構,提高整個系統架構的可移植性、可擴展性、可編排性。
在重慶市氣象局實際的氣象系統開發中,大多是基于虛擬機來完成。開發測試環境以及生產環境需要多次安裝與部署,包括應用服務器、數據庫服務器、中間件服務器等。配置工作重復繁瑣,需要花費大量時間。同時,由于配置的一致性問題,開發環境搭建失敗的案例時有發生。
基于Docker的虛擬化技術,可將氣象開發環境虛擬成多個鏡像,集中管理。同時可以定制各種開發所需的個性鏡像及容器。Docker的快速部署能力,降低了環境部署的時間消耗,縮短了系統開發周期。輕量級的容器部署,減少了系統資源的消耗,同時又充分保證了不同開發環境的獨立。
在實際業務中,氣象系統的彈性部署大多依賴于人工。系統管理員根據氣象系統的資源使用率、并發量、系統性能等監控信息,進行氣象系統的橫向擴展。這種被動的系統擴張,容易造成資源的浪費,并且隨著系統規模的不斷增長,系統間的復雜度不斷增加,氣象系統維護的工作量激增。
基于Docker的容器虛擬化技術,具有輕量級、靈活、啟動快速的優點,非常適合氣象系統的彈性部署。結合Kubernetes等調度和編排技術,使得Docker集群易于部署、維護和擴展。Docker提高了系統資源的使用率,增加了系統并發處理能力,從而實現了氣象系統的彈性伸縮。
提供氣象業務多租戶服務是氣象云平臺最重要的功能。使用Docker,可為租戶應用層的多個實例創建隔離環境。將虛擬機和Docker技術相結合,可以增強不同租戶、不同安全需求容器間的隔離性,同時避免強隔離帶來的性能損失。租戶租用容器云平臺的資源,用以氣象應用服務的托管、開發、部署運維。容器云平臺為租戶提供服務注冊、服務發現、服務配置、監控、預警告警、負載均衡等功能。
為了驗證Docker技術在氣象云平臺服務中的可行性,本文選用氣象服務中最常用的數據服務作為測試用例,使用Docker技術在云資源中搭建一個MySQL容器,提供氣象數據服務。與傳統虛擬機提供的數據服務相比較,測試基于Docker技術的氣象數據服務的性能。
本文使用兩個CPU16核,內存32G的虛擬機進行測試,一個直接在系統中安裝MySQL數據庫,一個在系統中安裝Docker容器,然后在容器中安裝MySQL數據庫,Docker的搭建流程如圖4所示。

圖4 Docker搭建流程
Docker搭建的具體步驟如下:
1) 在虛擬機中安裝Centos 7.0系統,為Docker的運行提供環境支持。安裝完成后,進行環境變量的設置。
2) 配置yum源倉庫,通過yum源下載Docker安裝包。yum源倉庫配置如下:
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
yum源倉庫配置完成后,執行#yum install docker-engine命令,進行Docker的安裝。
3) 啟動Docker,運行命令service docker start,測試Docker是否正常運行,運行命令docker run hello-world,正常運行情況如圖5所示。

圖5 Docker運行示例
4) 連接Docker公共倉庫下載MySQL鏡像,Docker公共倉庫默認為Docker Hub鏡像倉庫。使用命令進行鏡像的搜索和下載:
#docker search mysql
#docker pull mysql
5) 下載鏡像后,檢查本機安裝的鏡像和本機運行的容器,使用命令:
#docker s
#docker ps -a
6) 啟動MySQL容器,本文在1臺虛擬機上啟動了2個MySQL容器,用以測試容器的性能,2個容器的啟動命令如下:
#docker run --name mysqltest1 -v /home/mysqltest1/conf/my.cnf:/etc/my.cnf -v /home/mysqltest1/logs:/logs -v /home/mysqltest1/data:/mysql_data -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
#docker run --name mysqltest2 -v /home/mysqltest2/conf/my.cnf:/etc/my.cnf -v /home/mysqltest2/logs:/logs -v /home/mysqltest2/data:/mysql_data -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
啟動容器后,使用#docker ps查看容器運行狀態。
完成Docker容器搭建后,本文分別向虛擬機上的MySQL實例和Docker容器中的MySQL數據庫寫入氣象自動站小時觀測數據,寫入數據量為10萬條和100萬條。測試結果如表1所示。

表1 Docker容器寫入測試結果
通過測試,可以發現基于輕量級數據庫,Docker容器和虛擬機的入庫效率相當,而Docker資源利用率更高,系統啟動速度更快,移植性更高,更適合氣象云平臺的服務要求。
本文引入的Docker容器在操作系統層面上實現了虛擬化,復用本地主機的操作系統,更加輕量級。實驗證明,與虛擬機相比,容器在啟動速度、復雜度、并發性、資源利用率等方面均優于虛擬機。在氣象云服務平臺建設中,可以根據實際業務確定適用場景,將虛擬機和容器有機地結合起來,有效提高平臺的可用性、可靠性以及伸縮性。后期氣象云服務平臺會逐漸形成數量龐大且關系復雜的容器集群,可以使用Kubernetes容器編排技術進行容器集群的資源管理、調度以及負載均衡,進一步提高氣象云服務平臺的計算服務能力。