使用prometheus监测MySQL主从同步状态方案

慈云数据 2024-06-01 技术支持 74 0

说明:本文介绍如何使用prometheus、alertmanager监测MySQL主从,当从节点中断同步时,发送邮箱报警,并使用grafana将数据视图化。

结构图如下:

在这里插入图片描述

安装

(1)安装应用

首先,来安装prometheus、alertmanager和grafana,参考以下文章(都是我写的,嘿嘿):

  • CentOS 7安装prometheus

  • CentOS 7安装alertmanager

  • CentOS 7安装/卸载Grafana

    prometheus、alertmanager可以设置成用systemctl命令来管理,参考下面这篇文章:

    • CentOS 7如何使用systemctl管理应用

      安装完成后,可在浏览器上输入对应的IP:端口访问,如果是云服务器,需要开放相关端口。如下:

      promethes地址:http://localhost:9090/

      alertmanager地址:http://localhost:9093/

      grafana地址:http://localhost:3000/

      在这里插入图片描述

      (2)部署扩展

      实现prometheus监测MySQL主从,参与MySQL检测的服务器(主从节点)需安装以下扩展

      • mysql_exporter(下载地址:https://github.com/prometheus/mysqld_exporter/releases)

      • node_exporter(下载地址:https://github.com/prometheus/node_exporter/releases)

        选择对应的版本下载,上传到服务器上

        在这里插入图片描述

        mysql_exporter

        解压后,在mysql_exporter目录下,创建一个my.cnf文件,内容如下,为MySQL的账户;

        [client]
        user=admin
        password=123456
        

        在系统/etc/systemd/system路径下,新建一个文件(文件名:mysqld_exporter.service),内容如下

        [Unit]
        Description=mysqld_exporter
        After=network.target
        [Service]
        User=root
        Type=simple
        ExecStart=mysqld_exporter地址 \
        --config.my-cnf my.cnf地址 \
        --collect.info_schema.processlist
        Restart=on-failure
        [Install]
        WantedBy=multi-user.target
        

        可使用下面命令,启动(start)、查看(status)、停止(stop)mysql_exporter扩展

        systemctl start mysql_exporter
        

        启动

        在这里插入图片描述

        node_exporter

        解压后,在系统/etc/systemd/system路径下,新建一个文件(文件名:node_exporter.service),内容如下

        [Unit]
        Description=node_exporter
        Documentation=https://prometheus.io/
        After=network.target
        [Service]
        Type=simple
        User=root
        ExecStart=node_exporter路径
        Restart=on-failure
        [Install]
        WantedBy=multi-user.target
        

        同样的,配置完也是使用下面的命令来启动

        systemctl start node_exporter
        

        可使用systemctl status命令来检查对应扩展是否已启动;

        systemctl status node_exporter
        

        在这里插入图片描述

        修改配置文件

        以上应用、扩展都安装完之后,就需要搞定配置文件。包括MySQL报警指标配置,prometheus关联节点和alertmanager配置,以及alertmanager报警邮箱相关的配置。

        (1)MySQL规则

        这里说“规则”(rule),是因为prometheus使用rule_files配置项关联的,内容是规定MySQL的异常指标,如下:

        (以下配置来自:https://blog.csdn.net/dragonQuncle/article/details/134262056)

        groups:
        - name: MySQL-rules
          rules:
        #mysql状态检测
          - alert: MySQL Status
            expr: mysql_up == 0
            for: 10s
            labels:
              severity: warning
            annotations:
              summary: "{{ $labels.instance }} Mysql服务 !!!"
              description: "{{ $labels.instance }} Mysql服务不可用  请检查!"
        #mysql主从IO线程停止时触发告警
          - alert: MySQL Slave IO Thread Status
            expr: mysql_slave_status_slave_io_running == 0
            for: 5s
            labels:
              severity: warning
            annotations:
              summary: "{{ $labels.instance }} Mysql从节点IO线程"
              description: "Mysql主从IO线程故障,请检测!"
        #mysql主从sql线程停止时触发告警
          - alert: MySQL Slave SQL Thread Status 
            expr: mysql_slave_status_slave_sql_running == 0
            for: 5s 
            labels:
              severity: error
            annotations: 
              summary: "{{$labels.instance}}: MySQL Slave SQL Thread has stop !!!"
              description: "检测MySQL主从SQL线程运行状态"
              
        #mysql主从延时状态告警
          - alert: MySQL Slave Delay Status 
            expr: mysql_slave_status_sql_delay == 30
            for: 5s 
            labels:
              severity: warning
            annotations: 
              summary: "{{$labels.instance}}: MySQL 主从延迟超过 30s !!!"
              description: "检测MySQL主从延时状态"
              
        #mysql连接数告警
          - alert: Mysql_Too_Many_Connections
            expr: rate(mysql_global_status_threads_connected[5m]) > 200
            for: 2m
            labels:
              severity: warning
            annotations:
              summary: "{{$labels.instance}}: 连接数过多"
              description: "{{$labels.instance}}: 连接数过多,请处理 ,(current value is: {{ $value }})!"  
         
         #mysql慢查询有点多告警
          - alert: Mysql_Too_Many_slow_queries
            expr: rate(mysql_global_status_slow_queries[5m]) > 3
            for: 2m
            labels:
              severity: warning
            annotations:
              summary: "{{$labels.instance}}: 慢查询有点多,请检查处理!"
              description: "{{$labels.instance}}: Mysql slow_queries is more than 3 per second ,(current value is: {{ $value }})"
        

        可以在prometheus目录下创建一个文件,文件名为mysql.yml

        在这里插入图片描述

        (2)prometheus配置

        前面分析,prometheus配置需要包含这三部分:引入MySQL规则文件、关联MySQL节点、关联alertmanager,内容如下:

        # 全局配置
        global:
          scrape_interval: 15s
          evaluation_interval: 15s
        # 配置alertmanager
        alerting:
          alertmanagers:
            - static_configs:
                - targets:
                   - localhost:9093
        # 引入规则配置
        rule_files:
          - "mysql.yml"
        scrape_configs:
          # prometheus
          - job_name: "prometheus"
            static_configs:
              - targets: ["localhost:9090"]
          # MySQL主从
          - job_name: 'mysql-mater-slave'
            scrape_interval: 5s
            static_configs:
            - targets: ['IP地址:9104','IP地址:9104']
          # nodes
          - job_name: 'nodes'
            scrape_interval: 5s
            static_configs:
            - targets: ['IP地址:9100','IP地址:9100']
        

        这里我alertmanager和prometheus是部署在同一台机器上,所以用localhost:9093,如果不是需填写对应的IP地址

        (3)alertmanager配置

        alertmanager配置文件里,包含当prometheus报警时的通知配置,我这里只配置邮箱,如下:

        global:
          #qq服务器
          smtp_SmartHost: 'smtp.qq.com:587'
          #发邮件的邮箱
          smtp_from: '1076558989@qq.com'
          #发邮件的邮箱用户名,也就是你的邮箱     
          smtp_auth_username: '1076558989@qq.com'
          #发邮件的邮箱授权码,非QQ登录密码
          smtp_auth_password: 'pgsXXXXXXXXXjdh'
          #进行tls验证
          smtp_require_tls: false
        route:
          group_by: ['alertname']
          # 当收到告警的时候,等待group_wait配置的时间,看是否还有告警,如果有就一起发出去
          group_wait: 10s
          #  如果上次告警信息发送成功,此时又来了一个新的告警数据,则需要等待group_interval配置的时间才可以发送出去
          group_interval: 10s
          # 如果上次告警信息发送成功,且问题没有解决,则等待 repeat_interval配置的时间再次发送告警数据
          repeat_interval: 10s
          # 全局报警组,这个参数是必选的
          receiver: email
        receivers:
        - name: 'email'
          #收邮件的邮箱
          email_configs:
          - to: '1076558989@qq.com'
        

        相关配置,可参考下面这篇文章:

        • 使用Java代码发送QQ、网易电子邮件

          最后

          修改完之后,重启prometheus、alertmanager,如果重启失败了,多半是配置格式的问题。以上配置都是经过我实际使用过的,可直接复制、修改,不要手敲。

          Grafana设置

          重启完之后,查看prometheus,应该可以看到对应的节点和MySQL规则,如下:

          (节点状态,UP说明已关联)

          在这里插入图片描述

          (MySQL规则,绿色说明指标正常)

          在这里插入图片描述

          将prometheus中MySQL数据可视图化,需设置一个数据源,如下:

          在这里插入图片描述

          点击prometheus,设置prometheus服务器地址

          在这里插入图片描述

          保存并测试,如下,设置成功

          在这里插入图片描述

          设置完之后,导入一个数据面板,如下,输入:7371

          在这里插入图片描述

          导入后,可查看到MySQL从节点相关状态。醒目的两个YES,说明了从节点IO进程、SQL进程正在运行中,以此说明从节点同步正常

          在这里插入图片描述

          报警

          现在,在从节点中,登录MySQL,停止同步,分别查看prometheus、grafana情况,并留意邮箱是否有报警通知,如下:

          (从节点,停止同步)

          在这里插入图片描述

          (prometheus报警规则触发)

          在这里插入图片描述

          (邮箱,玩命报警)

          在这里插入图片描述

          (grafana面板数据发生变化)

          在这里插入图片描述

          到这里,针对MySQL主从,一个可监测、可视图化、可报警的系统就搭建完成了。实际上,prometheus+alertmanager+grafana 这一套系统还有很强的扩展性,在监测应用,监测规则,视图化数据的面板,报警的途径(钉钉、企业微信、邮箱等等),报警规则(报警频率、回复后是否发消息通知)上,这里只介绍了冰山一角。

          总结

          本文介绍了使用prometheus监测MySQL主从同步状态方案,参考了以下文章/视频:

          • prometheus 构建MySQL主从监控:https://blog.csdn.net/weixin_48190863/article/details/120356769

          • Prometheus监控Mysql数据库+mysql告警规则:https://blog.csdn.net/dragonQuncle/article/details/134262056

          • 搭建Prometheus监控,钉钉邮件告警:https://www.bilibili.com/video/BV1si421m792/

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon