楊永毅,趙芳,趙思亮
(重慶市氣象信息與技術(shù)保障中心,重慶 401147)
近年來重慶市氣象局開始進(jìn)行虛擬資源池建設(shè),截至目前為止,已創(chuàng)建并分配虛擬機(jī)300多個,多個氣象業(yè)務(wù)平臺由物理服務(wù)器移植到虛擬機(jī)。虛擬資源池的建設(shè),實現(xiàn)了硬件資源的集中式管理、集約化分配,提高了資源的利用率。
當(dāng)前出現(xiàn)了多種虛擬化技術(shù),包括VMware vSphere、KVM、Docker等。其中VMware vSphere是一個虛擬化平臺,將CPU、存儲和網(wǎng)絡(luò)資源等聚合為一個虛擬資源池,并使用統(tǒng)一的軟件,創(chuàng)建和運行虛擬機(jī)和虛擬設(shè)備[1]。然而隨著虛擬資源池規(guī)模的不斷擴(kuò)大,VMware vSphere性能損耗高,體量占用大,遷移擴(kuò)展復(fù)雜等弊端逐漸凸顯。KVM是一個開源軟件,基于內(nèi)核的虛擬化技術(shù),實際是嵌入系統(tǒng)的一個虛擬化模塊,虛擬機(jī)使用Linux自身的調(diào)度器進(jìn)行管理[2]。KVM與Linux內(nèi)核集成,運行速度快,但KVM需要CPU中虛擬化功能的支持,只可在具有虛擬化支持的CPU上運行[3],對硬件環(huán)境要求較高。而Docker技術(shù)將應(yīng)用程序與基礎(chǔ)架構(gòu)分離,以管理應(yīng)用程序相同的方式來管理基礎(chǔ)架構(gòu)。本文擬使用Docker技術(shù)中的容器發(fā)現(xiàn)發(fā)布、進(jìn)程隔離、彈性伸縮,計算環(huán)境遷移等功能,解決氣象云平臺服務(wù)中遇到的虛擬化問題。
本文通過對Docker技術(shù)的深入剖析,結(jié)合重慶市氣象局實際業(yè)務(wù)環(huán)境,提出了Docker技術(shù)在氣象云平臺服務(wù)中的應(yīng)用方法。并根據(jù)提出的方法,搭建了一個MySQL數(shù)據(jù)庫容器,實現(xiàn)了Docker技術(shù)在氣象服務(wù)中的應(yīng)用。
Docker是2013年由美國dotCloud公司開源的一個基于LXC的高級容器引擎,其源代碼托管在Github上。Docker使用go語言開發(fā),并遵從Apache2.0協(xié)議開源。Docker容器引擎讓開發(fā)者可以打包應(yīng)用及依賴包到可移植容器中,容器可發(fā)布到任意版本的Linux服務(wù)器上,容器是完全使用沙箱機(jī)制,相互之間沒有任何接口[4-7]。
傳統(tǒng)方式的虛擬機(jī)是在硬件層面實現(xiàn)虛擬化,需要有額外的虛擬機(jī)管理應(yīng)用和虛擬機(jī)操作系統(tǒng)層。每套虛擬系統(tǒng)都需要配置,軟件環(huán)境也需逐一安裝部署,缺乏靈活性。Docker容器是在操作系統(tǒng)層面上實現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng)。從資源占用上來說,更加輕量級;從應(yīng)用上來說,針對容器的虛擬移植性更強,靈活性更高[8]。Docker與傳統(tǒng)虛擬機(jī)技術(shù)的區(qū)別如圖1所示。
圖1 傳統(tǒng)虛擬方式與Docker對比
Docker采用的是Client/Server架構(gòu),客戶端向服務(wù)器發(fā)送請求,服務(wù)器負(fù)責(zé)構(gòu)建、運行和分發(fā)容器。客戶端和服務(wù)器可以運行在同一個Host上,客戶端也可以通過socket或REST API與遠(yuǎn)程服務(wù)器通信。Docker機(jī)制包括Image(鏡像)、Container(容器)和Repository(倉庫)。Docker鏡像類似于虛擬機(jī)鏡像,為只讀模板,包含了文件系統(tǒng)。容器是從鏡像創(chuàng)建的運行實例,可啟動、開始、停止、刪除,而容器間是相互隔離,獨立進(jìn)程的。鏡像是創(chuàng)建容器的基礎(chǔ),倉庫是Docker集中存放鏡像文件的場所[9-10]。Docker架構(gòu)如圖2所示。
圖2 Docker系統(tǒng)架構(gòu)
根據(jù)氣象云計算的資源共享層次,氣象云平臺可以劃分為3層:IaaS(基礎(chǔ)設(shè)施即服務(wù))、PaaS(平臺即服務(wù))和SaaS(軟件即服務(wù)),如圖3所示。IaaS的發(fā)展以虛擬機(jī)為最小粒度資源調(diào)度單位,PaaS在IaaS基礎(chǔ)上發(fā)展而來[11]。隨著氣象業(yè)務(wù)越來越復(fù)雜,出現(xiàn)了資源浪費、調(diào)度困難、標(biāo)準(zhǔn)不統(tǒng)一等問題,而容器技術(shù)可以解決以上問題。本課題依托重慶市氣象局現(xiàn)有的信息環(huán)境,提出Docker技術(shù)在重慶氣象云平臺的應(yīng)用方法。
圖3 IaaS、PaaS、SaaS分類
重慶市氣象局從2007年開始建立重慶市氣象信息共享服務(wù)接口系統(tǒng),采用SOA架構(gòu),通過服務(wù)接口的方式提供數(shù)據(jù)共享服務(wù),同時規(guī)定新建氣象信息系統(tǒng)必須遵循SOA標(biāo)準(zhǔn)。
Docker非常適合SOA的微服務(wù)架構(gòu),每一個單獨的Dockerfile代表一個微服務(wù),這些微服務(wù)與SOA架構(gòu)的傳統(tǒng)服務(wù)不同。傳統(tǒng)的服務(wù)通常是整體性的,模塊化和重用化困難,微服務(wù)則專注于體量小、重用性高的組件,盡可能與運行環(huán)境獨立。Docker提供服務(wù)的隔離,可以部署在多種環(huán)境執(zhí)行微服務(wù)?;贒ocker容器的部署,可以進(jìn)一步深化SOA的氣象微服務(wù)架構(gòu),提高整個系統(tǒng)架構(gòu)的可移植性、可擴(kuò)展性、可編排性。
在重慶市氣象局實際的氣象系統(tǒng)開發(fā)中,大多是基于虛擬機(jī)來完成。開發(fā)測試環(huán)境以及生產(chǎn)環(huán)境需要多次安裝與部署,包括應(yīng)用服務(wù)器、數(shù)據(jù)庫服務(wù)器、中間件服務(wù)器等。配置工作重復(fù)繁瑣,需要花費大量時間。同時,由于配置的一致性問題,開發(fā)環(huán)境搭建失敗的案例時有發(fā)生。
基于Docker的虛擬化技術(shù),可將氣象開發(fā)環(huán)境虛擬成多個鏡像,集中管理。同時可以定制各種開發(fā)所需的個性鏡像及容器。Docker的快速部署能力,降低了環(huán)境部署的時間消耗,縮短了系統(tǒng)開發(fā)周期。輕量級的容器部署,減少了系統(tǒng)資源的消耗,同時又充分保證了不同開發(fā)環(huán)境的獨立。
在實際業(yè)務(wù)中,氣象系統(tǒng)的彈性部署大多依賴于人工。系統(tǒng)管理員根據(jù)氣象系統(tǒng)的資源使用率、并發(fā)量、系統(tǒng)性能等監(jiān)控信息,進(jìn)行氣象系統(tǒng)的橫向擴(kuò)展。這種被動的系統(tǒng)擴(kuò)張,容易造成資源的浪費,并且隨著系統(tǒng)規(guī)模的不斷增長,系統(tǒng)間的復(fù)雜度不斷增加,氣象系統(tǒng)維護(hù)的工作量激增。
基于Docker的容器虛擬化技術(shù),具有輕量級、靈活、啟動快速的優(yōu)點,非常適合氣象系統(tǒng)的彈性部署。結(jié)合Kubernetes等調(diào)度和編排技術(shù),使得Docker集群易于部署、維護(hù)和擴(kuò)展。Docker提高了系統(tǒng)資源的使用率,增加了系統(tǒng)并發(fā)處理能力,從而實現(xiàn)了氣象系統(tǒng)的彈性伸縮。
提供氣象業(yè)務(wù)多租戶服務(wù)是氣象云平臺最重要的功能。使用Docker,可為租戶應(yīng)用層的多個實例創(chuàng)建隔離環(huán)境。將虛擬機(jī)和Docker技術(shù)相結(jié)合,可以增強不同租戶、不同安全需求容器間的隔離性,同時避免強隔離帶來的性能損失。租戶租用容器云平臺的資源,用以氣象應(yīng)用服務(wù)的托管、開發(fā)、部署運維。容器云平臺為租戶提供服務(wù)注冊、服務(wù)發(fā)現(xiàn)、服務(wù)配置、監(jiān)控、預(yù)警告警、負(fù)載均衡等功能。
為了驗證Docker技術(shù)在氣象云平臺服務(wù)中的可行性,本文選用氣象服務(wù)中最常用的數(shù)據(jù)服務(wù)作為測試用例,使用Docker技術(shù)在云資源中搭建一個MySQL容器,提供氣象數(shù)據(jù)服務(wù)。與傳統(tǒng)虛擬機(jī)提供的數(shù)據(jù)服務(wù)相比較,測試基于Docker技術(shù)的氣象數(shù)據(jù)服務(wù)的性能。
本文使用兩個CPU16核,內(nèi)存32G的虛擬機(jī)進(jìn)行測試,一個直接在系統(tǒng)中安裝MySQL數(shù)據(jù)庫,一個在系統(tǒng)中安裝Docker容器,然后在容器中安裝MySQL數(shù)據(jù)庫,Docker的搭建流程如圖4所示。
圖4 Docker搭建流程
Docker搭建的具體步驟如下:
1) 在虛擬機(jī)中安裝Centos 7.0系統(tǒng),為Docker的運行提供環(huán)境支持。安裝完成后,進(jìn)行環(huán)境變量的設(shè)置。
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源倉庫配置完成后,執(zhí)行#yum install docker-engine命令,進(jìn)行Docker的安裝。
3) 啟動Docker,運行命令service docker start,測試Docker是否正常運行,運行命令docker run hello-world,正常運行情況如圖5所示。
圖5 Docker運行示例
4) 連接Docker公共倉庫下載MySQL鏡像,Docker公共倉庫默認(rèn)為Docker Hub鏡像倉庫。使用命令進(jìn)行鏡像的搜索和下載:
#docker search mysql
#docker pull mysql
5) 下載鏡像后,檢查本機(jī)安裝的鏡像和本機(jī)運行的容器,使用命令:
#docker s
#docker ps -a
6) 啟動MySQL容器,本文在1臺虛擬機(jī)上啟動了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查看容器運行狀態(tài)。
完成Docker容器搭建后,本文分別向虛擬機(jī)上的MySQL實例和Docker容器中的MySQL數(shù)據(jù)庫寫入氣象自動站小時觀測數(shù)據(jù),寫入數(shù)據(jù)量為10萬條和100萬條。測試結(jié)果如表1所示。
表1 Docker容器寫入測試結(jié)果
通過測試,可以發(fā)現(xiàn)基于輕量級數(shù)據(jù)庫,Docker容器和虛擬機(jī)的入庫效率相當(dāng),而Docker資源利用率更高,系統(tǒng)啟動速度更快,移植性更高,更適合氣象云平臺的服務(wù)要求。
本文引入的Docker容器在操作系統(tǒng)層面上實現(xiàn)了虛擬化,復(fù)用本地主機(jī)的操作系統(tǒng),更加輕量級。實驗證明,與虛擬機(jī)相比,容器在啟動速度、復(fù)雜度、并發(fā)性、資源利用率等方面均優(yōu)于虛擬機(jī)。在氣象云服務(wù)平臺建設(shè)中,可以根據(jù)實際業(yè)務(wù)確定適用場景,將虛擬機(jī)和容器有機(jī)地結(jié)合起來,有效提高平臺的可用性、可靠性以及伸縮性。后期氣象云服務(wù)平臺會逐漸形成數(shù)量龐大且關(guān)系復(fù)雜的容器集群,可以使用Kubernetes容器編排技術(shù)進(jìn)行容器集群的資源管理、調(diào)度以及負(fù)載均衡,進(jìn)一步提高氣象云服務(wù)平臺的計算服務(wù)能力。