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