使用zabbix对线上的k8s集群容器mysql进行监控。
监控指标
需要实现的监控指标分为两类:
一:通过执行SQL获取数据的监控指标。需要执行的SQL有如下7个:
- show global status 从返回结果中取Variable_name和Value字段
- show slave status 从返回结果中取Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Running、Exec_Master_Log_Pos四个参数
- show global variables like ‘max%connections%’ 返回两行结果,从返回结果中取Variable_name和Value字段
- show processlist 首先将执行时间过长的进程信息写入日志文件,然后遍历返回结果,不考虑command类型为Binlog Dump GTID、Sleep、Connect的进程,获取time字段的最大值,该值作为MYSQL.CurrentMaxQueryTime指标的值。
- 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)
- set sql_log_bin=0; begin; select 1; commit; 计算该sql的执行时间,计算结果作为MySQL.Resptime指标
- 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中的红色数字为该设计方案每一步的工作序列,具体说明如下:
- Zabbix agent调用脚本发现符合条件的mysql service列表
- Zabbix agent将发现的service清单发送到proxy端
- Zabbix proxy将信息发送到zabbix server
- Zabbix server创建host并链接模板
- 由于此时ODBC DSN尚未创建,通过创建并触发action
- Action执行远程命令添加DSN配置信息
- Proxy按照item配置调用ODBC
- ODBC连接MYSQL获取监控数数据
图1. 总计架构图: