Zabbix监控MySQL的MGR群集

MySQL的MGR(MySQL Group Replication)是MySQL官方提供的一种高可用性和高可靠性的集群解决方案。MGR通过使用基于组复制的方式,实现了多个MySQL实例之间的数据同步和故障转移,从而提供了自动故障恢复和负载均衡的功能。本文将介绍如何通过Zabbix监控mysql的MGR群集状态。

1. 给MGR群集内的数据库监控账号赋权(这里用的zbxuser)

grant select on performance_schema.replication_group_members to 'zbxuser'@'%';

刷新mysql配置

flush privileges;

2. 在pymys.py内添加MGR监控脚本

cd /itops/zabbix/share/zabbix/externalscripts    #zabbix的外部检查目录

vim pymys.py   写入以下内容:

#!/usr/bin/env python3 #encoding=utf-8 #edit by yang hao #version 0.1

import argparse import pymysql import inspect import json import re

class Checks(object): def mysql_mgr_state(self): #print('11') #print(self.args.text) #sql = 'select * from performance_schema.replication_group_members;' sqlhost = 'select MEMBER_HOST from performance_schema.replication_group_members;' self.cur.execute(sqlhost) res = self.cur.fetchall() key = ['{#MEMBERHOST}'] lst = [] for i in res: d = dict(zip(key, i)) lst.append(d) print(json.dumps({'data': lst}))

def mysql_mgr_status(self): name = self.args.text #print(name) sql = "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_HOST='%s'" % (name)+ ";" if self.cur.execute(sql): res = self.cur.fetchall()[0][0] print(res) else: print("Empty set")

def mysql_mgr_id(self): name = self.args.text #print(name) sql = "select MEMBER_ID from performance_schema.replication_group_members where MEMBER_HOST='%s'" % (name)+ ";" if self.cur.execute(sql): res = self.cur.fetchall()[0][0] print(res) else: print("Empty set")

class Main(Checks): def __init__(self): parser = argparse.ArgumentParser() parser.add_argument('--ip') parser.add_argument('--username') parser.add_argument('--password') parser.add_argument('--port') parser.add_argument('--database') parser.add_argument('--text')

subparsers = parser.add_subparsers()

for name in dir(self): if not name.startswith("_"): p = subparsers.add_parser(name) method = getattr(self, name) argnames = inspect.getargspec(method).args[1:] for argname in argnames: p.add_argument(argname) p.set_defaults(func=method, argnames=argnames) self.args = parser.parse_args()

def db_connect(self): a = self.args ip = a.ip username = a.username password = a.password port = int(a.port) database = a.database self.db = pymysql.connect(host = ip, port = port, user = username,passwd = password, db = database) self.cur = self.db.cursor()

def db_close(self): self.cur.close() self.db.close()

def __call__(self): try: a = self.args callargs = [getattr(a, name) for name in a.argnames] self.db_connect() try: return self.args.func(*callargs) finally: self.db_close() except Exception as err: print("0") print(str(err))

if __name__ == "__main__": main = Main() main()

vim pymys   写入以下内容:

#!/usr/bin/bash /usr/bin/python3 /itops/zabbix/share/zabbix/externalscripts/pymys.py --ip $1 --username $2 --password $3 --port $4 --database $5 $6 $7 $8

3. 测试命令参考:

./pymys 数据库地址  用户名  密码  端口号  库名   mysql_mgr_state  //返回数据类似下图即可

测试拿群集状态信息:./pymys 数据库地址  用户名  密码  端口号  库名 --text 节点名称  mysql_mgr_status

4. 在mysql监控模板创建自动发现规则

名称:MGR监控

类型:外部检查

键值:pymys[{$ADDRESS},{$USERNAME},{$PASSWORD},{$PORT},{$DATABASE},mysql_mgr_state]

5. 创建监控项原型一

名称:{#MEMBERHOST}的节点ID

类型:外部检查

键值:pymys[{$ADDRESS},{$USERNAME},{$PASSWORD},{$PORT},{$DATABASE},--text,{#MEMBERHOST},mysql_mgr_id]

6.创建监控项原型二

名称:{#MEMBERHOST}的状态

类型:外部检查

键值:pymys[{$ADDRESS},{$USERNAME},{$PASSWORD},{$PORT},{$DATABASE},--text,{#MEMBERHOST},mysql_mgr_status]

7. 创建触发器类型

名称: [数据库:MYSQL]{#MEMBERHOST}此节点与其他节点同步状态出现错误

表达式:

V:OFFLINE|ERROR|UNREACHABLE

探索技术无限可能,博主具有丰富监控模板资源及开发能力和项目管理经验,欢迎添加交流一起探讨,解决你的技术难题!

微信号:king_songax

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichaelCoCoQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值