1. 程式人生 > >初試 Prometheus + Grafana 監控系統搭建並監控 Mysql

初試 Prometheus + Grafana 監控系統搭建並監控 Mysql

目錄

文章目錄

1、Prometheus & Grafana 介紹

1.1、Prometheus 介紹

Prometheus 是一套開源的系統監控、報警、時間序列資料庫的組合,最初有 SoundCloud 開發的,後來隨著越來越多公司使用,於是便獨立成開源專案。我們常用的 Kubernetes 容器叢集管理中,通常會搭配 Prometheus 一起來進行監控。Prometheus 基本原理是通過 Http 協議週期性抓取被監控元件的狀態,而輸出這些被監控的元件的 Http 介面為 Exporter,現在各個公司常用的 Exporter 都已經提供了,可以直接安裝使用,如

haproxy_exporterblockbox_exportermysqld_exporternode_exporter 等等,更多支援的元件可檢視 這裡

Prometheus 官網架構圖如下:

Prometheus

Prometheus 具有以下特點:

  • 是一個時間序列由指標名稱和鍵值對定義的多維資料模型
  • 支援靈活的查詢語言
  • 不依賴分散式儲存,單個伺服器節點就可以
  • 時間序列集合通過 Http 上的 Pull 模型來進行
  • 支援通過中間閘道器推送時間
  • 通過服務發現或靜態配置來發現目標
  • 支援多種模式的圖形和儀表盤

1.2、Grafana 介紹

Grafana 是一個視覺化儀表盤,它擁有美觀的圖示和佈局展示,功能齊全的儀表盤和圖形編輯器,預設支援 CloudWatch、Graphite、Elasticsearch、InfluxDB、Mysql、PostgreSQL、Prometheus、OpenTSDB 等作為資料來源。我們可以將 Prometheus 抓取的資料,通過 Grafana 優美的展示出來,非常直觀。

2、環境、軟體準備

本次演示環境,我是在本機 MAC OS 上操作,以下是安裝的軟體及版本:

  • go: go1.10.3 darwin/amd64
  • prometheus: 2.3.2.darwin-amd64
  • node_exporter: 0.16.0.darwin-amd64
  • mysqld_exporter: 0.11.0.darwin-amd64
  • grafana: 5.2.2.darwin-amd64

注意:這裡 prometheusnode_exportermysqld_exporter 都是 GO 語言開發,其執行環境依賴 GO,所以本機需要安裝好 GO 環境,這裡忽略 GO 的安裝過程,著重介紹下其他幾個的安裝配置過程。實際應用中,如果執行在 Linux 環境下,以上各個軟體也要安裝系統對應版本。

3、Prometheus 安裝配置

Prometheus 安裝方式有多種,可以二進位制原始碼安裝、Docker 啟動安裝或原始碼編譯安裝。

3.1、 二進位制原始碼安裝

首先,下載 Prometheus 二進位制原始碼安裝包,可以訪問 Prometheus download 頁面下載指定版本。

