搜尋此網誌

2016年9月8日 星期四

[工具介紹] 利用 collectd + InfluxDB + Grafana 監測系統效能

傳統上用來監測網路流量、系統效能數據的常用工具多以 RRD 為基本的技術,這類工具包含 MRTG 與 Cacti。RRD 有幾個明顯的缺點,其中一個就是資料的解析度會隨著時間的過去而降低。

例如在 Cacti 中,過去 24 小時的流量圖表是長這樣:

image

但是一周前的 24 小時的流量圖表就變成這般可怕的模樣:

image

當你不幸地需要歷史數據資料時,別說要如何進行分析了,光拿出這種圖表就需要莫大的勇氣。

在講究高清不失真的這個年代,以 RRD 為基礎的工具已經漸漸不符合我們所需。

目前比較常見用來記錄時間數據的工具,應以 ELK stack 為首。ELK stack 以 Elasticsearch 為核心,可用來分析各式各樣的資料。這個特性是它的強項,不過在某些時候卻也變成它的弱點 (過於複雜)。而我今天要介紹的 collectd + InfluxDB + Grafana,正是以處理時間數據為主,所以在製作與時間數據相關的圖表時會更為簡化。
Grafana 本身類似 ELK 的 Kibana,主要作為圖表呈現的部分。而資料來源的部分,除了 InfluxDB 之外,像是 Graphite、OpenTSDB、甚至是 Elasticsearch 也都可以支援。在此架構中,collectd 會負責收集作業系統的效能數據,並將之”餵進” InfluxDB,最後再透過 Grafana 的圖表予以呈現。

在今天的範例中,我將示範如何在 CentOS 7 中利用 collectd + InfluxDB + Grafana 建置一個呈現系統效能數據的儀表板。需特別注意的是,為了簡化範例的說明,所有的套件皆安裝在同一個系統 (IP 位址為 192.168.111.241) 下。而在實務上,這三個套件通常應分散在不同的系統上。

安裝 InfluxDB

  1. 透過官方 RPM Repo 安裝 InfluxDB 套件
  2. cat<<EOF>/etc/yum.repos.d/influxdb.repo
    [influxdb]
    name = InfluxDB Repository - RHEL $releasever
    baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
    enabled = 1
    gpgcheck = 1
    gpgkey = https://repos.influxdata.com/influxdb.key
    EOF yum install influxdb -y systemctl enable influxdb.service systemctl start influxdb.service
  3. 配置防火牆
  4. cat<<EOF>/etc/firewalld/services/influxdb.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>InfluxDB</short>
      <description>InfluxDB is an open source time series database with no external dependencies. It's useful for recording metrics, events, and performing analytics.</description>
      <port protocol="tcp" port="8083"/>
      <port protocol="tcp" port="8086"/>
    </service>
    EOF chmod 600 /etc/firewalld/services/influxdb.xml firewall-cmd --add-service=influxdb --permanent firewall-cmd --reload
  5. 透過指令 influx 進入 influxdb 命令列模式,並輸入下列命令創建管理者帳密
  6. create user admin with password 'password' with all privileges;  
    exit
  7. 利用瀏覽器連結 influxdb 管理介面,網址是 http://192.168.111.241:8083,應可看到類似下列畫面
    0001

安裝 Grafana

  1. 透過官方 RPM Repo 安裝 Grafana 套件
  2. cat<<EOF>/etc/yum.repos.d/grafana.repo
    [grafana]
    name=grafana
    baseurl=https://packagecloud.io/grafana/stable/el/6/\$basearch
    repo_gpgcheck=1
    enabled=1
    gpgcheck=1
    gpgkey=https://packagecloud.io/gpg.key https://grafanarel.s3.amazonaws.com/RPM-GPG-KEY-grafana
    sslverify=1
    sslcacert=/etc/pki/tls/certs/ca-bundle.crt
    EOF yum install grafana –y systemctl enable grafana-server.service systemctl start grafana-server.service
  3. 配置防火牆
  4. cat<<EOF>/etc/firewalld/services/grafana.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>Grafana</short>
      <description>Grafana provides a powerful and elegant way to create, explore, and share dashboards and data with your team and the world.</description>
      <port protocol="tcp" port="3000"/>
    </service>
    EOF chmod 600 /etc/firewalld/services/grafana.xml firewall-cmd --add-service=grafana --permanent firewall-cmd --reload

 

