李超雷, 向忠清
(武漢烽火信息集成技術(shù)有限公司 IT事業(yè)部, 武漢 430074)
基于Ceilometer Alarm API的操作設(shè)計(jì)和實(shí)現(xiàn)①
李超雷, 向忠清
(武漢烽火信息集成技術(shù)有限公司 IT事業(yè)部, 武漢 430074)
隨著云計(jì)算技術(shù)的不斷發(fā)展, 越來(lái)越多的企業(yè)采用OpenStack來(lái)構(gòu)建私有云或公有云平臺(tái). 云平臺(tái)正逐步替代傳統(tǒng)服務(wù)器, 用來(lái)承載著企業(yè)和用戶(hù)的IT業(yè)務(wù). 為了保證云平臺(tái)的服務(wù)質(zhì)量, 本文基于OpenStack的報(bào)警功能接口——Ceilometer Alarm API設(shè)計(jì)和實(shí)現(xiàn)了對(duì)于云平臺(tái)虛擬機(jī)監(jiān)控報(bào)警功能的交互操作頁(yè)面. 通過(guò)使用該功能, 用戶(hù)可以監(jiān)控虛擬機(jī)運(yùn)行時(shí)的性能狀態(tài), 保證云平臺(tái)的可靠運(yùn)行.
云計(jì)算; Openstack; Ceilometer; 報(bào)警
云計(jì)算技術(shù)在近幾年得到了飛速的發(fā)展, 通常來(lái)說(shuō), 云計(jì)算主要包括基礎(chǔ)設(shè)施即服務(wù)(IaaS)、平臺(tái)作即服務(wù)(PaaS)和軟件即服務(wù)(SaaS)[1]. 本文討論的主要內(nèi)容屬于IaaS內(nèi)容.
OpenStack[2-4]是一款開(kāi)源云計(jì)算管理平臺(tái), 由NASA和Rackspace合作研發(fā)并發(fā)起, 目前已經(jīng)發(fā)展成為僅次于Linux的全球第二大社區(qū). OpenStack提供了基礎(chǔ)設(shè)施即服務(wù)(IaaS)的解決方案, 其首要任務(wù)是簡(jiǎn)化云的部署過(guò)程并為其帶來(lái)良好的可擴(kuò)展性. OpenStack的核心項(xiàng)目包括計(jì)算(Nova)、網(wǎng)絡(luò)(Neutron)、身份認(rèn)證(Keystone)、塊存儲(chǔ)(Cinder)、對(duì)象存儲(chǔ)(Swift)、測(cè)量(Ceilometer)和操作面板(Horizon). 其中Ceilometer提供了對(duì)整個(gè)云平臺(tái)的資源進(jìn)行計(jì)量和統(tǒng)計(jì)的功能[5]. 本文實(shí)現(xiàn)的虛擬機(jī)告警功能主要基于Ceilometer[6], 為了證明Ceilometer數(shù)據(jù)的有效性, 下一節(jié)內(nèi)容主要對(duì)Ceilometer模塊進(jìn)行了分析.
Ceilometer是OpenStack中的一個(gè)子項(xiàng)目, 它能把OpenStack內(nèi)部發(fā)生的幾乎所有事件都收集起來(lái), 然后為計(jì)費(fèi)和監(jiān)控以及其他服務(wù)提供數(shù)據(jù)支撐.
2.1 核心架構(gòu)
Ceilometer使用兩種收集數(shù)據(jù)的方式, 一種是OpenStack各個(gè)服務(wù)內(nèi)發(fā)出的notification消息, 一種是通過(guò)調(diào)用各個(gè)服務(wù)的API主動(dòng)獲取數(shù)據(jù).
Ceilometer之所以采用這兩種收集方式, 首先是因?yàn)? 在OpenStack內(nèi)部, 發(fā)生的一些事件都會(huì)發(fā)出對(duì)應(yīng)的notification消息, 比如創(chuàng)建和刪除虛擬機(jī)等, 這些都是計(jì)量的重要信息, 因此, notification消息作為Ceilometer的第一數(shù)據(jù)來(lái)源. 除此之外, 有些計(jì)量信息通過(guò)notification消息是獲取不到的, 比如說(shuō)虛擬機(jī)的CPU使用率、磁盤(pán)I/O速率等. 這些信息不會(huì)主動(dòng)的通過(guò)notification消息發(fā)送出來(lái), 因此Ceilometer增加了第二種方式, 周期性的調(diào)用相關(guān)API去獲取這些信息. 在Ceilometer源碼中, 如圖1所示, 在/etc/ceilometer/pipeline.yaml文件中配置了輪詢(xún)時(shí)間為600秒, 也就是說(shuō)每隔10分鐘Ceilometer會(huì)主動(dòng)獲取當(dāng)前系統(tǒng)中的各項(xiàng)信息并存入到數(shù)據(jù)庫(kù)中, 此信息作為Ceilometer的第二種數(shù)據(jù)來(lái)源, 可以根據(jù)需要適當(dāng)?shù)脑黾踊驕p少輪詢(xún)時(shí)間, 需要注意的是, 較短的輪詢(xún)時(shí)間會(huì)增加OpenStack后臺(tái)的壓力. Ceilometer輪詢(xún)時(shí)間如下:
Ceilometer的各個(gè)服務(wù)中, 與采集相關(guān)的服務(wù)是ceilometer-collecter、ceilometer-agent-central、ceilometeragent-compute、ceilometer-agent-notification. 關(guān)系如圖1所示.
圖1 Ceilometer組件關(guān)系圖
如圖1所示, agent-central、agent-compute、agentnotification負(fù)責(zé)采集信息, 其中agent-compute用來(lái)收集計(jì)算節(jié)點(diǎn)上的信息, 在每一個(gè)計(jì)算節(jié)點(diǎn)上都要運(yùn)行一個(gè)agent-compute, 用來(lái)獲取虛擬機(jī)的CPU、Disk IO、Network IO、Instance這些信息. agent-central運(yùn)行在控制節(jié)點(diǎn)上, 它主要收集其他服務(wù)如Image、Volume、Objects、Network等信息. agent-notification則是負(fù)責(zé)收集各個(gè)組件推送到消息隊(duì)列中的信息, 與agentcentral和agent-compute不同的是, agent-notification只需要監(jiān)聽(tīng)事件的發(fā)生, agent-central和agent-compute都需要定時(shí)poll輪詢(xún)收集信息. 采集到的信息由collecter匯總處理, 并將數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)中, collecter是在核心架構(gòu)中唯一一個(gè)能夠?qū)?shù)據(jù)庫(kù)進(jìn)行寫(xiě)操作的組件. 目前Ceilometer支持的存儲(chǔ)包括mysql、DB2、HBase、mongoDB, 在本文所用的OpenStack Kilo版本中,Ceilometer使用mongoDB作為后端存儲(chǔ), 目前來(lái)看, 監(jiān)控?cái)?shù)據(jù)的持久化的壓力還是很大的.
2.2 Ceilometer Alarm
Ceilometer Alarm是OpenStack Havana版本添加的新功能, 根據(jù)2.1節(jié)的介紹, Ceilometer已經(jīng)實(shí)現(xiàn)了比較完善的監(jiān)控體系, Alarm便是利用Ceilometer收集到的信息對(duì)云平臺(tái)進(jìn)行監(jiān)控報(bào)警.
Alarm能夠監(jiān)控一個(gè)或多個(gè)指標(biāo)的值, 若高于或低于閾值, 則執(zhí)行相應(yīng)的動(dòng)作. 在Ceilometer中, 實(shí)現(xiàn)了2種Alarm, threshold和combination. Threshold針對(duì)某一個(gè)監(jiān)控指標(biāo)建立Alarm, 根據(jù)監(jiān)控指標(biāo)的閾值去判斷Alarm的狀態(tài). Combination則是將多個(gè)Alarm組合起來(lái)的綜合考慮監(jiān)控指標(biāo)的Alarm, 多個(gè)Alarm之間是or/and的關(guān)系.
OpenStack提供了RESTful API對(duì)Alarm進(jìn)行操作,例如創(chuàng)建、更新、刪除、查詢(xún)等, 表1詳細(xì)的列出了創(chuàng)建一個(gè)Alarm需要的參數(shù).
ANN指的是通過(guò)大量的神經(jīng)元之間的互相聯(lián)結(jié)和匯通而形成的復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu),將人腦組織結(jié)構(gòu)和運(yùn)行機(jī)制進(jìn)行某種抽象、簡(jiǎn)化和模擬的一種模型。人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Network,簡(jiǎn)稱(chēng)ANN ),通過(guò)搭建數(shù)學(xué)模型來(lái)將神經(jīng)元的活動(dòng)進(jìn)行模擬,是一種通過(guò)建立在對(duì)大腦神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和功能進(jìn)行模仿和模擬而搭建成的一種信息處理系統(tǒng)。
表1中AlarmThresholdRule和AlarmCombinationRule是兩種Alarm類(lèi)型的參數(shù), 其中AlarmThresholdRule包括:
meter_name: 監(jiān)控指標(biāo)
query: 指定用于監(jiān)控何種資源, 可以綁定至具體的虛擬機(jī)上
period, evaluation_periods: 確定監(jiān)控的時(shí)間范threshold: 閾值
comparison_operator: 和閾值比較的方式
statistic: 確定了使用何種數(shù)據(jù)與閾值threshold進(jìn)行比較
exclude_outliners: 是否除去波動(dòng)較大數(shù)據(jù)AlarmCombinationRule包括:
operator: 定義alarm之間的邏輯關(guān)系alarm_id: 為alarm的列表
表1 創(chuàng)建Alarm的詳細(xì)參數(shù)
本文虛擬機(jī)報(bào)警功能實(shí)現(xiàn)的原理是利用Alarm中的actions功能. actions主要提供兩種形式的接口, 一種是log, 該形式可以將報(bào)警信息寫(xiě)入到指定的日志文件中; 另一種是REST接口, 當(dāng)報(bào)警發(fā)生時(shí), OpenStack會(huì)使用http協(xié)議訪(fǎng)問(wèn)actions里設(shè)置的URL, 同時(shí)產(chǎn)生的報(bào)警信息會(huì)以JSON數(shù)據(jù)的格式包含在HTTP頭文件中以POST形式發(fā)送過(guò)去. 本文采用的報(bào)警接收方式便是使用REST接口形式.
根據(jù)前一節(jié)的描述, Ceilometer提供的Alarm功能可以提供監(jiān)控功能, 不足的是, OpenStack僅僅是提供了Alarm的API, 沒(méi)有提供友好的人機(jī)交互的頁(yè)面.API通常是共程序開(kāi)發(fā)人員使用, 用戶(hù)使用起來(lái)并不方便. 本文接下來(lái)將基于OpenStack中的Ceilometer項(xiàng)目,設(shè)計(jì)并實(shí)現(xiàn)虛擬機(jī)報(bào)警功能.
3.1 虛擬機(jī)報(bào)警功能流程
考慮到在實(shí)際的使用過(guò)程中, 用戶(hù)并不需要考慮所創(chuàng)建的Alarm類(lèi)型是Threshold還是Combination的, 用戶(hù)只需要考慮自己需要監(jiān)控何種數(shù)據(jù), 并創(chuàng)建相應(yīng)的報(bào)警規(guī)則便可. 報(bào)警規(guī)則所監(jiān)控的數(shù)據(jù)可以是單一的某一項(xiàng)數(shù)據(jù), 也可以是監(jiān)控多種數(shù)據(jù).
Web頁(yè)面的流程上, 當(dāng)用戶(hù)規(guī)定好報(bào)警規(guī)則后, 可以根據(jù)需要選擇是否發(fā)送郵件通知, 設(shè)置完通知郵件之后將報(bào)警規(guī)則綁定到一個(gè)或多個(gè)虛擬機(jī)上就可以了.具體的創(chuàng)建流程如圖2所示.
圖2 告警規(guī)則創(chuàng)建流程
設(shè)置完報(bào)警規(guī)則之后, OpenStack會(huì)自動(dòng)去監(jiān)控所創(chuàng)建的Alarm的狀態(tài), 當(dāng)報(bào)警觸發(fā)之后, 會(huì)根據(jù)用戶(hù)的設(shè)置發(fā)送相應(yīng)的報(bào)警通知. Web后臺(tái)也會(huì)收到該報(bào)警通知, 在接收到通知之后, Web后端會(huì)將數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù), 方便用戶(hù)今后查看. 接收?qǐng)?bào)警的流程如圖3所示.
3.2 功能分析
根據(jù)3.1節(jié)的流程, 虛擬機(jī)報(bào)警功能主要有以下幾個(gè)子功能的實(shí)現(xiàn): 創(chuàng)建報(bào)警規(guī)則、查詢(xún)報(bào)警規(guī)則、更新報(bào)警規(guī)則、刪除報(bào)警規(guī)則、發(fā)送報(bào)警通知、查詢(xún)已產(chǎn)生報(bào)警信息.
為了能夠快速實(shí)現(xiàn)上述功能, 本文的Web后臺(tái)采用Django[7]框架進(jìn)行處理, Django是使用Python編寫(xiě)的一款開(kāi)源的Web框架. 使用Django框架可以簡(jiǎn)便、快速的開(kāi)發(fā)Web應(yīng)用程序, 比較符合本文報(bào)警功能開(kāi)發(fā)的需求.
圖3 報(bào)警接收流程
3.3 虛擬機(jī)報(bào)警功能實(shí)現(xiàn)
根據(jù)3.2節(jié)對(duì)虛擬機(jī)報(bào)警功能的需求分析, 對(duì)應(yīng)每個(gè)功能, 本文將詳述其具體實(shí)現(xiàn), 根據(jù)Django項(xiàng)目的開(kāi)發(fā)流程, 每個(gè)功能都有相對(duì)應(yīng)的url和view, 對(duì)于需要對(duì)數(shù)據(jù)庫(kù)操作的功能, 需要生成對(duì)應(yīng)的model.
3.3.1 虛擬機(jī)報(bào)警規(guī)則查詢(xún)
該功能主要使用Ceilometer提供的API進(jìn)行Alarm查詢(xún), 將查詢(xún)到的信息進(jìn)行過(guò)濾, 最終返回給Web頁(yè)面.用戶(hù)的每次請(qǐng)求都會(huì)攜帶自身對(duì)應(yīng)的Token, 因此不必?fù)?dān)心接口會(huì)返回其他用戶(hù)創(chuàng)建的報(bào)警規(guī)則. 但是, 由于Threshold和Combination這兩種報(bào)警規(guī)則的存在, 為了屏蔽掉這兩種規(guī)則的差別, 在getAlarmList的實(shí)現(xiàn)中需要過(guò)濾掉Combination中的子規(guī)則.
3.3.2 虛擬機(jī)報(bào)警規(guī)則創(chuàng)建
該功能接收用戶(hù)傳入的數(shù)據(jù)進(jìn)行Alarm的創(chuàng)建, 用戶(hù)對(duì)于Alarm的類(lèi)型是無(wú)感知的, 用戶(hù)只需要考慮需要監(jiān)控虛擬機(jī)的何種性能指標(biāo)便可, 為了在Web上屏蔽掉Threshold和Combination的區(qū)別, 在后臺(tái)的實(shí)現(xiàn)上可以通過(guò)判斷報(bào)警規(guī)則中的監(jiān)控?cái)?shù)據(jù)是否單一來(lái)創(chuàng)建相應(yīng)的Alarm, 核心代碼如下:
新建報(bào)警時(shí)是針對(duì)某臺(tái)虛擬機(jī), 因此需要使用API中的query字段, 具體數(shù)據(jù)形式如下:
為了使用Alarm的action功能, 在創(chuàng)建Alarm時(shí), 需要在對(duì)應(yīng)action中添加OpenStack后臺(tái)訪(fǎng)問(wèn)Django的URL地址, OpenStack會(huì)使用REST的形式將數(shù)據(jù)傳送過(guò)來(lái), action的具體形式如下:
其中email_host在配置文件中設(shè)置, 為該項(xiàng)目的IP地址, email是用戶(hù)的郵件地址, instance_name是虛擬機(jī)的名字, user_id為用戶(hù)ID, 用戶(hù)ID對(duì)于每個(gè)用戶(hù)是唯一的, 用于識(shí)別報(bào)警所屬用戶(hù).
3.3.3 虛擬機(jī)報(bào)警規(guī)則更新和刪除
該功能在實(shí)現(xiàn)上需要注意的是, 對(duì)于Threshold類(lèi)型的Alarm, 直接使用OpenStack提供的API進(jìn)行更新和刪除便可. 但是對(duì)于Combination類(lèi)型的Alarm, 用戶(hù)其alarm_id中的Alarm是無(wú)感知的, 在更新功能上實(shí)際是更新Combination的alarm_id中所對(duì)應(yīng)的Threshold類(lèi)型的Alarm. 在刪除Combination類(lèi)型的Alarm時(shí), 需要?jiǎng)h除alarm_id中的所有Alarm.
3.3.4 發(fā)送報(bào)警通知
該功能有兩個(gè)主要用途, 第一, 提供OpenStack可訪(fǎng)問(wèn)接口, 接收?qǐng)?bào)警信息; 第二, 發(fā)送報(bào)警通知并將報(bào)警信息存入數(shù)據(jù)庫(kù). 由于該功能與數(shù)據(jù)庫(kù)相關(guān), 需要使用Django中的model進(jìn)行數(shù)據(jù)庫(kù)的映射. Django的數(shù)據(jù)庫(kù)映射功能使用十分簡(jiǎn)便, 在model.py文件中添加相關(guān)Model便可.
Django同樣提供了發(fā)送郵件功能, 使用起來(lái)也同樣十分方便. 首先, 在setting文件中設(shè)置好郵件服務(wù)器,之后, 在需要使用到郵件發(fā)送功能的代碼中直接import django.core.mail中的send_mail模塊后, 便可以使用send_mail方法進(jìn)行郵件的發(fā)送. setting文件的配置如下:
具體實(shí)現(xiàn)上, 當(dāng)接收到OpenStack的報(bào)警通知, 將報(bào)警信息存入數(shù)據(jù)庫(kù)并給用戶(hù)發(fā)送郵件通知即可.
3.3.5 查詢(xún)已產(chǎn)生報(bào)警信息
該功能主要用于用戶(hù)查詢(xún)已產(chǎn)生的報(bào)警信息, 使用Django的model可以很方便的查詢(xún)到數(shù)據(jù)庫(kù)所存的報(bào)警信息, 核心代碼如下:
本文基于OpenStack的Ceilometer實(shí)現(xiàn)了虛擬機(jī)的報(bào)警功能, 并且已經(jīng)應(yīng)用于實(shí)際環(huán)境當(dāng)中. 目前, 該功能能夠正常使用, 達(dá)到了虛擬機(jī)實(shí)時(shí)報(bào)警功能. 但是,由于Ceilometer對(duì)數(shù)據(jù)的收集默認(rèn)是600秒主動(dòng)輪詢(xún)一次, 報(bào)警的精度最好設(shè)置在600秒以上. 如果需要更加精細(xì)的報(bào)警, 則需縮短Ceilometer的輪詢(xún)間隔, 這勢(shì)必會(huì)增加服務(wù)器的壓力, 有可能會(huì)影響到其它功能的正常運(yùn)行. 如何能夠提高Ceilometer的監(jiān)控精度, 并不給服務(wù)器和數(shù)據(jù)庫(kù)造成太大壓力, 這將是今后研究的主要方向.
1Bohn RB, Messina J, Liu F, et al. NIST cloud computing reference architecture. 2011 IEEE World Congress on Services (SERVICES). Washington DC, USA. 2011.594–596.
2Floating IP. OpenStack: High Availability Guide. 2015.
3Lamourine M. OpenStack. Login: the Magazine of USENIX& SAGE, 2014, 39(3): 17–20.
4高貴升. 基于OpenStack的計(jì)算云的研究與實(shí)現(xiàn)[碩士學(xué)位論文]. 成都: 成都理工大學(xué), 2012.
5梁宇, 楊海波, 李鴻彬, 等. 基于OpenStack資源監(jiān)控系統(tǒng). 計(jì)算機(jī)系統(tǒng)應(yīng)用, 2014, 23(4): 44–47, 16.
6Dongmyoung B, Bumchul L. Analysis of telemetering service in OpenStack. 2015 International Conference on Information and Communication Technology Convergence. Jeju, South Korea. 2015. 272–274.
7Forcier J, Bissex P, Chun W. Django Web開(kāi)發(fā)指南. 徐旭銘,譯. 北京: 機(jī)械工業(yè)出版社, 2009.
Design and Implementation of the Operation Based on Ceilometer Alarm API
LI Chao-Lei, XIANG Zhong-Qing
(IT Division,WuHan Fiberhome Integrated Information Technology Co.Ltd., Wuhan 430074, China)
With the continuous development of cloud computing technology, more and more enterprises begin to use OpenStack to build a private cloud or public cloud platform. Cloud platform is gradually replacing the traditional server,to undertake the enterprises and user IT business. In order to guarantee the service quality of the cloud platform, this article designs the interactive operation page of monitoring and alarming function for the virtual machine of cloud platform, based on the OpenStack alarm function interface -- Ceilometer Alarm API. Using this function , users can monitor the running state of the virtual machine, ensuring the reliable operation of the cloud platform.
cloud computing; Openstack; Ceilometer; alarm
李超雷,向忠清.基于Ceilometer Alarm API的操作設(shè)計(jì)和實(shí)現(xiàn).計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(7):283–287. http://www.c-s-a.org.cn/1003-3254/5854.html
2016-11-10; 收到修改稿時(shí)間: 2016-12-12