# dbcs **Repository Path**: hxzzzy/dbcs ## Basic Information - **Project Name**: dbcs - **Description**: 监控MySQL5.7 Innodb Cluster相关性能参数 支持网络波动自动恢复 支持钉钉预警 - **Primary Language**: Python - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-15 - **Last Updated**: 2021-10-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: MySQL, innodb-cluster, python2 ## README # 监控MySQL Innodb Cluster ## 1. Story 公司使用mysql innodb cluster来作为mysql数据库负载分担,一直以来都是采用telegraf进行信息收集,但是mysql新出的的Innodb Cluster,telegraf不支持相关信息的收集,打算自己写一个。 同时,在集群出现问题时能够及时得到处理,添加了钉钉预警及自动恢复。 主要记录以下相关信息: 1. 集群节点(member_host) 2. 节点状态(member_state) 3. 节点模式(member_mode) 4. 节点端口(member_port) 5. 节点UUID(member_id) 目前是没有看到哪个mysql监控工具上提供这样的指标。 本文要介绍的自己写的采集工具,是基于组内现有的一套监控体系: - `InfluxDB`:时间序列数据库,存储监控数据 - `Grafana`:数据展示面板 - `Telegraf`:收集信息的agent 打算自己用python撸一个,上报到influxdb里 :) - `DingDing`:检测到集群出现问题,预警到钉钉群 ## 2. Concept ### 1. 信息收集 实现也特别简单,就是查询 `performance_schema` 库`replication_group_members`,`global_status`两个表: ``` SELECT @@hostname as server, rgm.member_id, rgm.member_host, rgm.member_port, rgm.member_state, IF(gs.variable_name='group_replication_primary_member', 'R/W', 'R/O') as member_mode FROM performance_schema.replication_group_members as rgm LEFT JOIN performance_schema.global_status as gs on rgm.member_id=gs.variable_value ``` 然后使用 InfluxDB 的python客户端,批量存入influxdb。如果没有InfluxDB,结果会打印出json —— 这是Zabbix、Open-Falcon这些监控工具普遍支持的格式。 最后就是使用 Grafana 从 influxdb 数据源画图。 ### 2. 钉钉预警 当集群出现故障或者进行切换时,将预警信息发送到钉钉群并@负责人 ### 3. 故障恢复 MySQL Innodb Cluster 没有自动恢复机制,每次出现问题后需要我们登录服务器手动处理,就顺便写了个自动恢复的功能 ## 3. Usage ### 1. 环境 在 python 2.7 环境下编写的,3.x没测。 运行需要`pymysql`、`influxdb`两个库: ``` $ sudo pip install pymysql influxdb ``` ### 2. 配置 `dbinfo.yaml` 数据库配置文件 - `mysql`:列表存放需要采集的哪些MySQL实例表信息,元组内分别是连接地址、端口、用户名、密码 用户需要select表的权限,否则看不到对应的信息. - `influxdb`:influxdb的连接信息,数据库名 `telegraf` 设置为 `None` 可输出结果为json. `logger.yaml` 日志配置文件,配置日志文件路径 ### 3. 创建influxdb上的数据库和存储策略 存放2年,1个复制集:(按需调整) ``` CREATE DATABASE "mysql_innodb_cluster" CREATE RETENTION POLICY "mysql_info_schema" ON "mysql_innodb_cluster" DURATION 730d REPLICATION 1 DEFAULT ``` influxdb数据如下图 ![influxdb](images/865B3C0A-3438-48c7-8718-377719189866.png) ### 4. 放crontab跑 可以单独放在用于监控的服务器上,不过建议在生产环境可以运行在mysql实例所在主机上,安全起见。 30s一次 ``` * * * * * /usr/bin/python /home/teld/app/mysql_innodb_cluster/mysql_innodb_cluster.py >> /home/teld/app/logs/mysql_innodb_cluster.log 2>&1 * * * * * sleep 30 && /usr/bin/python /home/teld/app/mysql_innodb_cluster/mysql_innodb_cluster.py >> /home/teld/app/logs/mysql_innodb_cluster.log 2>&1 ``` ### 5. 示例 ![telegrafa](images/DCF4BE12-E07C-4b34-A76E-DDACB9DC93F3.png) ![dingding](images/BED1C73E-57BE-4ad7-B70E-56750CE01CF3.png) ![dingding](images/2AA4A6DA-9BA9-4109-AE23-8D2344D1895A.png)