設定 influxdb collectd plugin

  1. 安裝 collectd 套件
  2. yum install collectd -y
  3. 修改檔案 /etc/influxdb/influxdb.conf,將 [[collectd]] 區塊的
    enabled = false
    改為
    enabled = true
    bind-address = ":25826" # the bind address
    database = "collections" # Name of the database that will be written to
    retention-policy = ""
    batch-size = 5000 # will flush if this many points get buffered batch-pending = 10 # number of batches that may be pending in memory batch-timeout = "10s"
    read-buffer = 0 # UDP read buffer size, 0 means to use OS default typesdb = "/usr/share/collectd/types.db" #enabled = false
  4. 重新啟動服務
  5. systemctl restart influxdb.service
  6. 配置防火牆
  7. cat<<EOF>/etc/firewalld/services/collectd.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>collectd</short>
      <description>collectd daemon for InfluxDB</description>
      <port protocol="udp" port="25826"/>
    </service>
    EOF firewall-cmd --add-service=collectd --permanent firewall-cmd --reload
  8. 透過指令 influx 進入 influxdb 命令列模式,並輸入下列命令創建資料庫與存取帳密
  9. CREATE DATABASE collections
    CREATE USER collectdrw WITH PASSWORD 'readwrite'
    GRANT ALL ON collections to collectdrw
    CREATE USER collectdread WITH PASSWORD 'readonly'
    GRANT READ ON collections TO collectdread
    exit

設定 collectd for influxdb

這個動作需在需收集效能數據的各主機上分別執行。
  1. 設定 collectd 服務所需的外掛。在此範例中我們沒有另外新增數據收集的外掛,僅增加了將資料送往 InfluxDB 的外掛。
  2. cat<<EOF>/etc/collectd.d/network.conf
    Hostname    "grafana"
    FQDNLookup  false
    LoadPlugin  network
    LoadPlugin  uptime
    <Plugin network>
      Server "192.168.111.241" "25826"
    </Plugin>
    EOF
    systemctl enable collectd.service
    systemctl start collectd.service
  3. 回到 influxdb 的管理介面,重整後在 Database 下拉式選單中應可看到多了一個名為 collections 的資料庫。
    0002
  4. 選取 collections 後,在 Query Templates 中選取 Show Measurements。
    0003
  5. 按下 Enter 後,應可看到類似下面的結果,表示 collections 中已有 cpu_value 等數據。
    0004
  6. 接著,我們輸入 SHOW TAG KEYS FROM "cpu_value" 並按下 Enter,應可看到類似下列畫面。結果顯示 cpu_value 包含四個 key,分別為 host、instance、type 以及 type_instance。
    0005
  7. 接著,我們輸入 SHOW TAG VALUES FROM "cpu_value" WITH KEY = "host" 並按下 Enter,應可看到類似下列畫面。結果顯示 host 這個 key 的內容僅包含 grafana,也就是我們目前唯一已經設定過的 collectd 服務主機名稱。
    0006
  8. 接著,我們輸入 SHOW TAG VALUES FROM "cpu_value" WITH KEY = "host" 並按下 Enter,應可看到類似下列畫面。結果顯示 InfluxDB 已確實收到來自於 collectd 服務的效能數據。
    0007

設定 Grafana Dashboard

  1. 利用瀏覽器連結 Grafana 管理介面,網址是 http://192.168.111.241:3000,應可看到類似下列畫面
    0008
  2. 使用預設帳密 admin / admin 登入系統。
  3. 點選左上角的圖示後會出現主要選單,點選 admin 後可以修改基本資訊與密碼。
    0009
  4. 同樣利用主選單的 Data Sources 選項,進入後按下右上角的 "+Add data source" 按鈕。
  5. 分別填入下列資訊,其中 Url 欄位因為我們選取 direct 的存取方式,所以不能使用預設的 http://localhost:8086,而必須指定為 http://192.168.111.241:8086
    • Name: Collectd
    • Default: 選取與否皆可
    • Type: InfluxDB
    • Url: http://192.168.111.241:8086
    • Access:direct
    • Http Auth: 兩個選項皆不用選取
    • Database: collections
    • User: collectdread
    • Password: readonly
    • Default group by time: 保留空白
  6. 填寫完畢後按下 "Add" 按鈕。如果 Data Source 可以正常連結的話會出現類似下列的成功畫面,否則會出現錯誤訊息。
    0010
  7. 利用主選單的 Dashboards > + New 開始新增儀表板。
  8. 利用 Manage dashboard 的 Settings 功能可修改儀表板的相關設定。
    0011
  9. 在此範例中我們僅設定名稱即可,將之設定為 System Information,設定完畢後按下右上方的 X 即可回到 Dashboard 的畫面。
    0013
  10. 點選左上方的綠色區塊後會出現 ROW 功能選單,選取 Add Panel > Graph。
    0012
  11. Graph 有多個頁籤設定,其中 Metrics 可用來配置資料相關設定。首先,我們須將 Panel data source 改為 Collectd。
  12. 此時我們會發現 Metrics A 內容有所改變,點選後出現圖形化編輯選項。
    0015
  13. Grafana 的圖形化編輯功能相當方便,不過為了方便說明,所以我們透過 Toggle Edit Mode 進入直接編輯模式。
    0016
  14. 輸入下列內容
    SELECT last("value") FROM "load_shortterm" WHERE "host" = 'grafana' AND $timeFilter GROUP BY time($interval) fill(null)
    0017
  15. 透過 "+ Add query" 按鈕另外新增兩個 Metrics,內容分別為
    SELECT last("value") FROM "load_midterm" WHERE "host" = 'grafana' AND $timeFilter GROUP BY time($interval) fill(null)
    SELECT last("value") FROM "load_longterm" WHERE "host" = 'grafana' AND $timeFilter GROUP BY time($interval) fill(null)
    0018
  16. 切換至 General 頁籤,將 Panel 的標題修改為 Load。
    0019
  17. 切換到 Legend 頁籤,勾選 Min、Max、Avg 以及 Current。
    0020
  18. 設定完畢後按下右方的 X 即可回到 Dashboard 畫面,然後按下 CTRL+S 將 Dashboard 予以儲存。
  19. 之後就可以透過 Dashboard 下拉式選單快速連結至我們剛剛新增的 System Information Dashboard 了。
    0021

透過幾個簡單的設定,我們就建立了一個系統負載的數據圖表。

下一步

Grafana 除了圖形類 (Graph) 的報表之外,另有提供表格式 (Table) 、單一數值  (Singlestat) 與其他種類的報表。
此外,我們的範例是針對特定的單一主機來進行配置。但是我們通常不會只有管理一台主機,此時就可以透過 Dashboard 的 Templating 機制設定一個變數用來代表主機名稱,然後將 Metrics 的條件指定為此一變數,而非原先固定的主機名稱。如此一來,Dashboard 就會提供一個所有主機名稱的下拉式選單,方便我們觀看個別主機的相關數據。

盡管如此,我們會發現自己要從無到有刻出一個合用且美觀的報表其實也不是那麼簡單的事情。幸好 Grafana  有提供儀表板匯出/匯入的功能,而且有善心人士已經將一些常見的效能數據儀表板匯出並提供下載 (清單在此)。不過在選用這些儀表板時,需特別注意的是它使用的資料來源是哪一種 (InfluxDB、Graphtie 或是其他的資料來源),以免發生牛頭不對馬嘴的狀況。

About