主节点需要检查虚拟 IP 是否不存在 :正常情况下keepalived的VIP只能存在于主库上,而不能存在于除了主库的其他任意节点上
从库:
监控从库上的keepalived监控
备节点需要检查虚拟 IP 是否存在 :正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就进行告警。这样的好处在于可以马上知晓VIP漂移到了从节点上,也可以监控是否出现了脑裂问题,如果出现了脑裂能马上进行干预和处理。PS提示:Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
现在知道了该监控哪些内容,那么开始如下配置。
监控部署流程正式启动,请勿中断操作!!!🚀
一、HA主
1)编辑监控keepalived+VIP进程脚本
sql复制代码
[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.py
from flask import Flask, Response
import subprocess
import os
app = 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_secondary
metrics_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是否存在
[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.py
from flask import Flask, Response
import subprocess
import os
app = 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_secondary
metrics_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是否不存在