当前位置:   article > 正文

Prometheus监控云上MySQL_prometheus监控mysql

prometheus监控mysql

一、简介

MySQL 8.0是当前Oracle公司一直在大力宣传的新版本,从架构到性能均有显著变化,随着kubernetes容器的普及更好的提升资源利用率,进行对云上MySQL的监控。云上的Mysql如何进行状态和性能的监控呢?

二、监控方案对比

Zabbix方案:

Zabbix监控系统基于c语言开发的开源监控系统,支持多种监控采集方式,应用广泛,系统比较成熟,缺点是对容器支持度比较差。

Prometheus方案:

Prometheus监控系统基于go语言开发的开源监控系统,支持pull和push两种采集模式,有完整的监控、报警、展示、数据异地传输能力,配置简单,对容器支持良好。

由于MySQL部署在云上,而且公司现有Promehteus对PaaS云监控监控的基础,因此方案二是更佳选项,既能满足MySQL监控,又能充分利用现有资源。

三、Prometheus概述

Prometheus是由SoundeCloud公司基于go语言开发的一款开源的监控报警解决方案,基于时间序列监控数据。

1.组件及架构

组件:

  • 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/556498
推荐阅读
相关标签
  

闽ICP备14008679号