$ cd ~/tmp
$ wget https://github.com/prometheus/prometheus/releases/download/v2.3.2/prometheus-2.3.2.darwin-amd64.tar.gz
$ tar -zxvf prometheus-2.3.2.darwin-amd64.tar.gz
$ tree prometheus-2.3.2.darwin-amd64
	prometheus-2.3.2.darwin-amd64
	|-- LICENSE
	|-- NOTICE
	|-- console_libraries
	|   |-- menu.lib
	|   `-- prom.lib
	|-- consoles
	|   |-- index.html.example
	|   |-- node-cpu.html
	|   |-- node-disk.html
	|   |-- node-overview.html
	|   |-- node.html
	|   |-- prometheus-overview.html
	|   `-- prometheus.html
	|-- prometheus
	|-- prometheus.yml
	`-- promtool

啟動 Prometheus,使用預設配置檔案 prometheus.yml 啟動。

$ cd prometheus-2.3.2
$ ./prometheus
level=info ts=2018-07-31T07:09:59.112915066Z caller=main.go:222 msg="Starting Prometheus" version="(version=2.3.2, branch=HEAD, revision=71af5e29e815795e9dd14742ee7725682fa14b7b)"
level=info ts=2018-07-31T07:09:59.113018589Z caller=main.go:223 build_context="(go=go1.10.3, [email protected], date=20180712-14:08:00)"
level=info ts=2018-07-31T07:09:59.11303192Z caller=main.go:224 host_details=(darwin)
level=info ts=2018-07-31T07:09:59.11304525Z caller=main.go:225 fd_limits="(soft=4864, hard=9223372036854775807)"
level=info ts=2018-07-31T07:09:59.113726479Z caller=main.go:533 msg="Starting TSDB ..."
level=info ts=2018-07-31T07:09:59.114182265Z caller=web.go:415 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2018-07-31T07:09:59.118617867Z caller=main.go:543 msg="TSDB started"
level=info ts=2018-07-31T07:09:59.118678076Z caller=main.go:603 msg="Loading configuration file" filename=prometheus.yml
level=info ts=2018-07-31T07:09:59.120520499Z caller=main.go:629 msg="Completed loading of configuration file" filename=prometheus.yml
level=info ts=2018-07-31T07:09:59.120546718Z caller=main.go:502 msg="Server is ready to receive web requests."

此時,Prometheus 服務就在本地啟動起來了,瀏覽器訪問 http://localhost:9090 訪問 Web 頁面。
這裡寫圖片描述

Prometheus 預設提供一些 metric 指標來供我們選擇監控,通過地址 http://localhost:9090/metric 可以看到所有指標列表。
這裡寫圖片描述

例如,我們選擇了 go_gc_duration_seconds_count 這個監控 go 執行 gc 持續時間秒數指標,點選 “Execute” 後,使用預設的 Promdash 頁面展示,一段時間後,監控結果如下:
這裡寫圖片描述

3.2、 Docker 映象安裝

Docker 映象啟動很簡單,只需要一條命令即可,使用預設配置的話,可以直接使用如下命令啟動。

$ docker run --name prometheus -d -p 127.0.0.1:9090:9090 prometheus/prometheus

我們也可以使用自己的 prometheus.yml 配置檔案,並且掛載資料目錄到主機,來啟動映象。

$ docker run --name prometheus -d -p 127.0.0.1:9090:9090 \
-v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /tmp/prometheus-data:/prometheus-data \
prom/prometheus

3.3、原始碼編譯安裝

原始碼編譯安裝,我們需要本地有一個執行的 GO 環境,而且版本不低於 1.10.x

$ mkdir -p $GOPATH/src/github.com/prometheus
$ cd $GOPATH/src/github.com/prometheus
$ git clone https://github.com/prometheus/prometheus.git
$ cd prometheus
$ make build
$ ./prometheus --config.file=your_config.yml

4、MySQL Server Exporter 安裝配置

現在,Prometheus 服務本地已經啟動了,接下來,我們需要安裝並執行 Exporter,它的主要作用是持續輸出監控的元件資訊並格式化,同時提供 Http 介面供 Prometheus 服務來抓取。Exporter 也是通過 GO 語言編寫的,Prometheus GitHub 已經為我們提供了很多實用的 Exporter,直接拿來使用即可。

首先,下載 mysql_exporter 二進位制檔案到本地。

$ cd ~/tmp
$ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.darwin-amd64.tar.gz
$ tar -zxvf mysqld_exporter-0.11.0.darwin-amd64.tar.gz
$ tree mysqld_exporter-0.11.0.darwin-amd64
	mysqld_exporter-0.11.0.darwin-amd64
	├── LICENSE
	├── NOTICE
	└── mysqld_exporter 

接著,需要配置要監控的資料庫,為 mysql_exporter 建立一個指定賬戶用來連線資料庫(當然,也可以直接用 root 或者其他有許可權的賬戶,不過建議建立一個專有賬戶)。

CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';

然後,需要配置一下資料庫連線認證資訊並啟動 Exporter,有兩種方式配置:

  • 使用環境變數方式

    $ export DATA_SOURCE_NAME='exporter:[email protected](localhost:3306)/'
    $ ./mysqld_exporter
    
  • 使用配置檔案方式

$ vim ~/.my.cnf
[client]
   host=localhost
   port=3306
   user=exporter
   password=password	

$ ./mysqld_exporter

注意:mysqld_exporter 預設使用 ~/.my.cnf 作為資料庫認證檔案,如果我們指定其他路徑檔案,需要啟動時指定路徑,例如:./mysqld_exporter --config.my-cnf="<file_path>/.my.cnf"

檢視日誌輸出,Exporter 啟動成功。

$ ./mysqld_exporter 
INFO[0000] Starting mysqld_exporter (version=0.11.0, branch=HEAD, revision=5d7179615695a61ecc3b5bf90a2a7c76a9592cdd)  source="mysqld_exporter.go:206"
INFO[0000] Build context (go=go1.10.3, [email protected], date=20180629-15:01:12)  source="mysqld_exporter.go:207"
INFO[0000] Enabled scrapers:                             source="mysqld_exporter.go:218"
INFO[0000]  --collect.slave_status                       source="mysqld_exporter.go:222"
INFO[0000]  --collect.info_schema.tables                 source="mysqld_exporter.go:222"
INFO[0000]  --collect.global_status                      source="mysqld_exporter.go:222"
INFO[0000]  --collect.global_variables                   source="mysqld_exporter.go:222"
INFO[0000] Listening on :9104                            source="mysqld_exporter.go:232"

此時,本地瀏覽器訪問 http://localhost:9104/metrics 可以看到 mysql 相關的所有監控指標列表。
這裡寫圖片描述

現在,Prometheus 和 mysqld_exporter 服務都已經啟動起來了,那麼接下來就需要將二者關聯起來,讓 Prometheus 來定時抓取 Exporter 提供的資料。我們需要修改 Prometheus 的配置檔案 prometheus.yml 增加 mysql 相關 exporter job。

$ cd ~/tmp/prometheus-2.3.2.darwin-amd64
$ vim prometheus.yml
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
scrape_configs:

  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
      labels:
          instance: prometheus
  
  - job_name: 'mysql'
    static_configs:
     - targets: ['localhost:9104']
       labels:
          instance: mysql

說明一下:增加了一個 job_name 為 mysql 的任務,targets 為指向 mysqld_exporter 提供的 Http 介面服務,labels 為該 job 配置一個標籤,方便下邊 Grafana 頁面顯示,下邊會講到。

修改完成後,重啟 Prometheus 服務。此時,我們再次訪問 http://localhost:9090/,點選 “Status” 下 “Targets” 可以檢視所有的 Targets 了,這裡就有預設的 prometheus 和新配置的 mysql 啦!
這裡寫圖片描述

此時,我們就可以在下拉列表中選擇 mysql 相關的指標監控了,例如選擇 mysql_global_status_uptime 指標,一段時間後,監控頁面如下:
這裡寫圖片描述

不過,大家有沒有覺得 Prometheus 自帶的圖形並不美觀,而且功能單一,此時,Grafana 該上臺了,我們要使用 Grafana 作為 Prometheus 的展示儀表盤,功能強大而且介面美觀。

5、Grafana 安裝並配置 DataSources

Grafana 安裝也很方便,根據官網文件 Grafana Install,裡面有針對各個系統提供的安裝方法。參照 Mac 上安裝方案,可以採用 HomeBrew 安裝或者二進位制原始碼安裝方式。

5.1、HomeBrew 安裝

# 安裝 Grafana
$ brew update
$ brew install grafana

# 安裝 homebrew/services 服務
$ brew tap homebrew/services
# 啟動 Grafana 服務
$ brew services start grafana

5.2、二進位制包安裝

$ cd ~/tmp
$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.2.darwin-amd64.tar.gz 
$ tar -zxvf grafana-5.2.2.darwin-amd64.tar.gz
$ cd grafana-5.2.2
$ ./bin/grafana-server web
INFO[07-31|17:58:14] Starting Grafana                         logger=server version=5.2.2 commit=aeaf7b2 compiled=2018-07-25T19:17:28+0800
INFO[07-31|17:58:14] Config loaded from                       logger=settings file=/Users/wanyang3/tmp/grafana-5.2.2/conf/defaults.ini
INFO[07-31|17:58:14] Path Home                                logger=settings path=/Users/wanyang3/tmp/grafana-5.2.2
INFO[07-31|17:58:14] Path Data                                logger=settings path=/Users/wanyang3/tmp/grafana-5.2.2/data
INFO[07-31|17:58:14] Path Logs                                logger=settings path=/Users/wanyang3/tmp/grafana-5.2.2/data/log
INFO[07-31|17:58:14] Path Plugins                             logger=settings path=/Users/wanyang3/tmp/grafana-5.2.2/data/plugins
INFO[07-31|17:58:14] Path Provisioning                        logger=settings path=/Users/wanyang3/tmp/grafana-5.2.2/conf/provisioning
INFO[07-31|17:58:14] App mode production                      logger=settings
INFO[07-31|17:58:14] Initializing SqlStore                    logger=server
INFO[07-31|17:58:14] Connecting to DB                         logger=sqlstore dbtype=sqlite3
INFO[07-31|17:58:14] Starting DB migration                    logger=migrator
INFO[07-31|17:58:14] Initializing SearchService               logger=server
INFO[07-31|17:58:14] Initializing PluginManager               logger=server
INFO[07-31|17:58:14] Starting plugin search                   logger=plugins
INFO[07-31|17:58:14] Initializing InternalMetricsService      logger=server
INFO[07-31|17:58:14] Initializing AlertingService             logger=server
INFO[07-31|17:58:14] Initializing HTTPServer                  logger=server
INFO[07-31|17:58:14] Initializing CleanUpService              logger=server
INFO[07-31|17:58:14] Initializing NotificationService         logger=server
INFO[07-31|17:58:14] Initializing ProvisioningService         logger=server
INFO[07-31|17:58:14] Initializing RenderingService            logger=server
INFO[07-31|17:58:14] Initializing TracingService              logger=server
INFO[07-31|17:58:14] Initializing Stream Manager
INFO[07-31|17:58:14] HTTP Server Listen                       logger=http.server address=0.0.0.0:3000 protocol=http subUrl= socket=

啟動完成後,本地瀏覽器訪問 http://localhost:3000 即可開啟 Grafana Web 頁面,使用預設管理員賬戶: admin 密碼:admin 登入並修改初始密碼後,即可開始體驗 Grafana,頁面是不是很美觀。
這裡寫圖片描述

5.3、配置 DataSources

接下來,我們需要新增一個 Prometheus 型別的資料來源,將二者關聯起來,點選 “Add data source” 按鈕,填寫 Prometheus 相關資訊,如下:
這裡寫圖片描述

Type 處選擇 Prometheus,URL 處填寫 Prometheus 連線地址,因為我們上邊服務安裝在本地,所以這裡填寫 http://localhost:9090,其他預設即可,填寫完畢,點選下方 “Save & Test” 按鈕,如果配置成功,會提示 Data source is working 訊息。

此時,已經新增好了 Prometheus 資料來源,Grafana 預設給該型別監控提供了三個 Dashboard,我們可以直接在頁面上點選 “Import” 即可,此時在 Dashboard 頁面選擇其中的一個型別,就可以看到監控資料圖形啦!例如,這裡我們選擇 Prometheus 2.0 Stats 型別 Dashboard,一段時間後,看到的監控頁面如下:
這裡寫圖片描述

這裡寫圖片描述

6、儀表盤配置(MySQL monitoring using Prometheus)

最後,我們需要在 Grafana 上新增 Mysql Prometheus 型別的 Dashboard,當然對應的 Dashboard Json 檔案,可以直接拿現成的來用,別人寫的比較全面,也比較好。這些 Dashboard Json 檔案可以從 這裡 找到,我們可以 Clone 到本地,匯入到 Grafana 裡面即可。

$ cd ~/tmp/
$ git clont https://github.com/percona/grafana-dashboards.git
$ tree grafana-dashboards/dashboards/
grafana-dashboards/dashboards/
├── Advanced_Data_Exploration.json
├── Amazon_RDS___Aurora_MySQL__Metrics.json
├── CPU_Utilization_Details_Cores.json
├── Cross_Server_Graphs.json
├── Disk_Performance.json
├── Disk_Space.json
├── Home_Dashboard.json
├── MongoDB_Cluster_Summary.json
├── MongoDB_InMemory.json
├── MongoDB_MMAPv1.json
├── MongoDB_Overview.json
├── MongoDB_ReplSet.json
├── MongoDB_RocksDB.json
├── MongoDB_WiredTiger.json
├── MySQL_Amazon_Aurora_Metrics.json
├── MySQL_Command_Handler_Counters_Compare.json
├── MySQL_InnoDB_Compression.json
├── MySQL_InnoDB_Metrics.json
├── MySQL_InnoDB_Metrics_Advanced.json
├── MySQL_MyISAM_Aria_Metrics.json
├── MySQL_MyRocks_Metrics.json
├── MySQL_Overview.json
├── MySQL_Performance_Schema.json
├── MySQL_Query_Response_Time.json
├── MySQL_Replication.json
├── MySQL_Table_Statistics.json
├── MySQL_TokuDB_Metrics.json
├── MySQL_User_Statistics.json
├── Network_Overview.json
├── Overview_NUMA_metrics.json
├── PXC_Galera_Cluster_Overview.json
├── PXC_Galera_Graphs.json
├── Prometheus.json
├── Prometheus_Exporter_Status.json
├── Prometheus_Exporters_Overview.json
├── ProxySQL_Overview.json
├── Summary_Dashboard.json
├── System_Overview.json
├── Trends_Dashboard.json
├── pmm-add-instance.json
├── pmm-qan.json
├── pmm-settings.json
└── pmm-summary.json

這裡就是我們需要的 Dashboard Json 檔案,包含 Mysql、MongoDB、System、pmm 等,可以直接拿來使用。點選 “Import” 進入頁面後,點選 “Upload .json File” 按鈕,選擇本地 MySQL_Overview.json 檔案,點選 “Import” 即可完成匯入,
這裡寫圖片描述

此時,我們就可以從頁面上直觀的看到 Prometheus 收集到的 Mysql 相關的各個指標監控的,例如:Mysql Connection、Mysql Questions、Mysql Thread Cache、Mysql Network Traffic 等等一系列指標。同時,還可以調整查詢區間範圍,編譯每一個指標資訊,檢視每個指標資訊詳情,自定義拖拽排版面板等功能,功能很強大。
這裡寫圖片描述

這裡寫圖片描述

還記得上邊 Prometheus 配置檔案中的 labels 麼,我們配置為 mysql,在這裡 Grafana 頁面上邊 Host 就自動關聯了 mysql,如果沒填 labels,這裡會顯示 localhost:9104,不是很直觀的哈!

參考資料