一、前言
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主要解决的问题:
- 各类生产环境的规范化建设(如开源数据库部署、高可用架构部署、监控工具部署、备份脚本部署)
- 实例生命周期中的备份、监控、事态感知与修复方案下发 roadmap (待开发)
- 生命周期结束时的清理与资源回收
使用前注意:
- dbops 是个人开发的,因此并未经过大量的测试。如果你打算在生产系统中使用它,请详细阅读源代码,通过公司的安全扫描,并确保在测试环境中进行充分的测试,以避免高危操作。由于 dbops 目前只专注于部署,因此在建设期直接使用基本上不会有问题。
- 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

mysql-ansible


opengauss-ansible(目前版主还没更新opengauss支持的最新版本文档,其实6.0企业版已支持)

三、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=

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

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

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 :

MySQL Exporter :

五、测试告警
停掉从库的io thread和sql thread
mysql> stop replica;
Query OK, 0 rows affected (0.03 sec)
mysql>

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




