背景

1、Prometheus官网提供的mysql exporter 对于mysql实例只能一个进程监控一个实例,数据库实例很多的情况,不方便管理

2、内部有定制化监控需求,RDS 默认无法实现,比如对数据库增长的监控

3、默认 Prometheus官网提供的mysql exporter 采集mysql几乎所有的指标,但是实际用到的却不多。浪费存储空间

思路

先了解对于数据库的监控需求

  • 1、一个exporter可以采集所有RDS实例数据

  • 2、RDS 实例采集指标不用全部采集,按需即可

  • 3、定制化需求

    • 数据库磁盘使用率,默认mysql的status/variables中没有该指标
    • 统计数据库、表的总大小(数据大小+索引大小)

** 针对第一个需求 **

之前在使用Prometheus监控redis的时候,有个export实现了可以同时监控多个实例的情况,大概的思路是:

把实例名称或者地址作为target参数传递给一个URL,这个URL就是一个exporter,然后根据传递的不同target 采集相同指标

** 针对第二个需求 **

做过监控的人都知道mysql的监控指标其实都是采集的show global statusshow global variables 的结果然后做相关汇总或者计算

所以我们很容易就可以通过这两个sql的结果帅选出需要的选项保存在一个配置文件,采集的时候读取该配置文件选项,按需采集即可

** 针对第三个需求 **

数据库磁盘使用率 / 统计数据库、表的总大小 都不是从status/variables 能获取到的。所以了解Prometheus架构的就知道,可以使用 pushgateway 来实现

自定义 exporter 介绍

cws-mysql-exporter
├── aliyunapi.py
├── config.py
├── generate-instance-yml.py
├── instance.yml
├── metrics.yml
├── utils.py
├── pushgateway.py
├── push_cron_dbsize.py
├── push_cron_rds_cpumemiops.py
└── rds-exporter.py
  • aliyunapi.py 是封装的阿里云相关的api接口,因为磁盘和CPU只能从阿里云获取,它和主机有关系
  • config.py 里面定义 阿里云api的ak/sk ,以及 exporter连接数据库用到的账号和密码,这个账号密码是所有实例共用的
  • generate-instance-yml.py 这个是首次需要执行的脚本,生成 instance.yml 配置文件,主要是获取所有RDS的实例名称和连接地址,及instance_id(因为有些接口入参必须是instance_id)
rds-xxxx:host: rm-xxxxxx.mysql.rds.aliyuncs.comid: rm-xxxxxxrds-yyyyy:host: rm-yyyyy.mysql.rds.aliyuncs.comid: rm-yyyyy
  • metrics.yml 是需要采集的监控指标,分variablesstatus ,格式如下
variables:max_connections: ""max_user_connections: ""... ...
status:Aborted_connects: ""Aborted_clients: ""... ...
  • utils.py 是封装的公共函数

  • pushgateway.py 是封装的需要推送的 pushgateway 的监控指标

  • push_cron_dbsize.pypush_cron_rds_cpumemiops.py 是包装的不同维度需要推送到 pushgateway 的脚本, 最终需要在crontab中定时去执行

  • rds-exporter.py 是 exporter 的入口,这里借助了 flask 来运行server

exporter 开源地址详见: 自定义exporter实现多RDS数据采集

启动 rds-exporter, 默认端口在 5005

Prometheus及组件安装

这里介绍简单的安装和配置,具体的Prometheus及其架构介绍网上有很多资料,大家自行查阅即可

1、安装Prometheus

