💫《博主主頁》:
🔎 CSDN主頁__奈斯DB
🔎 IF Club社區主頁__奈斯、
🔥《擅長領域》:擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控;并對SQLserver、NoSQL(Redis)有了解
💖如果覺得文章對你有所幫助,歡迎點贊收藏加關注💖
????看過我之前文章的小伙伴都清楚,在之前介紹過 [基于Prometheus+Grafana實現MySQL數據庫的監控與可視化 ]
的文章,這篇文章主要是監控MySQL數據庫和主從復制,但當數據庫升級為高可用架構后,監控策略也需要隨之升級!🔝
????在運營商、金融、電商等關鍵業務場景中,MySQL高可用架構(如MGR、MHA、Keepalived+HA、InnoDB Cluster等)是保障"一年五個九"(99.999%可用性)的核心支柱。那么在眾多MySQL高可用架構中,Keepalived+HA是實現MySQL高可用中最常見的一種方案,只需要兩臺服務器就可以實現MySQL的高可用,因此實時監控高可用架構狀態是非常重要的一環。
????那么接下來這篇文章將聚焦Keepalived+HA高可用架構,通過Prometheus打造全方位的監控體系!🚀
???
特別說明💥:
?監控MySQL HA實現如下告警
- ? Keepalived 服務已停止
- ? 主節點虛擬IP不可達
- ? 虛擬IP漂移到備節點
???
???prometheus+Grafana全系列文章(實時更新🔥):
序號 文章 1 【prometheus+Grafana篇】Prometheus與Grafana:深入了解監控架構與數據可視化分析平臺 2 【prometheus+Grafana篇】從零開始:Linux 7.6 上二進制安裝 Prometheus、Grafana 和 Node Exporter 3 【prometheus+Grafana篇】Prometheus告警規則參數全解析 + Alertmanager實現多平臺告警(含電子郵件/企業微信群/飛書群/釘釘群接受方式) 4 【prometheus+Grafana篇】PromQL核心函數解析:rate()與irate()函數詳解 5 【prometheus+Grafana篇】基于Prometheus+Grafana實現Linux操作系統的監控與可視化 6 【prometheus+Grafana篇】基于Prometheus+Grafana實現windows操作系統的監控與可視化 7 【prometheus+Grafana篇】基于Prometheus+Grafana實現Oracle數據庫的監控與可視化 8 【prometheus+Grafana篇】基于Prometheus+Grafana實現MySQL數據庫的監控與可視化 9 【Prometheus+Grafana篇】監控通過Keepalived實現的MySQL HA高可用架構 10 【prometheus+Grafana篇】基于Prometheus+Grafana實現MongoDB數據庫的監控與可視化 11 【prometheus+Grafana篇】基于Prometheus+Grafana實現Redis數據庫的監控與可視化 12 【prometheus+Grafana篇】基于Prometheus+Grafana實現postgreSQL數據庫的監控與可視化 13 【prometheus+Grafana篇】基于Prometheus+Grafana實現SQLserver數據庫的監控與可視化
目錄
- 一、HA主
- 1)編輯監控keepalived+VIP進程腳本
- 2)安裝python和Prometheus所需依賴包
- 3)將監控腳本寫入到linux啟動服務項
- 二、HA備
- 1)編輯監控keepalived+VIP進程腳本
- 2)安裝python和Prometheus所需依賴包
- 3)將監控腳本寫入到linux啟動服務項
- 三、添加MySQL HA到prometheus中
- 1)將MySQL HA的信息加入到prometheus監控的配置文件prometheus.yml中
- 2)配置告警規則文件
- 3)檢查配置文件
- 4)prometheus.yml文件添加了信息,所以重啟prometheus進程或者重新加載配置文件(二選一)
- 5)在prometheus查看是否可以看到監控信息
- 四、模擬主庫故障,查看告警
???
MySQL HA高可用架構信息如下:
角色 VIP IP地址 類型 HA主 110.120.100.48 110.120.100.46 讀寫 HA備 110.120.100.47 讀(備用)
???
????那么從上面的架構圖可以推斷出主庫和從庫分別都應該監控哪些內容:
主庫:
- 監控主庫上的keepalived監控
- 主節點需要檢查虛擬 IP 是否不存在:正常情況下keepalived的VIP只能存在于主庫上,而不能存在于除了主庫的其他任意節點上
???從庫:
- 監控從庫上的keepalived監控
- 備節點需要檢查虛擬 IP 是否存在:正常情況下keepalived的VIP地址是在主節點上的,如果在從節點發現了VIP,就進行告警。這樣的好處在于可以馬上知曉VIP漂移到了從節點上,也可以監控是否出現了腦裂問題,如果出現了腦裂能馬上進行干預和處理。PS提示:Keepalived的BACKUP主機在收到不MASTER主機報文后就會切換成為master,如果是它們之間的通信線路出現問題,無法接收到彼此的組播通知,但是兩個節點實際都處于正常工作狀態,這時兩個節點均為master強行綁定虛擬IP,導致不可預料的后果,這就是腦裂。
??????現在知道了該監控哪些內容,那么開始如下配置。
???
???
一、HA主
1)編輯監控keepalived+VIP進程腳本
[root@mysql-db1 ~]# mkdir -p /opt/prometheus [root@mysql-db1 ~]# cd /opt/prometheus/ [root@mysql-db1 ~]# mkdir keepalived_exporter [root@mysql-db1 ~]# cd keepalived_exporter [root@mysql-db1 keepalived_exporter]# vi keepalived_monitor.pyfrom flask import Flask, Response import subprocess import osapp = Flask(__name__)@app.route('/metrics') def metrics():# 檢查 keepalived 服務狀態result = subprocess.run(['systemctl', 'is-active', 'keepalived'], stdout=subprocess.PIPE)keepalived_status = 1 if result.stdout.decode().strip() == 'active' else 0# 檢查虛擬 IP 是否存在于本機ip_address = '110.120.100.48'result = subprocess.run(['ip', 'addr', 'show'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)ip_status = 1 if ip_address in result.stdout.decode() else 0# 返回 Prometheus 格式的指標metrics_data = '# HELP keepalived_status 狀態,1表示keepalived服務正在運行,0表示未運行\n'metrics_data += '# TYPE keepalived_status gauge\n'metrics_data += f'keepalived_status {keepalived_status}\n' # 檢查 keepalived 服務狀態metrics_data += f'# HELP ip_reachability_primary{{ip="{ip_address}"}} 虛擬IP是否存在,1表示存在,0表示不存在\n' # 根據節點角色設置 Prometheus 格式的指標。主節點需要檢查虛擬 IP 是否不存在,定義的指標項為ip_reachability_primary;備節點需要檢查虛擬 IP 是否存在,定義的指標項為ip_reachability_secondarymetrics_data += '# TYPE ip_reachability_primary gauge\n'metrics_data += f'ip_reachability_primary{{ip="{ip_address}"}} {ip_status}\n'return Response(metrics_data, mimetype='text/plain')if __name__ == '__main__':app.run(host='0.0.0.0', port=4399) # 監聽 4399 端口
###腳本實現了兩個監控:
- 檢查了 keepalived 服務狀態
- 檢查了虛擬 IP 是否存在于本機,根據節點角色設置 Prometheus 格式的指標。主節點需要檢查虛擬 IP 是否不存在,定義的指標項為ip_reachability_primary;備節點需要檢查虛擬 IP 是否存在,定義的指標項為ip_reachability_secondary。虛擬ip是一個在主備節點之間共享的虛擬IP地址,永遠只存在于同一個virtual_router_id組中的主節點上。也是就說監控主節點上ip是否不存在,備節點監控ip是否存在
???###在如上腳本中,只需要將
ip_address = '110.120.100.48'
這里的IP替換為實際的VIP,其他地方不需要有任何變更
???
???2)安裝python和Prometheus所需依賴包
安裝Python:通過yum進行安裝。監控腳本是通過python實現的,因此需要安裝python3,用于運行keepalived_monitor.py監控腳本
[root@mysql-db1 ~]# yum install python3 [root@mysql-db1 ~]# python3 --version
???
安裝Flask:將Flask相關包上傳至Linux的/software/Flask目錄下。這里安裝flask是因為在keepalived_monitor.py監控腳本中使用了 Flask 的以下關鍵組件
組件 用途 必要性 Flask 創建輕量級Web服務器 ? 必須 @app.route 暴露 /metrics 端點供Prometheus抓取 ? 必須 Response 返回符合Prometheus格式的監控數據 ? 必須 flask相關包博主已打包上傳至資源,需要的小伙伴直接下載即可
[root@mysql-db1 ~]# cd /software [root@mysql-db1 ~]# unzip flask.zip [root@mysql-db1 ~]# cd flask [root@mysql-db1 ~]# pip3 install *.whl
PS小提示:如果不安裝Flask。那么通過python3運行keepalived_monitor.py腳本時會報如下錯誤:
???
???3)將監控腳本寫入到linux啟動服務項
[root@mysql-db1 ~]# cd /usr/lib/systemd/system [root@mysql-db1 ~]# vi keepalived_monitor.service[Unit] Description=Keepalived Monitor Script After=network.target[Service] Type=simple ExecStart=/usr/bin/python3 /opt/prometheus/keepalived_exporter/keepalived_monitor.py WorkingDirectory=/opt/prometheus/keepalived_exporter/ Restart=always Environment=PATH=/usr/bin:/usr/local/bin:/usr/sbin Environment=PYTHONUNBUFFERED=1[Install] WantedBy=multi-user.target[root@mysql-db1 ~]# systemctl daemon-reload [root@mysql-db1 ~]# systemctl start keepalived_monitor.service [root@mysql-db1 ~]# systemctl enable keepalived_monitor.service [root@mysql-db1 ~]# systemctl status keepalived_monitor.service
???
二、HA備
1)編輯監控keepalived+VIP進程腳本
[root@mysql-db2 ~]# mkdir -p /opt/prometheus [root@mysql-db2 ~]# cd /opt/prometheus/ [root@mysql-db2 ~]# mkdir keepalived_exporter [root@mysql-db2 ~]# cd keepalived_exporter [root@mysql-db2 keepalived_exporter]# vi keepalived_monitor.pyfrom flask import Flask, Response import subprocess import osapp = Flask(__name__)@app.route('/metrics') def metrics():# 檢查 keepalived 服務狀態result = subprocess.run(['systemctl', 'is-active', 'keepalived'], stdout=subprocess.PIPE)keepalived_status = 1 if result.stdout.decode().strip() == 'active' else 0# 檢查虛擬 IP 是否存在于本機ip_address = '110.120.100.48'result = subprocess.run(['ip', 'addr', 'show'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)ip_status = 1 if ip_address in result.stdout.decode() else 0# 返回 Prometheus 格式的指標metrics_data = '# HELP keepalived_status 狀態,1表示keepalived服務正在運行,0表示未運行\n'metrics_data += '# TYPE keepalived_status gauge\n'metrics_data += f'keepalived_status {keepalived_status}\n' # 檢查 keepalived 服務狀態metrics_data += f'# HELP ip_reachability_secondary{{ip="{ip_address}"}} 虛擬IP是否存在,1表示存在,0表示不存在\n' # 根據節點角色設置 Prometheus 格式的指標。主節點需要檢查虛擬 IP 是否不存在,定義的指標項為ip_reachability_primary;備節點需要檢查虛擬 IP 是否存在,定義的指標項為ip_reachability_secondarymetrics_data += '# TYPE ip_reachability_secondary gauge\n'metrics_data += f'ip_reachability_secondary{{ip="{ip_address}"}} {ip_status}\n'return Response(metrics_data, mimetype='text/plain')if __name__ == '__main__':app.run(host='0.0.0.0', port=4399) # 監聽 4399 端口
###腳本實現了兩個監控:
- 檢查了 keepalived 服務狀態
- 檢查了虛擬 IP 是否存在于本機,根據節點角色設置 Prometheus 格式的指標。主節點需要檢查虛擬 IP 是否不存在,定義的指標項為ip_reachability_primary;備節點需要檢查虛擬 IP 是否存在,定義的指標項為ip_reachability_secondary。虛擬ip是一個在主備節點之間共享的虛擬IP地址,永遠只存在于同一個virtual_router_id組中的主節點上。也是就說監控主節點上ip是否存在,備節點監控ip是否不存在
???###在如上腳本中,只需要將
ip_address = '110.120.100.48'
這里的IP替換為實際的VIP,其他地方不需要有任何變更
???
???2)安裝python和Prometheus所需依賴包
安裝Python:通過yum進行安裝。監控腳本是通過python實現的,因此需要安裝python3,用于運行keepalived_monitor.py監控腳本
[root@mysql-db2 ~]# yum install python3 [root@mysql-db2 ~]# python3 --version
???
安裝Flask:將Flask相關包上傳至Linux的/software/Flask目錄下。這里安裝flask是因為在keepalived_monitor.py監控腳本中使用了 Flask 的以下關鍵組件
組件 用途 必要性 Flask 創建輕量級Web服務器 ? 必須 @app.route 暴露 /metrics 端點供Prometheus抓取 ? 必須 Response 返回符合Prometheus格式的監控數據 ? 必須 flask相關包博主已打包上傳至資源,需要的小伙伴直接下載即可
[root@mysql-db2 ~]# cd /software [root@mysql-db2 ~]# unzip flask.zip [root@mysql-db2 ~]# cd flask [root@mysql-db2 ~]# pip3 install *.whl
PS小提示:如果不安裝Flask。那么通過python3運行keepalived_monitor.py腳本時會報如下錯誤:
???
???3)將監控腳本寫入到linux啟動服務項
[root@mysql-db2 ~]# cd /usr/lib/systemd/system [root@mysql-db2 ~]# vi keepalived_monitor.service[Unit] Description=Keepalived Monitor Script After=network.target[Service] Type=simple ExecStart=/usr/bin/python3 /opt/prometheus/keepalived_exporter/keepalived_monitor.py WorkingDirectory=/opt/prometheus/keepalived_exporter/ Restart=always Environment=PATH=/usr/bin:/usr/local/bin:/usr/sbin Environment=PYTHONUNBUFFERED=1[Install] WantedBy=multi-user.target[root@mysql-db2 ~]# systemctl daemon-reload [root@mysql-db2 ~]# systemctl start keepalived_monitor.service [root@mysql-db2 ~]# systemctl enable keepalived_monitor.service [root@mysql-db2 ~]# systemctl status keepalived_monitor.service
???
三、添加MySQL HA到prometheus中
注意:如下操作是在安裝了prometheus和Grafana的主機上進行操作
???1)將MySQL HA的信息加入到prometheus監控的配置文件prometheus.yml中
[root@prometheus ~]# vi /opt/prometheus/prometheus.yml 在scrape_configs下面新增如下內容: # keepalived_exporter配置- job_name: "MySQL keepalived status" ###job_name 用來唯一標識一個監控任務。在同一個 prometheus.yml 文件中,不同的 scrape_config可以有不同的job_name,以便 Prometheus 能夠區分和管理不同的監控目標和配置,用來將不同的監控目標分組。單位為監控keepalived設置一個獨立的job_namescrape_interval: 15s ###指定這個job_name每隔多久從每個目標(如 Exporter、應用端點)拉取一次指標數據。優先級:會覆蓋全局的 global:scrape_interval(如果存在)。file_sd_configs:- files:- /opt/prometheus/conf.d/keepalived_targets.json # keepalived需要監控的實例都單獨寫在了keepalived_targets.json文件中,是為了避免prometheus.yml內容過多,看起來更簡潔[root@prometheus ~]# vi /opt/prometheus/conf.d/keepalived_targets.json [{"targets": [ "110.120.100.46:4399" ],"labels": { "instance": "數據庫HA(keepalived)主庫(IP:110.120.100.46)" }},{"targets": [ "110.120.100.47:4399" ],"labels": { "instance": "數據庫HA(keepalived)從庫(IP:110.120.100.47)" }} ]
???
2)配置告警規則文件
????除了如下告警規則之外,還需要單獨配置一個Targets目標不可達(up)的相關規則,因為up 是一個布爾值指標,表示 Prometheus 是否能夠成功地 scrape(抓取)到指定的目標(targets)數據,用于判斷目標node-exporter相關進程是否在目標主機存活。關于up的規則文件參考:【prometheus+Grafana篇】從零開始:Linux 7.6 上二進制安裝 Prometheus、Grafana 和 Node Exporter
[root@prometheus ~]# cd /opt/prometheus/rules/ ###在prometheus.yml文件中定義了告警規則文件rule_files參數 [root@prometheus rules]# vi keepalived_alerts.ymlgroups:- name: keepalived_alertsrules:- alert: KeepalivedDownexpr: keepalived_status == 0for: 3slabels:severity: criticalannotations:summary: "Keepalived 服務已停止"description: "Keepalived 服務在 {{ $labels.instance }} 上停止運行,請立即通過systemctl status keepalived檢查服務狀態!"- alert: PrimaryIPReachabilityDownexpr: ip_reachability_primary == 0for: 3slabels:severity: criticalannotations:summary: "主節點虛擬IP不可達"description: "主節點的虛擬 IP {{ $labels.ip }} 在 {{ $labels.instance }} 上不可達,請通過systemctl status keepalived檢查服務狀態,并且檢查虛擬 IP 是否漂移到從庫上!"- alert: secondaryIPReachabilityUpexpr: ip_reachability_secondary == 1for: 3slabels:severity: criticalannotations:summary: "虛擬IP漂移到備節點"description: "虛擬 IP {{ $labels.ip }} 已從主節點漂移到 {{ $labels.instance }} ,需要人工干預將其轉移回主節點上運行!"
???
3)檢查配置文件
[root@prometheus ~]# cd /opt/prometheus/ [root@prometheus ~]# ./promtool check config prometheus.yml ###用于檢查 Prometheus 配置文件(prometheus.yml)的語法和格式是否正確。
執行這條命令會執行以下操作:
- 驗證配置文件的語法:檢查 prometheus.yml 文件是否符合 Prometheus 配置格式規范。
- 檢測潛在的錯誤或警告:如果配置文件中存在拼寫錯誤、格式問題、無效的配置項等問題,它會提供相關的錯誤信息或警告。比如告警規則寫的不對,就會有提示
- 輸出有用的診斷信息:如果配置文件存在問題,promtool 會輸出詳細的錯誤信息。
???4)prometheus.yml文件添加了信息,所以重啟prometheus進程或者重新加載配置文件(二選一)
#重載:前提是在prometheus.service啟動服務項中加了–web.enable-lifecycle參數:–web.enable-lifecycle:###啟用Prometheus的生命周期接口,允許通過HTTP請求來動態重新加載配置等操作。這對于在運行時更新配置或執行其他管理操作非常有用,當修改了prometheus的配置后,可以通過curl命令來重新加載配置文件,而不需要重啟prometheus(推薦方式)
[root@prometheus ~]# curl -X POST http://localhost:9090/-/reload
???
#重啟
[root@prometheus ~]# systemctl restart prometheus.service
???
5)在prometheus查看是否可以看到監控信息
網址:http://110.120.100.21:9090
菜單欄:Status—Targets
???
四、模擬主庫故障,查看告警
主庫:
[root@mysql-db1 ~]# service mysqld stop觸發如下告警
???
???
從庫:觸發如下告警
???
???
????那么可以看到當主庫故障時,監控到了主庫上的keepalived故障,并且VIP發生了漂移,也收到了VIP在從庫上的告警。那么后續就是先修復主庫數據后,然后人工將VIP再切換到主庫上就可以了,這里博主就不演示了