本博客所有文章采用的授權(quán)方式為 自由轉(zhuǎn)載-非商用-非衍生-保持署名 ,轉(zhuǎn)載請(qǐng)務(wù)必注明出處,謝謝。
聲明:
本博客歡迎轉(zhuǎn)發(fā),但請(qǐng)注明出處,保留原作者信息
博客地址:孟阿龍的博客
所有內(nèi)容為本人學(xué)習(xí)、研究、總結(jié)。如有雷同,實(shí)屬榮幸
注: 本文基于當(dāng)前Openstack的Q版本進(jìn)行分析
1. 背景
ceilometer項(xiàng)目是openstack中用來做計(jì)量計(jì)費(fèi)功能的一個(gè)組件,后來又逐步發(fā)展增加了部分監(jiān)控采集、告警的功能。由于種種原因,ceilometer項(xiàng)目在Openstack中已經(jīng)處于一種沒落的狀態(tài),基本沒有什么新的特性開發(fā)了,原本該項(xiàng)目的PTL也另起爐灶開始在做Gnocchi項(xiàng)目(ceilometer的后端存儲(chǔ)系統(tǒng))。雖然該項(xiàng)目已經(jīng)沒有前幾年活躍,但是還是在很多公有云場景中有比較多的應(yīng)用,而生產(chǎn)環(huán)境中,可能很多公司還用的是M、N版本。
2. 基本概念
- meter:
針對(duì)一個(gè)資源的某些測量值,比如,一個(gè)虛擬機(jī)可以有多個(gè)meters:虛擬機(jī)在一段時(shí)間內(nèi)cpu的使用時(shí)間、磁盤的請(qǐng)求次數(shù)等。在ceilometer中針對(duì)這些meter定義了三種類型:- Cumulative(累積型): 隨著時(shí)間會(huì)不斷增長(eg. disk I/O)
- Gauge(測量型):離散型的值(eg. floating IPs)和浮動(dòng)的值(eg. swift對(duì)象的數(shù)量)
- Delta(變化量):一段時(shí)間內(nèi)某個(gè)采集值的變化量(eg. 帶寬變化量)
- sample:
針對(duì)一個(gè)特定的meter的具體數(shù)據(jù)結(jié)構(gòu) - event:
在某個(gè)特定時(shí)間,發(fā)生的一個(gè)動(dòng)作,比如:19:09:08 創(chuàng)建了一個(gè)虛擬機(jī) - resource:
資源,比如instance(虛擬機(jī))、disk(磁盤)都是資源
3. High-Level 架構(gòu)

如上,是當(dāng)前Ceilometer的一個(gè)全局概覽邏輯圖.
以上ceilometer的每一個(gè)服務(wù)都是基于可橫向擴(kuò)展來設(shè)計(jì)的。實(shí)際生產(chǎn)環(huán)境中,可以根據(jù)系統(tǒng)的負(fù)載,決定來增加實(shí)例或者增加單個(gè)實(shí)例的worker數(shù)。當(dāng)前Ceilometer主要提供兩個(gè)核心服務(wù):
- polling agent:輪詢agent,是一個(gè)deamon服務(wù),通過周期性調(diào)用Openstack內(nèi)部服務(wù)的接口或者一些外部接口獲取指定resource的meter數(shù)據(jù)
- notification agent:一個(gè)deamon服務(wù),通過監(jiān)聽消息隊(duì)列獲取相關(guān)數(shù)據(jù),將其轉(zhuǎn)換為event和sample,并根據(jù)pipeline中定義的方法將數(shù)據(jù)發(fā)送出去
這和以前的版本相比,簡化了不少,以前ceilometer包含了(polling-agent,notification-agent,collector,ceilometer-api)
通過Ceilometer收集到的數(shù)據(jù)可以被發(fā)送到不同的后端。Gnocchi是用來提供對(duì)捕獲到的時(shí)間序列的測量數(shù)據(jù)的存儲(chǔ)和查詢。Gnocchi未來的趨勢是取代當(dāng)前現(xiàn)存的metering數(shù)據(jù)存儲(chǔ)接口(當(dāng)前存儲(chǔ)在mongodb、mysql等存儲(chǔ)后端)。Aodh是一個(gè)告警服務(wù),在滿足用戶設(shè)置的告警條件時(shí),可以發(fā)送告警信息,其后端可以對(duì)接不同的數(shù)據(jù)庫。Panko是用來獲取系統(tǒng)中的各類事件并將其存儲(chǔ)到對(duì)應(yīng)后端數(shù)據(jù)庫。
4. 數(shù)據(jù)獲取的過程
4.1 數(shù)據(jù)采集

上圖展示了ceilometer-agent怎樣從不同的數(shù)據(jù)源獲取到數(shù)據(jù)
Ceilometer共有兩種方法來收集數(shù)據(jù):
- Notification agent,從notification bus上獲取消息,將其轉(zhuǎn)換為ceilometer的sample或者event數(shù)據(jù)
- Polling agent,周期性調(diào)用系統(tǒng)中的一些API或者外部工具來獲取數(shù)據(jù)。輪詢服務(wù)可能會(huì)對(duì)API服務(wù)帶來較大的影響,因此對(duì)應(yīng)的API服務(wù)需要針對(duì)這種輪詢機(jī)制做一些優(yōu)化。
以上第一種方法是ceilometer-agent-notification提供的,他可以監(jiān)控消息隊(duì)列上的信息。第二種方法是通過polling-agent實(shí)現(xiàn),通過配置可以實(shí)現(xiàn)輪詢本地虛擬化層或者遠(yuǎn)程API來獲取數(shù)據(jù)。
4.2 notification agent監(jiān)聽數(shù)據(jù)

notification-agent可以消費(fèi)來自不同服務(wù)上報(bào)的消息數(shù)據(jù)。
這個(gè)系統(tǒng)的核心是notification-agent這個(gè)deamon服務(wù),他可以監(jiān)聽openstack組件(比如nova、glance/cinder/neutron/等)發(fā)送到消息隊(duì)列上的數(shù)據(jù),以及ceilometer內(nèi)部發(fā)送過來數(shù)據(jù)
notification-agent加載ceilometer.notification這個(gè)namespace下的一個(gè)或者多個(gè)插件.每個(gè)插件都可以監(jiān)聽任何topic,默認(rèn)的都會(huì)監(jiān)聽notifications.info, notifications.sample,notifications.error.監(jiān)聽進(jìn)程從配置的topic抓取下來消息之后,將其分發(fā)到合適的插件處理成event和sample。
基于Sample的插件提供了一個(gè)方法來獲取他們所關(guān)注的事件類型,然后據(jù)此調(diào)用對(duì)應(yīng)的回調(diào)方法來處理消息。注冊的毀掉方法通過notification的pipeline來配置生效與否。通過插件配置的事件類型對(duì)新進(jìn)來的消息進(jìn)行過濾,因此回調(diào)接口最終只會(huì)收到他們所關(guān)心的數(shù)據(jù)。
4.3 Polling Agent輪詢獲取數(shù)據(jù)

Polling-agent通過主動(dòng)調(diào)用service接口查詢來獲取數(shù)據(jù)。
部署在計(jì)算節(jié)點(diǎn)上的polling-agent用來輪詢計(jì)算資源的數(shù)據(jù)(這樣agent可以更有效的和本地虛擬化層交互),也被稱為compute-agent。
通過服務(wù)API輪詢查詢非計(jì)算資源相關(guān)數(shù)據(jù)的agent部署在控制節(jié)點(diǎn)上,也被稱為central-agent。在all-in-one環(huán)境中,一個(gè)agent也支持同時(shí)提供以上兩種角色。
相反的,也可以通過部署多個(gè)agent實(shí)例來分擔(dān)系統(tǒng)負(fù)載。Polling-agent進(jìn)程可以加載ceilometer.poll.compute,ceilometer.poll.central,ceilometer.poll.ipmi這三個(gè)namespace中配置的插件。
4.4 數(shù)據(jù)處理
4.4.1 pipeline manager

以上組件實(shí)現(xiàn)ceiloemter的pipeline。
ceilometer提供抓取數(shù)據(jù)的agent,控制數(shù)據(jù)、通過多重pipeline將數(shù)據(jù)發(fā)送到多種后端的能力。這種功能通過notification-agent來實(shí)現(xiàn)。
4.4.2 數(shù)據(jù)發(fā)送

上圖展示了一個(gè)sample數(shù)據(jù)怎樣被發(fā)送到多個(gè)不同后端
當(dāng)前處理過的數(shù)據(jù)可以被發(fā)送到8種不同的后端
- gnocchi, 發(fā)送samples/event數(shù)據(jù)到Gnocchi-api
- notifier, 發(fā)送數(shù)據(jù)到消息隊(duì)列,最終可以被內(nèi)部系統(tǒng)消費(fèi)
- udp, 通過UDP包將數(shù)據(jù)發(fā)送出去
- http, 發(fā)送數(shù)據(jù)到REST接口
- file, 發(fā)送數(shù)據(jù)到指定的文件
- zaqar, 一個(gè)用于web和移動(dòng)開發(fā)者的多租戶云消息和通知服務(wù)
- https, 通過SSL加密的REST接口HTTP服務(wù)
- prometheus, 發(fā)送samples數(shù)據(jù)到 Prometheus Pushgateway
5. 存儲(chǔ)/訪問數(shù)據(jù)
Ceilometer是設(shè)計(jì)用來單純的生產(chǎn)和序列化云數(shù)據(jù)。Ceilometer生產(chǎn)的數(shù)據(jù)可以被發(fā)送到通過pipeline-publishers中定義 的多重后端。推薦的方法是將數(shù)據(jù)發(fā)送到Gnocchi用于有效的時(shí)間序列存儲(chǔ)以及資源生命周期的追蹤。
參考:
https://docs.openstack.org/ceilometer/latest/contributor/architecture.html
以上我們可以看出,ceilometer關(guān)鍵的組件包含:ceilometer-agent-compute,ceilometer-agent-notification,插件采集數(shù)據(jù)這幾個(gè)核心,后邊會(huì)分別對(duì)其進(jìn)行分析:
- ceilometer-compute-agent(已完成)
- 插件采集數(shù)據(jù)的原理和過程分析(已完成)
- ceilometer-agent-notification (待分析)