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