初試 Prometheus + Grafana 監控系統搭建並監控 Mysql
目錄
文章目錄
1、Prometheus & Grafana 介紹
1.1、Prometheus 介紹
Prometheus 是一套開源的系統監控、報警、時間序列資料庫的組合,最初有 SoundCloud 開發的,後來隨著越來越多公司使用,於是便獨立成開源專案。我們常用的 Kubernetes 容器叢集管理中,通常會搭配 Prometheus 一起來進行監控。Prometheus 基本原理是通過 Http 協議週期性抓取被監控元件的狀態,而輸出這些被監控的元件的 Http 介面為 Exporter,現在各個公司常用的 Exporter 都已經提供了,可以直接安裝使用,如
haproxy_exporter、blockbox_exporter、mysqld_exporter、node_exporter 等等,更多支援的元件可檢視 這裡。
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
注意:這裡 prometheus
、node_exporter
和 mysqld_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
,不是很直觀的哈!
參考資料