赞
踩
一、简介
MySQL 8.0是当前Oracle公司一直在大力宣传的新版本,从架构到性能均有显著变化,随着kubernetes容器的普及更好的提升资源利用率,进行对云上MySQL的监控。云上的Mysql如何进行状态和性能的监控呢?
二、监控方案对比
Zabbix方案:
Zabbix监控系统基于c语言开发的开源监控系统,支持多种监控采集方式,应用广泛,系统比较成熟,缺点是对容器支持度比较差。
Prometheus方案:
Prometheus监控系统基于go语言开发的开源监控系统,支持pull和push两种采集模式,有完整的监控、报警、展示、数据异地传输能力,配置简单,对容器支持良好。
由于MySQL部署在云上,而且公司现有Promehteus对PaaS云监控监控的基础,因此方案二是更佳选项,既能满足MySQL监控,又能充分利用现有资源。
三、Prometheus概述
Prometheus是由SoundeCloud公司基于go语言开发的一款开源的监控报警解决方案,基于时间序列监控数据。
1.组件及架构
组件:
promethues server:主要获取和存储时间序列数据
Exporters(导出器):主要是作为agent收集数据发送到prometheus server,不同的数据收集由不同的exporters实
pushgateway:允许短暂和批处理的jobs推送它们的数据到prometheus;然后由prometheus拉取数据。
alertmanager:实现prometheus的告警功能。
组件间关系如下:
2.Prometheus特点
指标收集:prometheus服务器定义了名为目标(target)的配置,执行抓取所需要的信息。
服务发现:可以通过通过多种方式来处理要监控的资源。包括:静态资源列表、基于文件发现、自动发现。
聚合和报警:在服务器上可以查询和聚合时间序列数据。通过规则记录常用的查询并做聚合。可以设置报警规则,满足报警条件时会触发报警,把报警信息推送的alertmanager。
自治:不依赖分布式存储,单个服务器节点是自主的。
冗余和高可用性:可部署多台prmehteus服务器,实现监控系统的高可用性。
查询语言:prometheus服务器提供了查询语言PromQL,用于对时序数据进行筛选和运算。
可视化:prometheus内置表达式浏览器可提供可视化,可与grafana配合实现监控数据可视化展示。
四、MySQL数据库监控
1.监控方案
Prometheus官方提供了mysqld_exporter导出器,可实现对MySQL监控。该导出器通过MySQL用户连接数据库,查询相关数据库表、状态信息,通过http服务的方式暴露监控数据。
方案不足:导出器可实现单节点和主从复制相关监控项,但对于MGR模式相关监控目前还不能很好地支持。
方案改进:prometheus提供了client libraries,可实现对监控指标进行定制化采集。所以可用python语言定制开发脚本的方式对MGR相关数据进行采集,mysqld_exporter与python脚本能够满足全部监控信息的导出。
2.部署方案
关于Paas云上的MySQL监控部署,有两种方案:
MySQL、mysqld_exporter、my_exporter_python监控脚本三部分同在一个镜像中,运行该容器可实现对MySQL的监控。
MySQL、mysqld_exporter、my_exporter_python监控脚本分别属于不同的镜像,MySQL主容器与监控容器按顺序运行。监控容器以sidecar的方式访问MySQL。
方案对比选择:
MySQL数据库服务对于应用是非常重要的一环,要确保MySQL安全可靠。方案一,如果MySQL异常或出现错误,对问题诊断与排错方面,监控导出器可能会干扰项,不利于后期MySQL运维管理。方案二,由于三部分在不同的容器中运行,不会产生互相干扰的可能性,因此方案二在此场景中最为友好。
五、监控部署
1.创建MySQL监控用户并授权
CREATE USER exporter'@%' IDENTIFIED BY 'USERPASSWD' MAX_USER_CONNECTIONS 3;
GRANT PROCESS,REPLICATION CLIENT, SELECT ON ** TO exporter'@%';
2.脚本说明
9000端口提供http提供服务
start_http_server(9000)
设置Gauge对象
def set metric():
mysql_mgr_node_status = Gauge('mysql_mgr_node_status' 'mgr_node_status'['uuid'])
mysql_mgr_node_health = Gauge('mysql_mgr_node_health','mgr_node_health', ['uuid'])
mysql_mgr_role = Gauge('mysql_mgr_role', 'mgr_role', ['uuid'])
mysq_mgr_apply_queue = Gauge('mysql_mgr_apply_queue','mgr_apply_queue', ['uuid])
mysql_big_trx = Gauge('mysql_big_trx', big_trx', ['uuid'])
连接接MySQL查询数据
def connection status(): #连接数据库
global connection
try:
connection = pymysql.connect(**db_config)
connection status = 1
return connection_status
except:
connection_status = 0
return connection_status
def getPara(sql): #返回查询结果
global connection
cursor = connection.cursor()
try:
cursor.execute(sql)
statusPara = cursor.fetchall()
return statusPara
设置MGR相关的metrics
3.镜像拉取与定制
mysqld_exporter镜像pull:
docker pull prom/mysqld_exporter
my_exporter_python镜像制作
Dockerfile内容
FROM centos7_python36:v1
RUN pip install prometheus_client pymysql
RUN pip install requests
COPY ./my_exporter_python_v2.py /my_exporter_python_v2.py
WORKDIR /
EXPOSE 9000
CMD ["python","my_exporter_python_v2.py"]
4.镜像部署yaml文件部分内容
apiVersion: apps/v1
kind: StatefulSet
metadata:
......
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: DATA_SOURCE_NAME
value: 'exporter:userpassword@(localhost:3306)/'
- name: TARGET
value: 'http://localhost:9104/metrics'
image: 'registry.paas.test.abc/library/mysqld-exporter-python:v5'
imagePullPolicy: Always
name: mysqld-python
ports:
- containerPort: 9000
name: mysqld-python
protocol: TCP
resources:
limits:
cpu: '2'
memory: 4Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
- env:
- name: TZ
value: Asia/Shanghai
- name: DATA_SOURCE_NAME
value: 'testuser:userpassword@(localhost:3306)/'
image: 'registry.paas.test.abc/library/mysqld-exporter:latest'
imagePullPolicy: Always
name: mysqld-exporter
ports:
- containerPort: 9104
name: mysqld-exporter
protocol: TCP
resources:
limits:
cpu: '2'
memory: 4Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
5.Prometehus server设置target
- job_name: kubernetes-pods
scrape_interval: 30s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
kubernetes_sd_configs:
- api_server: null
role: pod
namespaces:
names: []
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
separator: ;
regex: "true"
replacement: $1
action: keep
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
separator: ;
regex: (.+)
target_label: __metrics_path__
replacement: $1
action: replace
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
separator: ;
regex: ([^:]+)(?::\d+)?;(\d+)
target_label: __address__
replacement: $1:$2
action: replace
- separator: ;
regex: __meta_kubernetes_pod_label_(.+)
replacement: $1
action: labelmap
- source_labels: [__meta_kubernetes_namespace]
separator: ;
regex: (.*)
target_label: kubernetes_namespace
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_pod_name]
separator: ;
regex: (.*)
target_label: kubernetes_pod_name
replacement: $1
action: replace
6.采集指标解释
Thread_connected:表示打开的链接数,对应输出的监控指标为:mysql_global_status_threads_connected。
Threads_running:表示激活的连接数,并发数,对应输出的监控指标为:mysql_global_status_threads_running。
max_used_connections:表示当前使用过的最大连接数,对应输出的监控指标为:mysql_global_status_max_used_connections。
max_connections:表示并发执行的最大连接数,对应输出的监控指标为:mysql_global_variables_max_connections。
Questions:表示为收到的总请求的次数,对应输出的监控指标为:mysql_global_status_questions。如果想要得到没秒请求的数量,可以如下方法所示:
irate(mysql_global_status_questions[5m]),显示5分钟内每秒请求的数量,即QPS。
Innodb_buffer_pool_reads:表示直接从磁盘读的次数,对应输出的监控指标为:
mysql_global_status_innodb_buffer_pool_reads。
Innodb_buffer_pool_read_requests:表示逻辑读的次数,
对应输出的监控指标为:
mysql_global_status_innodb_buffer_pool_read_requests。
计算逻辑读的命中率,公式为:100 - 100 * (mysql_global_status_innodb_buffer_pool_reads/
mysql_global_status_innodb_buffer_pool_read_requests)。
Threads_created:表示创建过的线程数,对应输出的监控指标为:mysql_global_status_threads_created。
Connections:表示试图链接mysql服务器的次数,对应输出的监控指标为:mysql_global_status_connections。
表缓存命中率为:(1-mysql_global_status_threads_created/mysql_global_status_connections)*100 。
7.python脚本实现监控指标及sql语句
mysql组复制相关信息记录在performance_schema库中的replicaion_conection_status、replication_group_member_stats、replication_group_members表中,通过关联查询能够得到组复制相关的监控项
大事务查询
SELECT
@@GLOBAL .server_uuid, COUNT(trx_id)
FROM
information_schema.INNODB_TRX,
sys.session AS se
WHERE
trx_mysql_thread_id = conn_id
对应输出的监控指标为:mysql_big_trx,由于此查询需要调用MySQL系统sys相关视图,所以需要为exporter额外授权。
grant usage on *.* to exporter@'%';
grant select,execute on sys.* to exporter@'%';
博客可能不能及时关注,技术问题欢迎加入交流;
微信号:king_songax
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。