#!/usr/bin/env bash
# encoding: utf-8
# Author: Eagle
# Desc: 自动化安装 Prometheus
# version="2.36.1"
if [ $# -eq 1 ]
thenversion="$1"
fiecho "Will install prometheus ${version} version"# download
wget "https://github.com/prometheus/prometheus/releases/download/v${version}/prometheus-${version}.linux-amd64.tar.gz"# untar and set link
tar -zxf prometheus-${version}.linux-amd64.tar.gz -C /opt/app
ln -s /opt/app/prometheus-${version}.linux-amd64 /opt/app/prometheus

2、安装pushgateway

#!/usr/bin/env bash
# encoding: utf-8
# Author: Eagle
# Desc: 自动化安装 Prometheus Pushgateway
# version="1.4.3"
if [ $# -eq 1 ]
thenversion="$1"
fiecho "Will install prometheus pushgatewa ${version} version"
wget "https://github.com/prometheus/pushgateway/releases/download/v${version}/pushgateway-${version}.linux-amd64.tar.gz"# untar and set link
tar -zxf pushgateway-${version}.linux-amd64.tar.gz -C /opt/app
ln -s /opt/app/pushgateway-${version}.linux-amd64 /opt/app/pushgateway

3、启动 pushgateway

配置systemd service,文件位置/usr/lib/systemd/system/pushgateway.service

Description=Prometheus Pushgateway Service
Requires=network-online.target
After=network-online.target[Service]
Restart=on-failure
ExecStart=/opt/app/pushgateway/bin/pushgateway[Install]
WantedBy=multi-user.target
  • 配置开启自启动 systemctl enable pushgateway
  • 启动/停止/重启 systemctl start/stop/restart pushgateway

pushgateway不需要额外的配置,默认是在9091端口

4、配置Prometheus并启动

配置systemd service,文件位置/usr/lib/systemd/system/prometheus.service

Description=Prometheus Server
Requires=network-online.target
After=network-online.target[Service]
Restart=on-failure
ExecStart=/opt/app/prometheus/bin/prometheus --config.file=/opt/app/prometheus/prometheus.yml --storage.tsdb.retention=60d --web.enable-lifecycle --web.enable-admin-api --storage.tsdb.path=/data/prometheus-data[Install]
WantedBy=multi-user.target

注意提前创建 prometheus 数据目录

  • 配置开启自启动 systemctl enable prometheus
  • 启动/停止/重启 systemctl start/stop/restart prometheus

配置Prometheus

# 这里是全局变量的配置
global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.# scrape_timeout is set to the global default (10s).# 这里是配置 alertmanager, Prometheus会根据 rules 规则把告警信息发送给 alertmanager 组件,alertmanager 负责实际告警信息的发送
alerting:alertmanagers:- static_configs:- targets: ['192.168.xx.yyy:9093']# 这里是配置告警规则,本次不是讲解重点先忽略
# rule_files:
#   - "rules/rds_rules.yml"# 配置Prometheus从那些 endpoint 或者叫 exporter 采集监控数据
scrape_configs:# 默认监控 Prometheus服务本身- job_name: "prometheus"static_configs:- targets: ["localhost:9090"]labels:instance: prometheus# 自定义的mysql targets ,这里的targets是通过直接配置的方式# 另外还有通过文件的方式、通过consul等自动发现的方式,# 这两种方式这里不展开介绍,感兴趣的关注后续文章- job_name: 'mysql_targets'scrape_interval: 60sscrape_timeout: 12smetrics_path: /scrapestatic_configs:- targets:- rds-xxx- rds-yyy# relabel_configs 是通过label重写实现我们最终需要的标签# 另外这里是通过重写target,重新定义了 endpoint 地址relabel_configs:- source_labels: [__address__]target_label: __param_target- source_labels: [__param_target]target_label: instance- target_label: __address__replacement: 192.168.3.108:5005# pushgateway - job_name: 'pushgateway'scrape_interval: 60sstatic_configs:- targets:- 192.168.3.108:9091# 这里是对自定义的 mysql-exporter 做监控- job_name: 'rds-exporter'scrape_interval: 60sstatic_configs:- targets:- 192.168.3.108:5005

重启Prometheus或者执行reload操作 curl -XPUT http://192.168.3.108:9090/-/reload 使配置生效

最终在prometheus的webui界面的Status -> Targets 里面看到如下


Grafana 配置MySQL监控大盘

具体的Grafana安装和配置请参考教程 或者网上自动查阅

打开Grafana界面进行 Dashboard的导入,如下图所示

点击左侧 + 选择 import ,然后通过三种不同的方式导入Dashboard模板

1、在granfan 官网找到合适的模板之后,记住ID,输入该ID然后点击Load
2、通过右上角的 Upload .json file 上传本地的模板json文件
3、直接把本地的模板json文件内容copy到 Or paste JSON 下方的框中即可

这里提供自定义的模板JSON文件 下载地址

最终的效果如下

自定义prometheus exporter实现监控阿里云RDS相关推荐

  1. Zabbix 监控阿里云RDS

    简介 Zabbix 监控阿里云RDS数据库.主要通过阿里云提供的API来进行监控. 需要在阿里云获取"用户AccessKey"指定ID,进行RDS监控. 环境 服务:Zabbix ...

  2. 从没想到监控可以这么做!阿里云RDS智能诊断系统首次公开

    阿里妹导读:来自阿里云RDS团队的论文"TcpRT: Instrument and Diagnostic Analysis System for Service Quality of Clo ...

  3. 阿里云RDS深度定制-XA Crash Safe

    简介: 近几年,随着分布式数据库系统的兴起,特别是基于MySQL分布式数据库系统,会用到XA来保证全局事务的一致性.众所周知,MySQL对XA事务的支持是比较弱的,存在很多问题.为了满足分布式数据库系 ...

  4. 自建MySQL和阿里云RDS的区别 有必要使用云数据库吗?...

    很多阿里云ECS用户都会考虑是使用ECS自建数据库还是使用阿里云的RDS云数据库,如何选择?有必要使用云数据库吗?云吞铺子告诉你使用阿里云RDS云数据库的理由: RDS的高可用性 RDS提供了主备双节 ...

  5. 阿里云mysql数据库引擎_在阿里云RDS数据库服务器中将MySQL InnoDB引擎表转为压缩格式...

    今年以来将我们以前托管或者租用的服务器全面转向阿里云,除了采用ECS服务器以外,还有一项重要的是采用了RDS数据库服务器,这对于服务的稳定性.各项指标的监控.调优等都有帮助. 不过随着近期更多数据库转 ...

  6. Greenplum roaring bitmap与业务场景 (类阿里云RDS PG varbitx, 应用于海量用户 实时画像和圈选、透视)

    摘要: 标签 PostgreSQL , Greenplum , varbitx , roaring bitmap , pilosa , varbit , hll , 多阶段聚合 背景 roaring ...

  7. 阿里云rds for mysql平台介绍_阿里云RDS for MySQL 快速入门——笔记

    1初始化配置 1.1设置白名单 创建RDS实例后,需要设置RDS实例的白名单,以允许外部设备访问该RDS实例.默认的白名单只包含默认IP地址127.0.0.1,表示任何设备均无法访问该RDS实例. 设 ...

  8. 重磅干货免费下载!阿里云RDS团队论文被数据库顶会SIGMOD 2018收录

    为什么80%的码农都做不了架构师?>>>    摘要: 来自阿里云RDS团队的论文"**TcpRT: Instrument and Diagnostic Analysis ...

  9. 【数据库取证篇】阿里云RDS数据库简介

    [数据库取证篇]阿里云RDS数据库简介 ​ 初识RDS基本信息,知其然,再知其所以然-[suy] 文章目录 [数据库取证篇]阿里云RDS数据库简介 (一)云数据库RDS简介 1.各版本功能 (二)RD ...

最新文章

  1. git 推送本地分支到远程分支 git push origin
  2. CUDA: GPU高性能运算
  3. mysql unicode转汉字_如果有人问你 MySql 怎么存取 Emoji,把这篇文章扔给他
  4. boost::graph模块实现边列表算法上的连通分量
  5. C语言补丁原理,C语言可变长參数实现原理
  6. php 输入值,php-HTML输入值更改
  7. 类模板static成员的使用
  8. webstorm 注册码,亲测可用
  9. 手把手教你整合最优雅SSM框架
  10. First集、Follow集
  11. 获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
  12. .NET Remoting Basic(4)-客户端调用方式
  13. position学习终结者(一)
  14. 深入理解 Java 内存模型
  15. codeforces 27 E. Number With The Given Amount Of Divisors(数论+dfs)
  16. 轻松搞定技术面系列 1——基础篇
  17. 黑马程序员python全套视频-python视频教程免费:求黑马程序员python教程?
  18. java单例调用_java单例模式
  19. MOEA/D-RDG 2016 阅读笔记
  20. CDA Level1知识点总结之业务分析报告与数据可视化报表

热门文章

  1. js实现浏览器的全屏和退出全屏
  2. 关于CRDT的一些理论理解
  3. 手机网速越来越慢?路由器别放在这3个地方
  4. 解决laravel框架在腾讯云 Serverless Framework 中439错误 Process exited before completing request问题
  5. Rviz 和Gazebo联合仿真运动(二)
  6. 【EmbeddedDev】BBBRTL8188CUS搭建wifi AP 问题整理
  7. 响应式编程实现技术概述
  8. 【⑩MySQL】:表管理,让数据管理不再困难
  9. excel-批量创建工作表
  10. 多因子模型之因子(信号)测试平台----因子值的处理(一)