計量模組 Ceilometer 介紹及優化
- ALARM (告警狀態):
{"current": "alarm", "alarm_id": "742873f0-97f0-4d99-87da-b5f7c7829b7f", "reason": "Remaining as alarm due to 1 samples outside threshold, most recent: 0.138333333333", "previous": "alarm"}
- OK (資料充足,未告警):
{"current": "ok", "alarm_id": "742873f0-97f0-4d99-87da-b5f7c7829b7f", "reason": "Remaining as ok due to 1 samples inside threshold
- Insufficient Data (預設狀態 - 資料不足):
{"current": "insufficient data", "alarm_id": "742873f0-97f0-4d99-87da-b5f7c7829b7f", "reason": "1 datapoints are unknown", "previous": "ok"}
1.4.4 Alarm Action
使用Ceilometer alarm-threshold/combination-create CLI 的如下屬性來為不同狀態的下的 Alarm 定義不同的 Action:
- --ok-action
- --alarm-action
- --insufficient-data-action
Ceilometer 支援兩種Action:
- 'log://':Alarm 被寫入 Log 檔案
- Webhook URL: 這是一個 HTTP(S) endpoint 的URL,例如 'http://130.56.250.199:8080/alarm/instances_TOO_MANY'。Alarm 的內容會以 JSON 的格式被 POST 到該URL 中。
2. Ceilometer 的資料處理
Ceilometer 的功能就是對上面各種概念的物件的處理:
功能名稱 | 功能描述 | 提供功能Ceilometer 模組 |
Collect | Meters 資料收集 |
ceilometer-agent-compute ceilometer-agent-central ceilometer-agent-notification ceilometer-collector |
Transform | Meters 資料轉換 | |
Publish | Meters 資料釋出 | |
Store | Meters 資料儲存 | |
Read | Meters 資料訪問 | ceilometer-api |
Alarm | 告警 | ceilometer-alarm-notifier ceilometer-alarm-evaluator |
總體架構如下:
2.1 Meters資料的收集
Ceilometer 有兩種資料收集方式:
- Poller:
- Compute agent (ceilometer-agent-compute)執行在每個 compute 節點上,以輪詢的方式通過呼叫 Image 的 driver 來獲取資源使用統計資料。
- Central agent (ceilometer-agent-central)執行在 management server 上,以輪詢的方式通過呼叫 OpenStack 各個元件(包括 Nova、Cinder、Glance、Neutron、Swift 等)的 API 收集資源使用統計資料。
- Notificaiton:Collector (ceilometer-collector)是一個執行在一個或者多個management server上的資料收集程式,它會監控 OpenStack 各元件的訊息佇列。佇列中的 notification 訊息會被它處理並轉化為計量訊息,再發回到訊息系統中。計費訊息會被直接儲存到儲存系統中。
除了監控這些物件以外,Ceilometer 還可以監控 Neutron 的 Bandwidth, 以及 hardware。關於資料收集的細節,會有另一篇文章來闡述。
2.2 Meters 資料處理
Meters 資料的處理使用 Pipeline 的方式,即Metes 資料依次經過(零個或者多個) Transformer 和 (一個或者多個)Publisher 處理,最後達到(一個或者多個)Receiver。其中Recivers 包括 Ceilometer Collector 和 外部系統。
2.2.1 Pipeline
Ceilometer 根據配置檔案 /etc/ceilometer/pipeline.yaml 來配置 meters 所使用的 transformers 和 publishers。以 cpu meter 為例:
sources: A source is a producer of samples ...... - name: cpu_source interval: 600 meters: - "cpu" sinks: - cpu_sink ...... sinks: A sink on the other hand is a chain of handlers of samples ...... - name: cpu_sink transformers: - name: "rate_of_change" parameters: target: name: "cpu_util" unit: "%" type: "gauge" scale: "100.0 / (10**9 * (resource_metadata.cpu_number or1))" publishers: - notifier://
這段程式碼定義了 cpu meter 的 :
- interval: 600:Poller 獲取 cpu samples 的間隔為 10 分鐘
- cpu meter 的 transformer 為 "rate_of_change"
- cpu meter 的 publisher 為 notifier://,它使用預設的配置經過 AMQP 使用 oslo.messaging 發出資料
2.2.1 Transformer 轉換器
Transformer 即 Sample 的轉換器。常見的 transformer 包括:
- unit_conversion: 單位轉換器,比如溫度從°F 轉換成°C
- rate_of_change: 計算方式轉換器,比如根據一定的計算規則來轉換一個sample。例如:
name: "rate_of_change"
parameters:
target:
name: "cpu_util"
unit: "%"
type: "gauge"
scale: "100.0 / (10**9 * (resource_metadata.cpu_number or 1))"
- accumulator: 累計器。如下圖示例:
2.2.2 Publisher 分發器
Ceilometer 支援如下幾種 Publishers:
Publisher | 格式 | 說明 | 配置項 | 示例 |
Notifier | notifier://?option1=value1&option2=value2 | samples 資料被髮到 AMQP 系統,然後被 Ceilometer collecter 接收。預設的 AMQP Queue 是 metering_topic=metering。這預設的方式。 |
[publisher_notifier] |
notifier://?policy=drop&max_queue_length=512 |
RPC | rpc://?option1=value1&option2=value2 | 與 notifier類似,同樣經過 AMQP, 不過是同步操作,因此可能有效能問題。 |
[publisher_rpc] |
rpc://?per_meter_topic=1 |
UDP | udp://<host>:<port>/ | 經過 UDP port 發出。預設的 UDP 埠是 4952 | udp_port=4952 |
udp://10.0.0.2:1234 |
File | file://path?option1=value1&option2=value2 | 傳送到檔案儲存 |
可以在 /etc/ceilometer/pipeline.yaml 中為某個 meter 配置多個 publisher。比如增加一個file publisher:
sinks: - name: meter_sink transformers: publishers: - notifier:// - file:///var/log/ceilometer/ceilometer-file-publisher #新增的file publisher
那麼在該檔案中你會看到如下的 sample:
{'user_id': None, 'name': 'image', 'resource_id': u'bb8838d5-06b5-4f7e-b6ef-87c908f04cc7', 'timestamp': '2015-03-29T15:39:05Z', 'resource_metadata': {'status': u'active', 'name': u'cinderimg', 'deleted': False, 'container_format': u'bare', 'created_at': u'2015-01-21T17:15:56', 'disk_format': u'qcow2', 'updated_at': u'2015-01-21T17:15:56', 'protected': True, 'min_ram': 0, 'checksum': u'64d7c1cd2b6f60c92c14662941cb7913', 'min_disk': 0, 'is_public': False, 'deleted_at': None, 'properties': {}, 'size': 13167616}, 'volume': 1, 'source': 'openstack', 'project_id': u'fa2046aaead44a698de8268f94759fc1', 'type': 'gauge', 'id': 'bb2b4142-d629-11e4-925a-080027ff4b45', 'unit': 'image'}
2.3 資料儲存
Ceilometer Collector 從 AMQP 接收到資料後,會原封不動地通過一個或者多個分發器(dispatchers)將它儲存到指定位置。目前它支援的分發器:
- 檔案分發器:儲存到檔案 - 新增配置項dispatcher = file 和 [dispatcher_file] 部分的配置項
- HTTP 分發器:儲存到外部的 HTTP target - 新增配置項 dispatcher = http
- 資料庫分發器:儲存到資料庫 - 新增配置項 dispatcher = database。參考文件
- MongoDB:預設DB。
- SQL DB:支援 mysql、postgreSQL 和 IBM DB2等。
- HBase DB
Ceilometer 支援同時配置多個分發器,將資料儲存到多個目的位置。比如在 ceilometer.conf 中做如下配置使得同時使用 file 和 database dispatcher:
[DEFAULT] dispatcher = database dispatcher = file [dispatcher_file] backup_count = 5 file_path = /var/log/ceilometer/ceilometer-samples max_bytes = 100000
在 /var/log/ceilometer/ceilometer-samples 檔案中將收到如下類似的 samples 資料:
[{u'counter_name': u'cpu_util', u'user_id': u'8f4f734443674afcbbb57b9909d5a07f', u'message_signature': u'21fdc2cbf50b4da39746eba47ac0a1b742c759a1bb42e17c00e293413c356a38', u'timestamp': u'2015-03-29T14:47:10Z', u'resource_id': u'49618cae-dd28-41a0-ae97-e98899d717eb', u'message_id': u'7ad714f6-d622-11e4-8f83-080027df9b16', u'source': u'openstack', u'counter_unit': u'%', u'counter_volume': 0.0, u'project_id': u'd6feddb5279a42f4854b93a729470448', u'resource_metadata': {u'status': u'shutoff', u'cpu_number': 1, u'ramdisk_id': None, u'display_name': u'vm-1-for-user-one', u'name': u'instance-0000000e', u'disk_gb': 1, u'kernel_id': None, u'image': None, u'ephemeral_gb': 0, u'host': u'5d9f88849c5458f5b903fbc7a7d19bb90c3a4b0c492c5180434d216d', u'memory_mb': 100, u'instance_type': u'7124c366-3e56-4923-b32a-124ee31abaf7', u'vcpus': 1, u'root_gb': 1, u'image_ref': None, u'flavor': {u'name': u'tiny', u'links': [{u'href': u'http://controller:8774/e5defbf994694519b1261fa855a058ae/flavors/7124c366-3e56-4923-b32a-124ee31abaf7', u'rel': u'bookmark'}], u'ram': 100, u'ephemeral': 0, u'vcpus': 1, u'disk': 1, u'id': u'7124c366-3e56-4923-b32a-124ee31abaf7'}, u'OS-EXT-AZ:availability_zone': u'nova', u'image_ref_url': None}, u'counter_type': u'gauge'}]
2.4 資料訪問
外部系統通過 ceilometer-api 模組提供的 Ceilometer REST API 來訪問儲存在資料庫中的資料。API 有 V1 和 V2 兩個版本,現在使用的是 V2.
API Service 預設在 8777 埠監聽 (#port=8777)。V2 API 列表在這裡。
2.5 告警
2.5.1 架構
(1)ceilometer-alarm-evaluator 使用 Ceilometer REST API 獲取 statistics 資料
(2)ceilometer-alarm-evaluator 生成 alarm 資料, 並通過 AMQP 發給 ceilometer-alarm-notifer
(3)ceilometer-alarm-notifer 會通過指定方式把 alarm 發出去。
2.5.2 Heat 和 Ceilometer 通過 Ceilometer Alarm 進行互動來實現 Instance auto-scaling
示意圖:
步驟:
3. 總體架構
3.1 總體架構
3.2 特點
(1)Ceilometer 的架構的開放性應該說非常好,處處都留有和外部系統互動的介面。
(2)其效能可能是個問題,特別是大的生產系統中計量資料量非常大的情況下。據說京東對該模組有很大的修改後才用到其生產系統中。
3.3 京東對 Ceilometer 的優化 (摘自京東架構師在2015年初OpenStack meetup 上的材料)
- 訊息跟蹤:整合 Stacktach 到 Ceilometer,跟蹤message
- 效能優化:
- 增加資料處理服務 + cache,提升ceilometer-api 和 alarm 效能
- 自研 filter 功能,直接 hook 在 collector 程序上面,做到及時告警
- 去 MQ,使用自研 RPC 傳輸監控 sample,並採用 gzip 壓縮
- 功能增強:增加郵件告警功能,做到告警及時通知
參考文件: