暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

使用dbops快速搭建Prometheus监控MySQL数据库

原创 飞天 2024-10-29
1175

一、前言

Prometheus是DBA们必须掌握的云原生监控工具之一,今天主要分享使用dbosp1.6快速搭建Prometheus监控MySQL数据库的整个过程。

二、dbops工具介绍

dbops 是一套高效的 ansible playbook 集合,目前是一个可以自动化安装和部署生产级别的 MySQL 及周边生态的工具。dbops 正在持续迭代开发中,未来将支持更多功能。你可以查看 roadmap (待补充)以了解 dbops 已经支持的和未来将要支持的功能。开发历史请查看 releasehistory。目前,支持了 MySQL5.7、8.0、8.4,openGauss5.0、6.0,磐维数据库V2.0-S2.0.3,磐维数据库V2.0-S3.0.0。
目前dbops还支持快速搭建Prometheus监控MySQL数据库功能。

dbops主要解决的问题:

  1. 各类生产环境的规范化建设(如开源数据库部署、高可用架构部署、监控工具部署、备份脚本部署)
  2. 实例生命周期中的备份、监控、事态感知与修复方案下发 roadmap (待开发)
  3. 生命周期结束时的清理与资源回收

使用前注意:

  1. dbops 是个人开发的,因此并未经过大量的测试。如果你打算在生产系统中使用它,请详细阅读源代码,通过公司的安全扫描,并确保在测试环境中进行充分的测试,以避免高危操作。由于 dbops 目前只专注于部署,因此在建设期直接使用基本上不会有问题。
  2. dbops 服务器端(也就是安装 ansible 的位置)和被控端(即实际要部署软件/架构的节点)只支持以下操作系统。
操作系统 说明
RHEL7 系列 理论上支持 RHEL7 及其兼容系统,包括: RedHat7、CentOS7 等等
RHEL8 系列 理论上支持 RHEL8 及其兼容系统,包括: RedHat8、CentOS8、AnolisOS8 等等
RHEL9 系列 理论上支持 RHEL9 及其兼容系统,包括:RockyLinux9 等等
Euler 系列 理论上支持 Euler 及其兼容系统,包括: openEuler 20.03 LTS、openEuler 22.03 LTS 、openEuler 24.03 LTS等等

支持的系统和数据库架构
ansible
image.png
mysql-ansible
image.png
image.png
opengauss-ansible(目前版主还没更新opengauss支持的最新版本文档,其实6.0企业版已支持)
image.png

三、dbops工具下载

dbops工具下载地址:
https://gitee.com/fanderchan/dbops

四、使用dbops工具部署Prometheus监控MySQL数据库

4.1 环境说明

dbops版本:1.6
数据库环境如下:

主机名 ip地址 OS版本 内存、CPU 用途
node2 192.*.*.60 Centos7.9 4G 、 1个双核 mysql8.4.3数据库
node3 192.*.*.30 Centos7.9 4G 、 1个双核 监控节点(部署dbops+安装Prometheus + Grafana + Alertmanager)

4.2 安装 Prometheus + Grafana + Alertmanager 全家桶

Prometheus 负责收集和存储指标,Grafana 用于数据的可视化展示,而 Alertmanager 负责告警的管理。

4.2.1 下载dbops

[root@node3 ~]# wget https://gitee.com/fanderchan/dbops/releases/download/dbops.1.6.20241029/dbops.1.6.20241029-Linux-x86_64.tar.gz
[root@node3 ~]# tar -zxvf dbops.1.6.20241029-Linux-x86_64.tar.gz -C /usr/local/

4.2.2 安装ansible

dbops 自带绿色版 ansible

[root@node3 ~]# cd /usr/local/dbops/
[root@node3 ~]# cd portable-ansible-v0.5.0-py3/
[root@node3 portable-ansible-v0.5.0-py3]# sh setup_portable_ansible.sh
[root@node3 portable-ansible-v0.5.0-py3]# source ~/.bashrc

检查ansible是否安装成功

[root@node3 portable-ansible-v0.5.0-py3]#  ansible --version
ansible 2.10.5
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/dbops/portable-ansible-v0.5.0-py3/ansible/ansible
  executable location = /usr/local/dbops/portable-ansible-v0.5.0-py3/ansible
  python version = 3.6.8 (default, Nov 14 2023, 16:29:52) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
[root@node3 portable-ansible-v0.5.0-py3]# 

4.2.3 配置ansible主机

cd ..
cd monitoring_prometheus_ansible
vi inventory/hosts.ini
## Configuration for monitoring_prometheus_deployment.yml only ##
[prometheus]
192.*.*.30 ansible_user=root ansible_ssh_pass="'密码'"  #改为你的ip和密码,只支持root不能改root

[grafana]
192.*.*.30 ansible_user=root ansible_ssh_pass="'密码'"  #改为你的ip和密码,只支持root不能改root

[alertmanager]
192.*.*.30 ansible_user=root ansible_ssh_pass="'密码'"  #改为你的ip和密码,只支持root不能改root


[all:vars]
#ansible_python_interpreter=/usr/bin/python3

4.2.4 上传软件安装包(Prometheus + Grafana + Alertmanager)

保证/usr/local/dbops/monitoring_prometheus_ansible/downloads 目录下有以下文件:

alertmanager-0.27.0.linux-amd64.tar.gz
grafana-enterprise-10.4.6.linux-amd64.tar.gz
prometheus-2.54.0.linux-amd64.tar.gz

软件包下载地址:

# 下载 Alertmanager 0.27.0
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz

# 下载 Grafana Enterprise 10.4.6
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.4.6.linux-amd64.tar.gz

# 下载 Prometheus 2.54.0
wget https://github.com/prometheus/prometheus/releases/download/v2.54.0/prometheus-2.54.0.linux-amd64.tar.gz

4.2.5 修改 Prometheus + Grafana + Alertmanager 配置

cd playbooks
vi common_config.yml #修改通用设置

由于本篇是快速入门,所以只需要修改以下几个参数

下面以qq邮箱为例:
alert_email_to: '510386283@qq.com'  # The email address to receive alert notifications.
alert_email_from: '510386283@qq.com'  # The sender email address for alert notifications.
alert_smtp_smarthost: 'smtp.qq.com:587'  # The SMTP server address (e.g., smtp.qq.com:587).
alert_smtp_auth_username: '510386283@qq.com'  # The SMTP server authentication username.
alert_smtp_auth_password: 'xxxxxxxxxx'  # The SMTP server authentication password.
示例是dbops工具作者的QQ邮箱,把邮箱改为你的告警邮箱,smtp_smarthost 改为你的邮箱smtp服务器地址,smtp_auth_username 改为你的邮箱地址,smtp_auth_password 改为你的邮箱的授权密码。

授权密码获取方式:QQ邮箱的话点击 这里获取帮助。

修改剧本设置:

vi vars/var_monitoring_prometheus_deployment.yml

本篇傻瓜式教程不涉及修改此配置,也不建议修改。
vars/var_monitoring_prometheus_deployment.yml内容如下:

prometheus_url: "https://github.com/prometheus/prometheus/releases/download/v{{ prometheus_package | regex_replace('prometheus-(.*)\\.linux-amd64\\.tar\\.gz', '\\1') }}/{{ prometheus_package }}"
grafana_url: "https://dl.grafana.com/enterprise/release/{{ grafana_package }}"
alertmanager_url: "https://github.com/prometheus/alertmanager/releases/download/v{{ alertmanager_package | regex_replace('alertmanager-(.*)\\.linux-amd64\\.tar\\.gz', '\\1') }}/{{ alertmanager_package }}"

4.2.6 安装 Prometheus + Grafana + Alertmanager 全家桶

ansible-playbook monitoring_prometheus_deployment.yml

在执行 playbook 后,会输出以下信息,请确认无误后输入 confirm 继续。

[root@node3 playbooks]# ansible-playbook monitoring_prometheus_deployment.yml

PLAY [Deploy Prometheus+Grafana+Alertmanager using binary installation] *********************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [192.*.*.30]

TASK [Validate grafana_port is within range] ************************************************************************************************************************************************************************************************
skipping: [192.*.*.30]

TASK [Set the OS type variable] *************************************************************************************************************************************************************************************************************
ok: [192.*.*.30]

TASK [Print the OS type] ********************************************************************************************************************************************************************************************************************
ok: [192.*.*.30] => {
    "msg": "The OS type of host 192.*.*.30 is CentOS7"
}

TASK [Assert if OS type is supported] *******************************************************************************************************************************************************************************************************
ok: [192.*.*.30] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [Check for Python 3] *******************************************************************************************************************************************************************************************************************
ok: [192.*.*.30]

TASK [Check for Python 2] *******************************************************************************************************************************************************************************************************************
ok: [192.*.*.30]

TASK [Set Python interpreter] ***************************************************************************************************************************************************************************************************************
ok: [192.*.*.30]

TASK [Print the Python interpreter] *********************************************************************************************************************************************************************************************************
ok: [192.*.*.30] => {
    "msg": "The Python interpreter of host 192.*.*.30 is /usr/bin/python2"
}

TASK [Set the number of hosts in each group] ************************************************************************************************************************************************************************************************
ok: [192.*.*.30]

TASK [Verify that 'alertmanager' group has exactly one host] ********************************************************************************************************************************************************************************
ok: [192.*.*.30] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [Verify that 'prometheus' group has exactly one host] **********************************************************************************************************************************************************************************
ok: [192.*.*.30] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [Verify that 'grafana' group has exactly one host] *************************************************************************************************************************************************************************************
ok: [192.*.*.30] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [Check if {{ item }} exists in ../downloads/] ******************************************************************************************************************************************************************************************
ok: [192.*.*.30] => (item=prometheus-2.54.0.linux-amd64.tar.gz)
ok: [192.*.*.30] => (item=grafana-enterprise-10.4.6.linux-amd64.tar.gz)
ok: [192.*.*.30] => (item=alertmanager-0.27.0.linux-amd64.tar.gz)

TASK [Display the list of target hosts and additional information] **************************************************************************************************************************************************************************
ok: [192.*.*.30] => {
    "msg": [
        "Hosts to be affected by Deploy Prometheus+Grafana+Alertmanager using binary installation: 192.*.*.30",
        "prometheus ip: 192.*.*.30",
        "prometheus port: 9090",
        "prometheus package: prometheus-2.54.0.linux-amd64.tar.gz",
        "grafana ip: 192.*.*.30",
        "grafana port: 3000",
        "grafana package: grafana-enterprise-10.4.6.linux-amd64.tar.gz",
        "alertmanager ip: 192.*.*.30",
        "alertmanager port: 9093",
        "alertmanager package: alertmanager-0.27.0.linux-amd64.tar.gz"
    ]
}

TASK [Prompt user for confirmation] *********************************************************************************************************************************************************************************************************
[Prompt user for confirmation]
This will perform Deploy Prometheus+Grafana+Alertmanager using binary installation on the displayed hosts. Please type 'confirm' to continue or press Ctrl+C to cancel.:
confirm  <---此处输入confirm继续

输入 confirm 后,会开始安装。部分安装日志如下:

TASK [../roles/alertmanager : Download alertmanager binary tarball if not found locally and auto download is enabled (local)] ***************************************************************************************************************
skipping: [192.*.*.30]

TASK [../roles/alertmanager : Transfer alertmanager install package to remote host] *********************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Ensure /usr/local/alertmanager directory exists] **************************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Extract alertmanager tarball] *********************************************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Touch unarchive_alertmanager_package_finished file] ***********************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Configure alertmanager Server] ********************************************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Copy alertmanager.tmpl to alertmanager server directory] ******************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Create alertmanager systemd config file] **********************************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Configure alertmanager service to start at boot] **************************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Start alertmanager service] ***********************************************************************************************************************************************************************************
changed: [192.*.*.30]

TASK [../roles/alertmanager : Check if Alertmanager is operational] *************************************************************************************************************************************************************************
ok: [192.*.*.30]

TASK [../roles/alertmanager : Fail if Alertmanager is not operational] **********************************************************************************************************************************************************************
skipping: [192.*.*.30]

TASK [../roles/alertmanager : Touch alertmanager_finish.flag] *******************************************************************************************************************************************************************************
changed: [192.*.*.30]

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
192.*.*.30             : ok=71   changed=40   unreachable=0    failed=0    skipped=16   rescued=0    ignored=0   

Playbook run took 0 days, 0 hours, 3 minutes, 39 seconds

从安装日志可以看到,整个安装过程花费了3分钟39秒,速度非常快!

4.2.7 打开 Web 页面确认安装完成

Prometheus

http://192.*.*.30:9090/alerts?search=

image.png
Grafana

http://192.*.*.30:3000/loginlanguage

image.png
Alertmanager

http://192.*.*.30:9093/#/alerts

image.png

4.3 安装mysql

可以使用dbops快速部署mysql,步骤见后续文章!

4.4 安装 Node Exporter 和 MySQL Exporter

目前,MySQL Exporter 和 Node Exporter 的部署没有分开,使用同一个 playbook 安装。
注意:在数据库所在的主机上部署Node Exporter 和 MySQL Exporter。

cd /usr/local/dbops/mysql_ansible/
cd playbooks
vi vars/var_exporter_install.yml

这里的大多数内容不建议修改,如果存在 MySQL 多实例混合部署的情况下,第二实例的 MySQL Exporter 的端口需要修改。

mysqld_exporter_port: 9104  # 第二实例改为 9105
其余建议使用默认值。

查看vars/var_exporter_install.yml文件内容:

cat vars/var_exporter_install.yml 
# Node Exporter
node_exporter_install: true
node_exporter_port: 9100
node_exporter_package: node_exporter-1.8.2.linux-amd64.tar.gz
node_exporter_run_user: root
node_exporter_run_user_group: root
node_exporter_install_dir: "/usr/local/bin"
node_exporter_service_file: "/etc/systemd/system/node_exporter.service"
node_exporter_url: "https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_package | regex_replace('node_exporter-(.*)\\.linux-amd64\\.tar\\.gz', '\\1') }}/{{ node_exporter_package }}"
node_exporter_install_type: dbops    # dbops, pmm, package

# MySQLd Exporter
mysqld_exporter_install: true
mysqld_exporter_port: 9104
mysqld_exporter_package: mysqld_exporter-0.15.1.linux-amd64.tar.gz
mysqld_exporter_run_user: mysql
mysqld_exporter_run_user_group: mysql
mysqld_exporter_install_dir: "{{ mysql_data_dir_base }}/exporter/{{ mysql_port }}"
mysqld_exporter_service_file: "/etc/systemd/system/mysqld{{ mysql_port }}_exporter.service"
mysqld_exporter_url: "https://github.com/prometheus/mysqld_exporter/releases/download/v{{ mysqld_exporter_package | regex_replace('mysqld_exporter-(.*)\\.linux-amd64\\.tar\\.gz', '\\1') }}/{{ mysqld_exporter_package }}"
mysqld_exporter_install_type: dbops    # dbops, pmm, package
~

4.4.1 安装Node Exporter 和 MySQL Exporter

注意:在数据库所在的主机上操作。

ansible-playbook exporter_install.yml
RUNNING HANDLER [../roles/node_exporter : Restart node_exporter] ****************************************************************************************************************************************************************************
changed: [192.*.*.62]
changed: [192.*.*.60]

RUNNING HANDLER [../roles/mysqld_exporter : Reload systemd] *********************************************************************************************************************************************************************************
ok: [192.*.*.62]
ok: [192.*.*.60]

RUNNING HANDLER [../roles/mysqld_exporter : Restart mysqld_exporter] ************************************************************************************************************************************************************************
changed: [192.*.*.62]
changed: [192.*.*.60]

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
192.*.*.60             : ok=43   changed=14   unreachable=0    failed=0    skipped=17   rescued=0    ignored=0   
192.*.*.62             : ok=35   changed=13   unreachable=0    failed=0    skipped=13   rescued=0    ignored=0   

Playbook run took 0 days, 0 hours, 0 minutes, 54 seconds

至此,Node Exporter 和 MySQL Exporter 的安装就完成了。

4.5 注册 Node Exporter 和 MySQL Exporter

在 /usr/local/dbops/mysql_ansible/playbooks 目录下有一个 go 语言编写的 exporterregistrar 工具,用于注册 Node Exporter 和 MySQL Exporter 到 Prometheus。
执行以下命令可以查看 exporterregistrar 工具的帮助信息和参考命令

cd /usr/local/dbops/mysql_ansible/playbooks
./exporterregistrar register --help

用法如下:

[root@node1 playbooks]# ./exporterregistrar register --help
Register an exporter such as node_exporter or mysqld_exporter to Prometheus' targets configuration.

Examples:
  mysql server: 192.168.199.131
  prometheus server: 192.168.199.133
  prometheus server ssh user: root
  prometheus server ssh password: 123456

  # Register a MySQL exporter
  ./exporterregistrar register -t mysql -H 192.168.199.131 -s 192.168.199.133 -p 123456

  # Register a MySQL exporter with 3307 mysql port and 9105 metrics port
  ./exporterregistrar register -t mysql -H 192.168.199.131 --db-port 3307 -s 192.168.199.133 -P 9105 -p 123456  

  # Register a Node exporter
  ./exporterregistrar register -t node -H 192.168.199.131 -s 192.168.199.133 -p 123456

  # Register a MySQL exporter with custom labels
  ./exporterregistrar register -t mysql -H 192.168.199.131 -s 192.168.199.133 -p 123456 -f --region cn-sz
 
  # force update a MySQL exporter with custom labels
  ./exporterregistrar register -t mysql -H 192.168.199.131 -s 192.168.199.133 -p 123456 -f --region cn-bj --node-name node1

Usage:
  exporterregistrar register [flags]

Flags:
      --cluster string           Cluster label (default: mysql{$dbPort})
      --config-path string       Custom path for Prometheus configuration file.
                                 Default paths based on exporter type:
                                   - node_exporter: /usr/local/prometheus/node_exporter_targets.yml
                                   - mysqld_exporter: /usr/local/prometheus/mysqld_exporter_targets.yml
      --db-port string           Database port for labeling (default "3306")
  -f, --force                    Force update if target already exists (default false)
  -h, --help                     help for register
  -H, --host string              Hostname or IP address of the target exporter [required]
      --node-name string         Node name for labeling (default: same as host)
  -p, --password string          SSH password for Prometheus server [required]
  -P, --port string              Port of the target exporter (default: 9100 for node, 9104 for mysql/mysqld)
      --region string            Region label (default "cn")
      --replication-set string   Replication set label (default: mysql{$dbPort})
  -s, --server string            IP address of the Prometheus server [required]
      --ssh-port string          SSH port for Prometheus server (default "22")
  -t, --type string              Exporter type (node or mysql/mysqld) [required]
  -u, --user string              SSH username for Prometheus server (default "root")

Global Flags:
  -v, --verbose   enable verbose output

注册 3307 端口的 MySQL 实例到 Prometheus

192.*.*.60 主库
192.*.*.62 从库  #如果没有从库,不用填
192.*.*.30 Prometheus 服务器

4.5.1 注册192...60 和 62 主机的 Node Exporter

./exporterregistrar register -t node -H 192.*.*.60 -s 192.*.*.30 -p ${prometheus_server_root_password}
./exporterregistrar register -t node -H 192.*.*.62 -s 192.*.*.30 -p ${prometheus_server_root_password}

执行结果如下:

[root@node1 playbooks]# ./exporterregistrar register -t node -H 192.*.*.60 -s 192.*.*.30 -p ${prometheus_server_root_password}
Failed to parse YAML or no target groups found, initializing new target group
Adding new target: 192.*.*.60:9100
Exporter registered successfully.
[root@node1 playbooks]# ./exporterregistrar register -t node -H 192.*.*.62 -s 192.*.*.30 -p ${prometheus_server_root_password}
Adding new target: 192.*.*.62:9100
Exporter registered successfully.
[root@node1 playbooks]# 

4.5.2 注册192...60 和 62 数据库的 MySQL Exporter

注册192.*.*.60 和 62 的 MySQL Exporter

./exporterregistrar register -t mysql -H 192.*.*.60 -s 192.*.*.30 -p ${prometheus_server_password} --db-port 3307
./exporterregistrar register -t mysql -H 192.*.*.60 -s 192.*.*.30 -p ${prometheus_server_password} --db-port 3307

执行效果如下:

[root@node1 playbooks]# ./exporterregistrar register -t mysql -H 192.*.*.60 -s 192.*.*.30 -p root --db-port 3307
Failed to parse YAML or no target groups found, initializing new target group
Adding new target: 192.*.*.60:9104
Exporter registered successfully.
[root@node1 playbooks]# ./exporterregistrar register -t mysql -H 192.*.*.62 -s 192.*.*.30 -p root --db-port 3307
Adding new target: 192.*.*.62:9104
Exporter registered successfully.
[root@node1 playbooks]# 

我们再打开 grafana 的 web 页面,可以看到已经注册的Node Exporter 和 MySQL Exporter 了。
Node Exporter :
image.png
MySQL Exporter :
image.png

五、测试告警

停掉从库的io thread和sql thread

mysql> stop replica;
Query OK, 0 rows affected (0.03 sec)

mysql> 

image.png

六、总结

使用Prometheus监控MySQL数据库,可以通过持续监控数据库的健康状况,可以提前发现潜在的问题,从而采取措施预防故障发生,减少系统停机时间,帮助我们识别数据库的性能瓶颈,如慢查询、资源竞争和索引效率问题等。
有需求的童鞋们赶快试一试吧!

最后修改时间:2024-10-30 10:10:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论