美文网首页@IT·互联网技术研发汇集
Prometheus结合Consul采集多个MySQL实例的监控

Prometheus结合Consul采集多个MySQL实例的监控

作者: 星辰大海的精灵 | 来源:发表于2024-02-11 19:57 被阅读0次

    1、下载安装 mysqld_exporter

    # 参考 下载地址Release列表,选择适合的平台安装包

    # 进入运维规范 软件安装目录

    cd /opt/app

    # 下载并解压

    wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz

    tar -zxvf mysqld_exporter-0.15.1.linux-amd64.tar.gz

    # 设置软连接

    ln -s /opt/app/mysqld_exporter-0.15.1.linux-amd64 mysqld_exporter

    2、进行配置

    配置之前创建Prometheus exporter 账号并赋权

    CREATE USER 'prometheus'@'192.168.%' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 10;

    GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'prometheus'@'192.168.%';

    配置连接MySQL的配置文件

    # vim ./.my.cnf

    [client]

    user = prometheus

    password = XXXXXXXX

    其他的配置说明详见 https://github.com/prometheus/mysqld_exporter

    为了方便管理,在每个MySQL实例初始化的时候,创建相同的账号 'prometheus'@'192.168.%' 和对应的密码, 这样在 mysql exporter中只用配置一个[client] 即可。

    3、启动MySQL exporter并测试

    注意可以通过 ./mysqld_exporter --help 查看以 --collect.xx 开头的参数,这个是该exporter支持的metrics

    另外需要特殊说明几个参数

    • --config.my-cnf=".my.cnf" 配置exporter连接数据库时使用的认证信息(这里只要是配置用户和密码),默认是读取当前目录下的.my.cnf,可以修改指定

    • --web.listen-address=:9104 exporter默认监听的端口,可以修改

    启动 exporter 服务

    nohup ./mysqld_exporter --config.my-cnf=./.my.cnf --collect.global_status --collect.global_variables --collect.mysql.user --collect.binlog_size --collect.slave_status &

    1.

    当然还可以配置systemd 方式来管理该exporter服务

    # vim /usr/lib/systemd/system/mysqld_exporter.service

    [Unit]

    Description=Prometheus MySQL exporter

    [Service]

    ExecStart=/opt/app/mysqld_exporter/mysqld_exporter --config.my-cnf=/opt/app/mysqld_exporter/.my.cnf --collect.global_status --collect.global_variables --collect.mysql.user --collect.binlog_size --collect.slave_status

    Restart=on-failure

    [Install]

    WantedBy=multi-user.target

    然后执行配置开机自启动

    # 开启自启动

    systemctl enable mysqld_exporter

    # 启动

    systemctl start mysqld_exporter

    # 查看状态

    systemctl status mysqld_exporter

    4、测试验证

    根据官网提示可以使用 /probe?target=foo:3306 的方式来验证

    To use the multi-target functionality, send an http request to the endpoint /probe?target=foo:3306 where target is set to the DSN of the MySQL instance to scrape metrics from.

    本次环境测试地址 http://192.168.3.100:9104/probe?target=xxxx:3306 然后在浏览器中打开如下,看到exporter部署成功

    prometheus-mysql-expoter-probe-test

    5、注册MySQL实例信息到Consul

    备注: 关于Consul大家知道是目前比较常用的注册中心系统,常见的用法有

    a)比如Java服务启动的时候注册到Consul,其他比如网关服务就可以自动发现服务进行请求转发

    b)Nginx做服务动态转发时,可以借助于Consul中的KV功能实现在发布服务时,动态下线对应的服务节点,等服务节点重启成功之后再动态上线。可以实现后端服务的无损上线

    具体Consul的服务安装和API用法详见官网文档即可,后者关于我博客中的相关文章说明

    这里直接给出具体的注册代码

    #!/usr/bin/env bash

    # encoding: utf-8

    # 批量初始化注册到Consul

    while read line

    do

    # echo $line

    instance_id=$(echo $line|awk '{print $1}')

    instance_name=$(echo $line|awk '{print $2}')

    instance_address=$(echo $line|awk '{print $3}')

    suffix=$(echo $instance_name|awk -F"_" '{print $NF}')

    if [[ $suffix == 'slave' ]]

    then

    role="slave"

    else

    role="master"

    fi

    data="{

    \"id\": \"rds-${instance_name}\",

    \"name\": \"mysql\",

    \"address\" : \"${instance_address}\",

    \"port\": 3306,

    \"tags\": [\"prod\", \"mysql_exporter\"],

    \"meta\": {

    \"env\": \"prod\",

    \"role\": \"${role}\",

    \"instance_id\": \"${instance_id}\",

    \"instance_name\": \"${instance_name}\"

    }

    }"

    # echo $data

    curl -X PUT 'http://192.168.x.x:8500/v1/agent/service/register' -H 'Content-Type: application/json' -d "$data"

    done < /opt/scripts/db-register-into-consul/db-list.txt

    其中 db-list.txt 文件的内容格式如下

    instance-id-xxx instance-name instance-address

    或者可以手动单个实例的注册

    curl -X PUT 'http://192.168.x.x:8500/v1/agent/service/register' -H 'Content-Type: application/json' \

    -d '{

    "id": "rds-xxx",

    "name": "mysql",

    "address": "rm-xxxxxxxx.mysql.rds.aliyuncs.com",

    "port": 3306,

    "tags": [

    "prod",

    "mysql_exporter"

    ],

    "meta": {

    "env": "prod",

    "instance_id": "rm-xxxxxxxx.mysql.rds.aliyuncs.com:3306",

    "role": "master",

    "instance_name": "rds-xxx"

    }

    }'

    然后打开 Consul的 Web 控制台,在 Services 中搜索 mysql(这里定义的服务名称) 就可以看到有对应的实例注册到该服务下

    6、配置Prometheus 自动发现多个MySQL实例

    为了规范配置Prometheus的配置,建议按照如下把不同的Job配置到 scrape_configs 目录下单个文件存放管理

    # cat scrape_configs/mysql_exporter.yml

    scrape_configs:

    - job_name: 'consul_discovery_mysql'

    consul_sd_configs:

    # Consul的服务地址(这里配置的内网域名)

    - server: 'consul.xxx.local'

    # 这里是获取Consul中的服务,如上知道我们是把所有的MySQL实例注册到了`mysql`服务下

    services: ['mysql']

    relabel_configs:

    # 核心是获取 `__parm_target` 就是 上面第四步提到的probe抓取的target

    - source_labels: [__address__]

    target_label: __param_target

    - source_labels: [__meta_consul_service_id]

    target_label: instarnce_name

    - source_labels: [__param_target]

    target_label: instance

    - target_label: __address__

    # 注意这里: 该地址就是MySQL exporter服务的地址

    replacement: 192.168.3.100:9104

    划重点

    虽然在 mysql_exporter 的 config.file 对应的配置文件中可以配置多个 client 然后给配置不同的账号密码,且 prometheus也支持auth_module参数。

    但是如果Prometheus配置auth_module参数时且每个job的账号密码不一样。那么就变成了手动配置多个Job的场景,那么基于Consul自动发现的多实例配置就失去了其意义。

    所这里这里没有配置,且针对Prometheus监控猜忌,建议配置统一的账号密码就行

    划重点

    如果在进行relabel 配置的时候,不知道都有哪些原始的labels,可以后两种方案

    1、就是Prometheus中先不进行relabel_configs的配置,然后配置生效之后打开 Prometheus Web控制台在 Status中找到 Targets ,然后鼠标放到对应job下endpoint 行 的Labels 列,就会有弹窗显示 Before relabeling 都有哪些

    2、查看Prometheus官网介绍 Prometheus consul_sd_config relabel参数[2]

    但是个人建议第一种方式,因为笔者刚开始参考第二种方式在meta中存放了定制的参数,但是获取不到。最终分析定位发现是因为笔者的Consul版本太低,很多consul_sd_config参数不支持导致。

    但是第一种方式,显示出来的参数就是当前版本支持的可用的参数。

    当然具体使用自己更具自己的实际情况来判断就行。

    7、验证Prometheus多实例采集

    这里给实际的结果截图

    prometheus-consul-mysql-targets

    看到笔者这里已经采集到了36个实例数据,点击Endpoint就看到需要的结果,和上面第四步测试验证一致。

    8、配置Grafana

    配置Grafana 就相对很简单了。这里就不展开详细说明了。

    大概的步骤就是

    1)在grafana中添加该Prometheus数据源

    2)然后新创建dashboard 在官网搜到需要的模板之后,按照模板id导致即可

    相关文章

      网友评论

        本文标题:Prometheus结合Consul采集多个MySQL实例的监控

        本文链接:https://www.haomeiwen.com/subject/ojdqadtx.html