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