□ 陸武生 韋于倩 李敏盛
Docker是一個(gè)虛擬化開源應(yīng)用容器引擎,擁有秒級(jí)的啟動(dòng)速度,CPU和內(nèi)存的資源占用少,空間占用小等優(yōu)勢(shì),開發(fā)者可以把自己的程序制作成一個(gè)Docker鏡像,發(fā)布到Linux和Windows機(jī)器上,并可輕松實(shí)現(xiàn)持續(xù)交付、部署、遷移、維護(hù)和擴(kuò)展。
Docker Swarm是Docker的集群管理工具,它是將若干臺(tái)已運(yùn)行Docker容器引擎的物理機(jī)器或虛擬主機(jī)組成集群,抽象成一個(gè)整體。集群的活動(dòng)由swarm管理器控制,加入集群的機(jī)器、主機(jī)稱為一個(gè)節(jié)點(diǎn)(Node)。一般來說,一個(gè)集群會(huì)有多個(gè)工作節(jié)點(diǎn)(Worker Node)和至少一個(gè)管理節(jié)點(diǎn)(Manager Node),管理節(jié)點(diǎn)負(fù)責(zé)集群的配置,服務(wù)管理,維護(hù)集群狀態(tài),向工作節(jié)點(diǎn)分配任務(wù),工作節(jié)點(diǎn)的任務(wù)就是運(yùn)行相應(yīng)的服務(wù)執(zhí)行管理節(jié)點(diǎn)分配的任務(wù)。開發(fā)者用服務(wù)形式多副本運(yùn)行自己的程序鏡像,程序副本會(huì)均衡部署在各個(gè)工作節(jié)點(diǎn)中。管理節(jié)點(diǎn)默認(rèn)也是工作節(jié)點(diǎn),只是比工作節(jié)點(diǎn)多了管理功能。圖1為Docker Swarm的集群架構(gòu)。
圖1 Docker Swarm的集群架構(gòu)
目前,廣西全區(qū)無線發(fā)射臺(tái)站中,三級(jí)以上臺(tái)站的站內(nèi)自動(dòng)化和遠(yuǎn)程監(jiān)控系統(tǒng)的應(yīng)用程序都部署在一臺(tái)工控計(jì)算機(jī)上,當(dāng)這臺(tái)計(jì)算機(jī)發(fā)生故障時(shí),所承載的應(yīng)用程序就無法正常工作,從而導(dǎo)致臺(tái)站自動(dòng)化和遠(yuǎn)程監(jiān)控功能失效。對(duì)此,本文提出一種設(shè)計(jì)方案,利用Docker Swarm將多臺(tái)支持 Docker的Linux、Windows的計(jì)算機(jī)或嵌入式設(shè)備組成云集群,提高硬件資源的利用率、負(fù)載均衡和可拓展性。自動(dòng)化和遠(yuǎn)程監(jiān)控程序以多副本的形式均衡部署在Docker Swarm的工作節(jié)點(diǎn)中,實(shí)現(xiàn)應(yīng)用程序分布式化。當(dāng)某個(gè)節(jié)點(diǎn)出現(xiàn)故障時(shí),Swarm管理器會(huì)在其他節(jié)點(diǎn)上新運(yùn)行故障節(jié)點(diǎn)所承載的任務(wù),確保了程序的正常運(yùn)行。自動(dòng)化和遠(yuǎn)程監(jiān)控程序的分布式,提高了站內(nèi)自動(dòng)化和遠(yuǎn)程運(yùn)維的穩(wěn)定型、可靠性,確保了廣播電視的正常播出。
Docker Swarm是Docker容器引擎自帶的一個(gè)集群工具,只要安裝Docker就會(huì)存在Docker Swarm。Docker容器引擎支持x86_64/amd64、ARM、ARM64等架構(gòu)的主流linux,MacOS,Windows 7以上的操作系統(tǒng),故 Docker和Docker Swarm能兼容主流的通用計(jì)算機(jī)、服務(wù)器和嵌入式計(jì)算機(jī)。Docker支持市面上主流的編程語言,包括c/c++,C#,go,hy,java,node,perl,php,python,rails和ruby等編程語言。目前,我們臺(tái)站端的控制計(jì)算機(jī)大部分還是XP系統(tǒng),小部分是Windows 7系統(tǒng)。未來,安裝xp系統(tǒng)的電腦,可以更換成linux操作系統(tǒng),即可以支持Docker。綜上所述,Docker Swarm在硬件和軟件上的兼容性良好,能滿足站內(nèi)自動(dòng)化和遠(yuǎn)程監(jiān)控系統(tǒng)分布式化部署的軟硬件需求。
Docker公司曾在2016年聘請(qǐng)了獨(dú)立技術(shù)顧問杰夫·尼科洛夫來協(xié)助搭建框架,測(cè)試Docker Swarm和另外一個(gè)集群工具Google Kubernetes在1000個(gè)節(jié)點(diǎn)集群上運(yùn)行30000個(gè)容器(每個(gè)節(jié)點(diǎn)30個(gè)容器)的性能,主要從容器啟動(dòng)時(shí)間和大負(fù)載的條件下系統(tǒng)列舉所有運(yùn)行的容器的響應(yīng)時(shí)間這兩項(xiàng)指標(biāo)進(jìn)行測(cè)試。測(cè)試過程中,當(dāng)集群資源占用率為10%時(shí),即100個(gè)節(jié)點(diǎn)和3000個(gè)容器時(shí),Docker Swarm容器的啟動(dòng)時(shí)間是0.36秒,列舉所有運(yùn)行容器的響應(yīng)時(shí)間是0.32秒,50%占用率時(shí)啟動(dòng)時(shí)間0.41秒,響應(yīng)時(shí)間1.18秒,100%占用率時(shí)啟動(dòng)時(shí)間0.59秒,響應(yīng)時(shí)間18.25秒。從測(cè)試數(shù)據(jù)中可以看出,Docker擁有秒級(jí)的啟動(dòng)速度,在未滿負(fù)荷運(yùn)行時(shí),系統(tǒng)響應(yīng)時(shí)間也是在秒級(jí)范圍。圖2、圖3分別為Docker Swarm和Google Kubernetes的啟動(dòng)時(shí)間、系統(tǒng)響應(yīng)時(shí)間對(duì)比圖。
圖2 Docker Swarm和Google Kubernetes的啟動(dòng)時(shí)間對(duì)比
圖3 Docker Swarm和Google Kubernetes系統(tǒng)響應(yīng)時(shí)間對(duì)比
Docker Swarm有內(nèi)部和外部?jī)煞N負(fù)載均衡,集群內(nèi)服務(wù)之間的相互訪問需要做負(fù)載均衡,稱為內(nèi)部負(fù)載均衡;從集群外部訪問服務(wù)的公開端口,也需要做負(fù)載均衡,稱為外部負(fù)載均衡,這里主要測(cè)試Swarm集群的外部負(fù)載均衡。
1.測(cè)試方法
(1)在集群中創(chuàng)建一個(gè)服務(wù),3個(gè)副本運(yùn)行,對(duì)外開放并監(jiān)聽12345/udp端口,這個(gè)服務(wù)的功能就是再啟動(dòng)時(shí)創(chuàng)建一個(gè)隨機(jī)ID,當(dāng)接收到客戶端發(fā)送來的數(shù)據(jù)時(shí),就實(shí)時(shí)給客戶端原路返回自己的ID和接收到的數(shù)據(jù)。
(2)然后在另外的計(jì)算機(jī)上運(yùn)行多個(gè)客戶端,向服務(wù)端的12345端口發(fā)送數(shù)據(jù),當(dāng)接收到服務(wù)端返回的服務(wù)ID和數(shù)據(jù)時(shí),就打印出來,通過服務(wù)ID來判斷Swarm是否通過負(fù)載均衡讓服務(wù)的不同副本來處理客戶端請(qǐng)求,從而達(dá)到測(cè)試目的。
2.測(cè)試平臺(tái)
本文使用2個(gè)Raspberry 3B、1個(gè)Raspberry 3B+和1一個(gè)Raspberry 4B等4個(gè)不同型號(hào)的嵌入式硬件,統(tǒng)一搭載linux內(nèi)核的Raspbian操作系統(tǒng),組成了一個(gè)Docker Swarm集群,用作負(fù)載均衡性能的測(cè)試平臺(tái)。參照官方的建議創(chuàng)建奇數(shù)的管理節(jié)點(diǎn),故配置了3個(gè)管理節(jié)點(diǎn),1個(gè)工作節(jié)點(diǎn),一共4個(gè)節(jié)點(diǎn)。服務(wù)端軟件和客戶端軟件使用DotNet Core框架,C#語言編寫。
3.測(cè)試步驟
(1)先將服務(wù)端程序制作發(fā)布成Docker鏡像,在Docker Swarm中以服務(wù)形式創(chuàng)建運(yùn)行3個(gè)副本,對(duì)外開放12345/udp端口,這時(shí)客戶端都可以通過集群的四個(gè)節(jié)點(diǎn)IP+12345端口對(duì)該服務(wù)進(jìn)行訪問。
(2)在不同的計(jì)算機(jī)上打開多個(gè)客戶端軟件,客戶端只通過某一個(gè)節(jié)點(diǎn)IP+12345端口,主動(dòng)不停地給服務(wù)端發(fā)送數(shù)據(jù),再實(shí)時(shí)將服務(wù)端返回的ID和數(shù)據(jù)打印出來。通過觀察數(shù)據(jù)發(fā)現(xiàn),即使通過同一節(jié)點(diǎn)IP訪問IP,不同的客戶端的打印出來的服務(wù)ID也不同,說明Docker Swarm給外部訪問做了負(fù)載均衡。圖4為客戶端打印服務(wù)端返回的ID和數(shù)據(jù)圖。
圖4 客戶端打印服務(wù)端返回的ID和數(shù)據(jù)圖
(3)同樣打開多個(gè)客戶端,隨機(jī)選擇4個(gè)節(jié)點(diǎn)中的一個(gè)IP訪問服務(wù)端,當(dāng)正常發(fā)送接收數(shù)據(jù)后,將其中正在運(yùn)行服務(wù)的Swarm節(jié)點(diǎn)設(shè)備斷電,這時(shí)有些客戶端雖然還在不停的往服務(wù)端發(fā)送數(shù)據(jù),但已無法接收到斷電服務(wù)端的數(shù)據(jù),當(dāng)超過10秒鐘都無數(shù)據(jù)時(shí),客戶端會(huì)再次隨機(jī)從剩下的3個(gè)節(jié)點(diǎn)中的一個(gè)繼續(xù)跟服務(wù)對(duì)接,這時(shí)客戶端會(huì)收到不同ID服務(wù)端返回的數(shù)據(jù)。通過在Swarm中查詢發(fā)現(xiàn),節(jié)點(diǎn)斷電后,服務(wù)的3個(gè)副本只剩下2個(gè),但是Swarm管理器也立即在另外一個(gè)節(jié)點(diǎn)將1個(gè)副本運(yùn)行起來,又恢復(fù)3個(gè)副本正常運(yùn)行。通過測(cè)試表明了當(dāng)某些節(jié)點(diǎn)發(fā)生故障時(shí),剩余的節(jié)點(diǎn)能承擔(dān)客戶端的請(qǐng)求,Swarm集群也會(huì)在另外的節(jié)點(diǎn)將服務(wù)副本運(yùn)行起來,恢復(fù)正常工作。
經(jīng)過上述對(duì)Docker Swarm的軟硬件兼容性、啟動(dòng)和系統(tǒng)響應(yīng)時(shí)間、負(fù)載均衡等三個(gè)技術(shù)方面可行性分析或測(cè)試,表明在全區(qū)無線發(fā)射臺(tái)站中使用docker Swarm將多個(gè)跨平臺(tái)的服務(wù)器、通用計(jì)算機(jī)、嵌入式計(jì)算機(jī)組成云化集群,自動(dòng)化和遠(yuǎn)程監(jiān)控程序?qū)崿F(xiàn)分布式化部署是可行的。且臺(tái)站當(dāng)前的計(jì)算機(jī)電腦,可以直接或者更換操作系統(tǒng)方式,加入進(jìn)集群中,不會(huì)造成資產(chǎn)浪費(fèi)。站內(nèi)自動(dòng)化和遠(yuǎn)程監(jiān)控程序的計(jì)算量并不高,無需高配置的計(jì)算機(jī)和嵌入式設(shè)備,分布式系統(tǒng)的實(shí)施能提高整個(gè)臺(tái)站系統(tǒng)的資源利用率、穩(wěn)定性、可靠性,也更好地保障了臺(tái)站播出安全。