獲取聯絡與訂閱

Prometheus 與 Grafana 分佈式伺服器監控

2021.06.30

概述與說明

Grafana 並不獨立工作

在各類生產環境下, 伺服器不論硬碟或軟體,不論負載或運存, 其各個方面的資源異常都有可能導致服務中止, 甚至在大多數情況下發生得悄無聲息. 正因如此, 能夠隨掌握其系統各類資源占用及服務運行狀態顯得至關重要, 而上層架構的設計也能以此為基礎對其做出合理的規劃. 如今我們已經有了許多開源且優秀的伺服器監控展示及預警方案, 如 Prometheus 與 Grafana 正是其中的代表之一. 對於許多伺服器維護者而言即便沒有在使用或許也早已聽過二者尤其是 Grafana 的大名.

Grafana is a multi-platform open source analytics and interactive visualization web application. It provides charts, graphs, and alerts for the web when connected to supported data sources. A licensed Grafana Enterprise version with additional capabilities is also available as a self-hosted installation or an account on the Grafana Labs cloud service. -- Wikipedia

簡言之, Grafana 是一個開源的跨平臺數據面板. 實際上這段引文包含了對於新接觸者至關重要的一句話, Grafana 透過與受支持的數據源相連接工作. 而許許多多的學習者往往 誤認為 Grafana 包含了數據采集及探針, 這也就導致在學習初期會被許多文檔說明下對於數據采集和後端數據源的大篇幅講述衝昏頭腦.

Prometheus 與 Grafana 的分佈式工作架構

因此, 正如上文所述對於服務運作邏輯及架構的理解顯得至關重要. Prometheus 與 Grafana 監控方案的分佈式運作又如何實現同樣也需要透過其架構來理解:



這樣一來, 整個架構便清晰簡單. 我們實際上需要在 伺服器端部署 Prometheus 與 Grafana 分別負責數據與展示, 並在 被控端一側只需部署 node_exporter 即可. 值得一提的是, node_exporter 是 Prometheus 下的數據收集器, 可以簡單地理解為數據采集插件. 這一數據插件並不提供 Windows 支持, 需要透過其 windows_exporter 完成相應工作. 儘管個人並不建議使用 Windows 作為伺服器並對其采取監控措施.

快速開始

node_exporter 及 Prometheus

對於 node_exporter 及 Prometheus 可以透過部署腳本快速開始, 腳本內容與下文中的按步驟部署完全一致, 建議在 debian/ubuntu 系作業系統上使用, 也可以透過對應的 Github 項目 參考 systemdconfig 相關內容.

# node_exporter
bash <(wget -qO- 'https://cdn.jsdelivr.net/gh/fernvenue/prometheus-and-grafana/node_exporter.sh')

# Prometheus
bash <(wget -qO- 'https://cdn.jsdelivr.net/gh/fernvenue/prometheus-and-grafana/prometheus.sh')

在部署完成後 node_exporter 便會透過其端口 (默認為9100) 向外提供 http 數據服務, Prometheus 則可以透過 /etc/prometheus/prometheus.yml 配置監控目標的地址與端口完成數據接入.

Grafana

Grafana 則已經提供了包管理器的安裝方式, 我們只需要透過將其加入源列表並更新即可安裝, 以下步驟仍然適用於 debian/ubuntu 系作業系統. 對於其他作業系統請參閱 Grafana 官方文檔.

apt install -y apt-transport-https
apt install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
apt update && apt install grafana

渲染模板

在部署完成後, 需要為 Grafana 配置模板以供渲染相關數據. 如果沒有特殊需求, 則可以直接透過 Grafana 官方模板庫 選擇合適的模板導入使用, 可以直接複製模板內容或透過 ID 的方式導入. 也可以透過 個人 Grafana 面板 左上角的分享圖標使用 export 下的 view json 來參照.

添加匿名帳戶以允許直接訪問

這一步儘管可選但實際上相當影響體驗, 特別是面板不僅僅對自己開放的情況下, 如果添加匿名賬戶允許直接訪問可以在保障安全性的前提下省去很多麻煩. 具體步驟也不再贅述, 直接透過 Grafana 面板的選項對應操作即可.

部署步驟及概要

在快速部署腳本不能正常工作或為學習具體部署流程的情況下, 請仔細參考一下部署步驟及其簡要說明, 但在 一般情況下建議透過快速部署的方式完成.

node_exporter

下載最新版本 node_exporter 解壓並清理壓縮包殘留:

wget `curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest | grep -Po '(?<=download_url\"\: \").*linux-amd64.tar.gz'`
tar xvf ./node*.tar.gz
mv ./node*/node_exporter /usr/local/bin
rm -rf ./node*

出於安全起見為 node_exporter 創建限制級用戶:

useradd -rs /bin/false node_exporter

配置 systemd 系統服務:

curl -o /lib/systemd/system/node_exporter.service https://cdn.jsdelivr.net/gh/fernvenue/prometheus-and-grafana/systemd/node_exporter.service
systemctl enable node_exporter
systemctl start node_exporter
systemctl status node_exporter

Prometheus

下載最新版本 Prometheus 解壓並清理壓縮包殘留:

wget `curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep -Po '(?<=download_url\"\: \").*linux-amd64.tar.gz'`
tar xvf prome*.tar.gz
mv ./prome*/prometheus ./prome*/promtool /usr/local/bin
mkdir /etc/prometheus /var/lib/prometheus
mv ./prome*/consoles ./prome*/console_libraries /etc/prometheus
rm -rf ./prome*

出於安全起見為 Prometheus 創建限制級用戶:

useradd -rs /bin/false prometheus

配置權限:

chown -R prometheus: /etc/prometheus /var/lib/prometheus

配置 systemd 系統服務:

curl -o /lib/systemd/system/prometheus.service https://cdn.jsdelivr.net/gh/fernvenue/prometheus-and-grafana/systemd/prometheus.service
curl -o /etc/prometheus/prometheus.yml https://cdn.jsdelivr.net/gh/fernvenue/prometheus-and-grafana/prometheus.yml
systemctl enable prometheus
systemctl start prometheus
systemctl status prometheus

其他參考

node_exporter systemd 服務配置檔參考:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Prometheus systemd 服務配置檔參考:

[Unit]
Description=Prometheus
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target

Prometheus config 配置檔參考:

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: 'prometheus_metrics'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'node_exporter_metrics'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9100','prometheus-target-1:9100','prometheus-target-2:9100']