聞彩麗,蔣文怡
(北京交通大學(xué) 電子信息工程學(xué)院, 北京 100044)
近年來(lái),為了實(shí)現(xiàn)鐵路內(nèi)部各信息系統(tǒng)之間的數(shù)據(jù)共享與業(yè)務(wù)協(xié)同,以及能在同一網(wǎng)絡(luò)基礎(chǔ)上開(kāi)展業(yè)務(wù)和采用新技術(shù),需要將相關(guān)業(yè)務(wù)系統(tǒng)以及業(yè)務(wù)數(shù)據(jù)遷移到云計(jì)算平臺(tái)上[1]。為了保證鐵路信息系統(tǒng)能在云上穩(wěn)定運(yùn)行,平臺(tái)需要提供統(tǒng)一的監(jiān)控服務(wù)來(lái)實(shí)時(shí)地監(jiān)控物理服務(wù)器的狀態(tài)和資源使用信息,對(duì)出現(xiàn)的異常及時(shí)告警,由運(yùn)維人員進(jìn)行快速處理。開(kāi)源的監(jiān)控軟件Zabbix由于其強(qiáng)大的展現(xiàn)功能和可擴(kuò)展性被廣泛使用。但是由于鐵路的覆蓋范圍廣泛,需要在不同的鐵路局集團(tuán)公司部署云計(jì)算平臺(tái),同時(shí)也需要在不同的云計(jì)算中心部署監(jiān)控服務(wù)?,F(xiàn)有的Zabbix部署方式是通過(guò)在服務(wù)器上下載安裝包,然后由運(yùn)維人員手工進(jìn)行安裝和系統(tǒng)配置。這種部署方式操作繁多、效率低[2-3],實(shí)現(xiàn)的監(jiān)控系統(tǒng)通常只能監(jiān)控平臺(tái)的基礎(chǔ)設(shè)備,對(duì)平臺(tái)中重要的容器服務(wù)的狀態(tài)和性能信息是無(wú)法監(jiān)控的[4]。本文基于云計(jì)算中的容器技術(shù),提出了基于Zabbix軟件的監(jiān)控系統(tǒng)的自動(dòng)化部署方式。同時(shí),實(shí)現(xiàn)的監(jiān)控系統(tǒng)可以監(jiān)控物理服務(wù)器上的各項(xiàng)指標(biāo)參數(shù)。
Zabbix作為一個(gè)基于Web界面的企業(yè)級(jí)監(jiān)控軟件,主要是用來(lái)監(jiān)控網(wǎng)絡(luò)的眾多參數(shù)以及服務(wù)器健康的完整性軟件,以保證服務(wù)器系統(tǒng)能夠安全運(yùn)營(yíng)[5]。Zabbix提供了靈活的通知機(jī)制,允許用戶為任何事件配置基于電子郵件的警報(bào),實(shí)現(xiàn)對(duì)服務(wù)器問(wèn)題的快速響應(yīng)[6]。Zabbix是由服務(wù)組件共同協(xié)作來(lái)完成監(jiān)控服務(wù)的,包含的組件如下。
(1)Zabbix Server:是 Zabbix的核心組件,可以通過(guò)SNMP,Zabbix Agent 等方式提供對(duì)遠(yuǎn)程服務(wù)器、網(wǎng)絡(luò)設(shè)備的監(jiān)控和數(shù)據(jù)收集功能。
(2)MysqL:負(fù)責(zé)用來(lái)存儲(chǔ)用戶的配置信息和從Agent上收集到的數(shù)據(jù)。
(3)ZabbixProxy:常用于分布式監(jiān)控環(huán)境中,代理Server收集部分被監(jiān)控的數(shù)據(jù)并統(tǒng)一發(fā)往Server端。
(4)Zabbix Web:提供Web界面,方便用戶通過(guò)界面瀏覽每個(gè)服務(wù)器的數(shù)據(jù)信息和監(jiān)控狀態(tài)。
(5)Zabbix Agent: 部署在被監(jiān)控主機(jī)上,負(fù)責(zé)收集本地?cái)?shù)據(jù),并將數(shù)據(jù)發(fā)往Server端或Proxy端。
當(dāng)需要被監(jiān)控的主機(jī)的數(shù)量較多時(shí),可以基于Zabbix的分布式架構(gòu),實(shí)現(xiàn)監(jiān)控系統(tǒng)的可用性和可擴(kuò)展性。監(jiān)控系統(tǒng)的分布式架構(gòu)圖,如圖1所示。
圖1 監(jiān)控系統(tǒng)的分布式架構(gòu)圖
Zabbix可以用來(lái)監(jiān)控不同的物理設(shè)備。這里只介紹對(duì)物理主機(jī)的監(jiān)控。Zabbix已經(jīng)提供了一些強(qiáng)大的的功能,如圖2的功能概括圖所示,實(shí)現(xiàn)了對(duì)主機(jī)的全面監(jiān)控。
(1)為主機(jī)關(guān)聯(lián)模板:Zabbix提供的默認(rèn)模板,已經(jīng)定義好了監(jiān)控項(xiàng)可以直接使用。我們也可以創(chuàng)建自定義監(jiān)控項(xiàng)。
(2)主機(jī)監(jiān)控指標(biāo)收集:實(shí)現(xiàn)這一功能的前提是已在主機(jī)上部署了Zabbix Agent服務(wù),在模板關(guān)聯(lián)后,就開(kāi)始收集數(shù)據(jù)。
(3)問(wèn)題自動(dòng)檢測(cè):在創(chuàng)建監(jiān)控項(xiàng)時(shí),需要為監(jiān)控項(xiàng)設(shè)置觸發(fā)器,系統(tǒng)會(huì)自動(dòng)檢測(cè)獲取的數(shù)據(jù)是否會(huì)超過(guò)閾值。
(4)告警及時(shí)通知:當(dāng)系統(tǒng)檢測(cè)到問(wèn)題時(shí),需要通知相關(guān)人員進(jìn)行查看和處理。
(5)監(jiān)控?cái)?shù)據(jù)可視化顯示:為了方便用戶查看監(jiān)控信息的變動(dòng),可以通過(guò)可視化界面將數(shù)據(jù)以圖像的形式顯示出來(lái)。
圖2 監(jiān)控系統(tǒng)的功能概括圖
Zabbix提供的主機(jī)默認(rèn)監(jiān)控項(xiàng)有CPU、內(nèi)存、硬盤(pán)、網(wǎng)絡(luò)接口以及操作系統(tǒng)的相關(guān)監(jiān)控信息等。這些監(jiān)控項(xiàng)只是從主機(jī)的系統(tǒng)信息的角度考慮。在主機(jī)上還有許多用來(lái)構(gòu)建云平臺(tái)的服務(wù)容器還沒(méi)有監(jiān)控起來(lái),當(dāng)某個(gè)容器掛掉之后,云平臺(tái)對(duì)外提供服務(wù)就會(huì)受到影響。尤其是對(duì)于大量的鐵路業(yè)務(wù)數(shù)據(jù)的存儲(chǔ)是通過(guò)ceph容器實(shí)現(xiàn)的。這時(shí)就需要能實(shí)時(shí)監(jiān)控容器的狀態(tài)和性能信息。因此我們需要在原有監(jiān)控項(xiàng)的基礎(chǔ)上通過(guò)編寫(xiě)腳本來(lái)實(shí)現(xiàn)對(duì)容器模板和監(jiān)控項(xiàng)的自定義。
實(shí)現(xiàn)Zabbix系統(tǒng)的自動(dòng)化部署到服務(wù)的快速啟動(dòng)過(guò)程,需要借助Docker技術(shù)和AnsibLe技術(shù)。Docker通過(guò)構(gòu)建鏡像來(lái)將Zabbix相關(guān)服務(wù)組件進(jìn)行容器化。AnsibLe用來(lái)實(shí)現(xiàn)將各個(gè)組件容器在多個(gè)主機(jī)上進(jìn)行自動(dòng)化部署和系統(tǒng)配置[7]。
Docker是一個(gè)開(kāi)源項(xiàng)目,它基于Linux內(nèi)核的Cgroup、Namespace等技術(shù),對(duì)進(jìn)程進(jìn)行封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術(shù)[8]。由于隔離的進(jìn)程獨(dú)立于宿主機(jī)和其它的進(jìn)程,因此也稱(chēng)其為容器,這與虛擬機(jī)的虛擬化技術(shù)有著明顯的差別。如圖3所示,虛擬機(jī)的虛擬化實(shí)現(xiàn)是在物理硬件和操作系統(tǒng)之間加了一層中間軟件層,即Hypervisor,它可以對(duì)下層的硬件資源進(jìn)行封裝、隔離、抽象,使它們成為另一種形式的邏輯資源,再提供給上層的虛擬機(jī)[9]。對(duì)每個(gè)虛擬機(jī)來(lái)說(shuō)都擁有獨(dú)立的操作系統(tǒng)。對(duì)于容器的虛擬化實(shí)現(xiàn)來(lái)說(shuō),容器是共享主機(jī)的操作系統(tǒng)的。在操作系統(tǒng)的上層通過(guò)通過(guò)Docker Engine,將不同的應(yīng)用鏡像打包,使它們相互隔離[10]。
圖3 容器和虛擬化技術(shù)的比較
Ansible是一個(gè)自動(dòng)化運(yùn)維工具,可以實(shí)現(xiàn)批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能[11]。Anisble包含許多基于Python編寫(xiě)的模塊,為部署提供某項(xiàng)具體的功能。Ansible要完成在多個(gè)主機(jī)上部署服務(wù)的功能,不僅需要模塊的支持,還需要通過(guò)Hosts文件來(lái)管理這些主機(jī),默認(rèn)通過(guò)SSH來(lái)實(shí)現(xiàn)主機(jī)之間的通信。在主機(jī)上執(zhí)行的任務(wù)通常是通過(guò)playbooks來(lái)定義的,將多個(gè)任務(wù)也就是執(zhí)行的命令定義在roles文件中,由Ansible自動(dòng)執(zhí)行的。由于Ansible具有配置簡(jiǎn)單、擴(kuò)展性強(qiáng)、部署簡(jiǎn)單等優(yōu)勢(shì),被廣泛應(yīng)用在了云計(jì)算平臺(tái)。
監(jiān)控系統(tǒng)是通過(guò)在多個(gè)主機(jī)上部署Zabbix服務(wù)組件,由組件之間互相通信來(lái)實(shí)現(xiàn)的。傳統(tǒng)的部署方式需要操作人員下載安裝包,手動(dòng)進(jìn)行安裝,這種方式不適合用于在多個(gè)主機(jī)上部署服務(wù)。基于Docker技術(shù),將Zabbix的服務(wù)組件容器化。基于AnsibLe技術(shù),實(shí)現(xiàn)服務(wù)的自動(dòng)化部署過(guò)程。Zabbix容器化到自動(dòng)化部署的過(guò)程,如圖4所示。
圖4 Zabbix容器化到自動(dòng)化部署的實(shí)現(xiàn)流程圖
3.1.1 鏡像的構(gòu)建和推送
Zabbix各個(gè)組件鏡像的制作是Docker 通過(guò)執(zhí)行Dockerfile文件來(lái)實(shí)現(xiàn)的。Dockerfile文件中包括基礎(chǔ)鏡像,以及在基礎(chǔ)鏡像的上執(zhí)行的一些命令和定義的參數(shù)。構(gòu)建出的鏡像是與主機(jī)環(huán)境隔離的,不受主機(jī)環(huán)境的影響。將構(gòu)建好的鏡像通過(guò)Docker命令推送到自己的代碼倉(cāng)庫(kù)中方便管理。Zabbix中需要制作鏡像的組件包括:Zabbix Server、Zabbix Web、Zabbix Proxy、Zabbix Agent。圖5是Zabbix-agent的Dockerfile文件主要代碼。
3.1.2 自動(dòng)化部署的實(shí)現(xiàn)
自動(dòng)化部署是基于Ansible技術(shù)通過(guò)編寫(xiě)部署代碼來(lái)實(shí)現(xiàn)的。其中,包括對(duì)Zabbix服務(wù)容器的的啟動(dòng)、配置和擴(kuò)展的自動(dòng)化實(shí)現(xiàn)。自動(dòng)化部署的代碼實(shí)現(xiàn)流程圖,如圖6所示。
其中,group_vars文件夾中all.yml定義的是部署Zabbix各個(gè)服務(wù)組件時(shí)用到的一些常用變量,包括各個(gè)鏡像的名稱(chēng)、容器的名稱(chēng)、數(shù)據(jù)庫(kù)的地址、用戶和密碼等。inventory文件夾中的hosts文件定義的是要部署服務(wù)的主機(jī)組和主機(jī)。roles文件夾下定義的是要執(zhí)行的任務(wù)以及執(zhí)行任務(wù)的先后順序。順序如下:
(1)為了方便數(shù)據(jù)的統(tǒng)一管理,我們選擇在云計(jì)算平臺(tái)的數(shù)據(jù)庫(kù)添加Zabbix數(shù)據(jù)庫(kù)。正如圖6中所示,需要?jiǎng)?chuàng)建Zabbix數(shù)據(jù)庫(kù)、用戶、密碼,用戶和密碼是用來(lái)登錄Zabbix數(shù)據(jù)庫(kù)的。
(2)啟動(dòng)Zabbix Server、Zabbix Web 容器。需要先從Docker倉(cāng)庫(kù)中拉取該服務(wù)的鏡像來(lái)啟動(dòng)容器。該服務(wù)需要部署到將要作為Server的物理節(jié)點(diǎn)上,讓這兩服務(wù)先對(duì)外提供服務(wù),為后面的服務(wù)連接提供保障。
(3)在已經(jīng)啟動(dòng)好的Zabbix Server中在創(chuàng)建主機(jī)組和導(dǎo)入自定義的模板。當(dāng)部署多個(gè)異地的云計(jì)算中心時(shí),監(jiān)控系統(tǒng)也需要部署多個(gè),該步驟可以保證不同監(jiān)控系統(tǒng)的起始數(shù)據(jù)的一致性。這使得維護(hù)人員不需要重新創(chuàng)建模板,或者是手動(dòng)導(dǎo)入模板,極大地簡(jiǎn)化了維護(hù)操作流程。
(4)啟動(dòng)Zabbix Proxy服務(wù)。需要先從Docker倉(cāng)庫(kù)中拉取該服務(wù)的鏡像來(lái)啟動(dòng)容器。該服務(wù)是用來(lái)對(duì)監(jiān)控系統(tǒng)實(shí)現(xiàn)分布式管理的,部署到其他的主機(jī)上,當(dāng)需要監(jiān)控的物理節(jié)點(diǎn)較多時(shí),可以采用分布式架構(gòu)。
(5)啟動(dòng)Zabbix Agent服務(wù)。需要先從Docker倉(cāng)庫(kù)中拉取該服務(wù)的鏡像來(lái)啟動(dòng)容器。該服務(wù)要部署到需要被監(jiān)控的每臺(tái)物理節(jié)點(diǎn)上,由Agent來(lái)收集主機(jī)的監(jiān)控信息,發(fā)往Server端。
圖5 Docker file文件中的主要代碼圖
圖6 自動(dòng)化部署的代碼實(shí)現(xiàn)流程圖
只需要在部署服務(wù)器上拷貝Zabbix 部署的代碼,通過(guò)執(zhí)行“ansible-playbook -i ./inventory/hosts site.yml -e action=collect”該命令,既可以將整個(gè)監(jiān)控服務(wù)搭建起來(lái),完成部署的所有操作,縮短了部署的時(shí)間。部署成功后在物理節(jié)點(diǎn)上執(zhí)行“Docker ps”,出現(xiàn)如圖7所示的界面,說(shuō)明通過(guò)自動(dòng)化部署在物理節(jié)點(diǎn)control上成功部署了Zabbix Server、Zabbix Web、Zabbix Agent的服務(wù)。
圖7 部署成功的結(jié)果圖
在Zabbix提供的原有功能外,通對(duì)Zabbix Agent進(jìn)行二次開(kāi)發(fā),使它能獲取主機(jī)上容器的監(jiān)控?cái)?shù)據(jù)。因?yàn)槿萜魇桥c主機(jī)外的環(huán)境是隔離的。因此在啟動(dòng)Zabbix Agent容器時(shí)需要將主機(jī)上的Docker.socket進(jìn)程掛載到容器中,通過(guò)該進(jìn)程獲取主機(jī)外的容器的相關(guān)信息。在該容器中編寫(xiě)Python腳本來(lái)實(shí)現(xiàn)對(duì)所有容器的監(jiān)控的。圖8是腳本中用來(lái)監(jiān)控容器的CPU使用率的關(guān)鍵代碼。
通過(guò)自定義用來(lái)監(jiān)控容器的模板,實(shí)現(xiàn)了對(duì)容器的性能信息和狀態(tài)信息的監(jiān)控。
圖8 實(shí)現(xiàn)獲取容器CPU使用率的相關(guān)代碼圖
利用Docker技術(shù)和Ansible技術(shù),基于Zabbix軟件的監(jiān)控系統(tǒng)的自動(dòng)化部署方式,已在學(xué)校實(shí)驗(yàn)室的云平臺(tái)環(huán)境得到了應(yīng)用。應(yīng)用結(jié)果表明,該方法可以在2 min中內(nèi)將整個(gè)監(jiān)控系統(tǒng)部署好,并且監(jiān)控系統(tǒng)可以根據(jù)在部署時(shí)導(dǎo)入的自定義模板實(shí)時(shí)監(jiān)控到云環(huán)境中的物理服務(wù)器的狀態(tài)和性能信息。通過(guò)對(duì)Zabbix軟件的功能擴(kuò)展,實(shí)現(xiàn)的監(jiān)控系統(tǒng)也可以實(shí)時(shí)監(jiān)控到云平臺(tái)中的容器服務(wù)的狀態(tài)和性能信息。隨著鐵路云計(jì)算平臺(tái)的擴(kuò)展,該監(jiān)控系統(tǒng)的容器化和自動(dòng)化方式將會(huì)得到快速的應(yīng)用。