讀古今文學網 > OpenStack系統架構設計實戰 > 5.2.2 計量數據採集 >

5.2.2 計量數據採集

Ceilometer的各個服務中,負責計量數據採集的服務組件有4個,分別是agent-notification、agent-central、agent-compute、agent-ipmi。其採集數據的方式各有不同,主要分為Poll和Push兩種方式,如圖5-2所示。Poll即輪詢方式,主動採集數據,Push即通知方式,被動獲取數據。

agent-notification服務採用Push方式被動獲取數據,即通過監聽OpenStack通知總線(Notification Bus)上的通知消息來獲取數據。OpenStack通知總線即oslo-messaging的消息隊列,oslo-messaging是OpenStack整體的消息隊列框架,OpenStack中各個模塊在執行了某種操作或者狀態變化時都會推送通知信息到oslo-messaging消息框架。agent-notification通過訪問這個消息隊列服務框架,獲取相關通知信息,並進一步轉化為採樣數據的格式。

圖5-2 Ceilometer的數據採集及處理邏輯

agent-notification通過notification listener插件來實現監聽,可以開發符合接口定義的新的notification listener插件來實現對新的通知消息的監聽,以及將此通知消息轉化成Ceilometer採樣值。agent-notification服務的運行流程如下:

1)解析Pipeline配置文件得到Pipeline定義。

2)調用stevedore庫,載入所有的notification listener插件。

3)對每一個notification listener插件通過oslo.messaging庫構造其對應的oslo.messaging庫的notification listener對象,並且啟動此對像監聽通知消息。

4)當通知總線上有某個notification listener插件所感興趣的通知到達時,所對應的notification listener插件就會被agent-notification調用,根據此通知消息構造出採樣值Sample,然後根據Pipeline中的定義將此採樣值轉換和發佈出去。

目前,K版本的Ceilometer所處理的OpenStack各服務的通知消息如表5-2所示。

表5-2 Kilo版本的處理的服務消息

agent-central服務可以部署在任何節點上,通常部署在控制節點上,它用來和遠程的各種不同的實體和服務進行通信,獲取不同的測量值。agent-central主要通過調用各OpenStack服務的REST API來獲取OpenStack服務的各種信息,以及通過SNMP來獲取Hardware資源的信息,通過kwapi來收集設備能耗數據。

agent-compute服務需要部署在運行nova-compute服務的計算節點上,主要用來收集計算節點上的虛擬機實例的計量數據,在每一個計算節點上都要運行這個服務組件。agent-compute主要是用來和Hypervisor進行通信,通過調用Hypervisor的API來獲取相關測量值,需要定期Poll輪詢收集信息。到目前為止,Ceilometer支持的Hypervisor如下:

·KVM(Kernel-based Virtual Machine)

·QEMU(Quick Emulator)

·LXC(Linux Container)

·UML(User-mode Linux)

·Hyper-V

·XEN

·VMware vSphere

agent-ipmi服務需要部署在支持IPMI的計算節點上,該計算節點需要安裝ipmitool工具。agent-ipmi服務通過ipmitool收集本機IPMI傳感器(Sensor)的數據,以及Intel Node Manager的數據。

agent-central、agent-compute、agent-ipmi都屬於Polling代理,Polling代理的作用是根據Pipeline的定義,週期性地調用不同的Pollster插件去輪詢獲得Pipeline中定義的測量值,再根據Pipeline的定義,對這些採樣值進行轉換和發佈。Pollster插件是指符合特定接口標準的Python類,代理會調用這些Pollster插件來獲得不同的測量數據。可以開發自己的Pollster插件來獲取新的測量值。各種不同的Polling代理的運行流程基本類似。

1)調用stevedore庫,獲取屬於本Agent的所有Pollster插件。

2)創建PartitionCoordinator類實例對象,加入一個partition group,並創建一個定時器用來週期性地發送心跳消息。

3)解析Pipeline配置文件得到Pipeline的定義,並根據解析的結果創建一個或多個不同的PollingTask和所對應的定時器。由於所有採樣頻率相同的Pipeline都會在同一個PollingTask裡處理,所以每個PollingTask都由某個特定頻率的定時器驅動,在某一個線程中被執行。

4)由定時器驅動的PollingTask會週期性地調用其所包含的各種Pollster,由這些Pollster獲取測量數據,然後根據Pipeline的定義,把獲取的測量取樣值交給Transformer轉換後,再由Publisher發佈。

agent-notification、agent-central、agent-compute、agent-ipmi服務組件在啟動的時候,通過stevedore的插件機制來加載採集項,包括每個採集項對應的執行程序。stevedore的插件配置利用了setuptools的entry_points,所以可以通過查看entry_points的配置信息來確定有哪些採集項。如果用戶的程序打包完畢並發佈到了Python的搜索路徑中,那麼需要通過Ceilometer的egg文件來查看,或者下載源碼查看setup.cfg文件。部分採集項配置信息如下:

[entry_points]ceilometer.notification = magnetodb_table = ceilometer.key_value_storage.notifications:Table magnetodb_index_count = ceilometer.key_value_storage.notifications:Index instance = ceilometer.compute.notifications.instance:Instance instance_flavor = ceilometer.compute.notifications.instance:InstanceFlavor ...ceilometer.poll.compute = disk.read.requests = ceilometer.compute.pollsters.disk:ReadRequestsPollster disk.write.requests = ceilometer.compute.pollsters.disk:WriteRequestsPollster disk.read.bytes = ceilometer.compute.pollsters.disk:ReadBytesPollster disk.write.bytes = ceilometer.compute.pollsters.disk:WriteBytesPollster ...ceilometer.poll.ipmi = hardware.ipmi.node.power = ceilometer.ipmi.pollsters.node:PowerPollster hardware.ipmi.node.temperature = ceilometer.ipmi.pollsters.node:TemperaturePollster hardware.ipmi.temperature = ceilometer.ipmi.pollsters.sensor:TemperatureSensorPollster hardware.ipmi.voltage = ceilometer.ipmi.pollsters.sensor:VoltageSensorPollster ...ceilometer.poll.central = ip.floating = ceilometer.network.floatingip:FloatingIPPollster image = ceilometer.image.glance:ImagePollster image.size = ceilometer.image.glance:ImageSizePollster storage.containers.objects = ceilometer.objectstore.swift:ContainersObjectsPollster ......

其中,ceilometer.notification對應的是agent-notification組件的採集項,ceilometer.poll.compute對應的是agent-compute組件的採集項,ceilometer.poll.ipmi對應的是agent-ipmi組件的採集項,ceilometer.poll.central對應的是agent-central組件的採集項。