1. 程式人生 > >計量模組 Ceilometer 介紹及優化

計量模組 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

, most recent: 0.138333333333", "previous": "ok"}

  • 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]
metering_driver = messagingv2
metering_topic = metering

notifier://?policy=drop&max_queue_length=512
RPC rpc://?option1=value1&option2=value2 與 notifier類似,同樣經過 AMQP, 不過是同步操作,因此可能有效能問題。  

[publisher_rpc]
metering_topic = metering

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 壓縮
  • 功能增強:增加郵件告警功能,做到告警及時通知

 參考文件: