使用zabbix odbc自动发现并监控容器mysql的方案

使用zabbix对线上的k8s集群容器mysql进行监控。

监控指标

需要实现的监控指标分为两类:

一:通过执行SQL获取数据的监控指标。需要执行的SQL有如下7个:

  1. show global status 从返回结果中取Variable_name和Value字段
  2. show slave status 从返回结果中取Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Running、Exec_Master_Log_Pos四个参数
  3. show global variables like ‘max%connections%’ 返回两行结果,从返回结果中取Variable_name和Value字段
  4. show processlist 首先将执行时间过长的进程信息写入日志文件,然后遍历返回结果,不考虑command类型为Binlog Dump GTID、Sleep、Connect的进程,获取time字段的最大值,该值作为MYSQL.CurrentMaxQueryTime指标的值。
  5. select * from information_schema.innodb_trx 遍历返回结果,记录事务时间过长的行,计算事务最长执行时间(MySQL.longest_trx_time)、事务锁定的最大行数(MySQL.max_trx_rows_locked)、事务锁定内存的最大字节数(MySQL.max_trx_lock_memory_bytes)、事务修改的最大行数(MySQL.max_trx_rows_modified)
  6. set sql_log_bin=0; begin; select 1; commit; 计算该sql的执行时间,计算结果作为MySQL.Resptime指标
  7. show engine innodb status; 用于计算是否出现死锁,作为MySQL.Deadlock指标

二:通过检查某个日志文件(error.log),确定指标的值。
该类指标会检查日志文件中出现的特定关键字,包括:shut down、Semi-sync replication switched OFF、[ERROR]、[Warning]、[Note]、ANYWORDS 

系统环境

线上容器mysql将运行在k8s集群的pod中,所使用的namespace名称有固定的特征。每个mysql实例都通过service暴露出来,包括主库和从库,并且service的名称命名也有一定的规范。Mysql的数据和日志文件都使用本地存储,即物理文件存储在pod所在的宿主机上,并有固定的路径。

同时,zabbix proxy也将部署在相同的k8s集群中,并通过statefulset提供服务。因此zabbix proxy和mysql处于同一集群,可以方便地互相访问。

由于用到odbc,并且要通过zabbix proxy调用,因此需要将odbc安装到zabbix proxy所在的容器镜像里。

设计方案架构图

整体设计方案架构如图1所示,总的设计逻辑是:由k8s管理节点上的zabbix agent负责发现该集群中的所有mysql实例的service信息(通过kubectl命令或者API);相关信息发送到zabbix server后由zabbix server创建host并链接模板;ODBC所需的DSN配置信息则通过action执行远程命令进行写入(通过zabbix proxy或者zabbix agent);一旦DSN信息创建成功,则zabbix可以正常执行SQL采集监控数据。

图1中的红色数字为该设计方案每一步的工作序列,具体说明如下:

  1. Zabbix agent调用脚本发现符合条件的mysql service列表
  2. Zabbix agent将发现的service清单发送到proxy端
  3. Zabbix proxy将信息发送到zabbix server
  4. Zabbix server创建host并链接模板
  5. 由于此时ODBC DSN尚未创建,通过创建并触发action
  6. Action执行远程命令添加DSN配置信息
  7. Proxy按照item配置调用ODBC
  8. ODBC连接MYSQL获取监控数数据

图1. 总计架构图:

发布了14 篇原创文章 · 获赞 2 · 访问量 2130

猜你喜欢

转载自blog.csdn.net/mcmoo/article/details/103887561
今日推荐