Prometheus + Grafana 完整部署流程(监控 Linux 主机 + MySQL)

背景介绍:为什么需要专业的监控系统?

在现代运维工作中,业务系统的复杂度和并发量不断提升,单纯依靠人工巡检或日志排查已无法满足稳定性需求。一套高效的监控系统需要具备数据采集、存储、分析、可视化、报警五大核心能力,而 Prometheus + Grafana 组合正是目前最流行的开源监控解决方案之一:

  • Prometheus 作为监控核心,擅长时序数据的采集与存储,支持自定义指标和灵活的查询语法(PromQL);
  • Grafana 专注于数据可视化,提供丰富的仪表盘模板和图表类型,能将 Prometheus 的数据转化为直观的监控视图;
  • 两者结合可实现从主机硬件、数据库服务到应用性能的全维度监控,是中小团队构建监控体系的首选方案。

本文将从环境准备到报警配置,手把手带你搭建一套覆盖 Linux 主机和 MySQL 服务的完整监控系统,全程标注操作主机,新手也能轻松上手。

核心关键词解释

  • Prometheus:开源监控系统,以时序数据库为核心,支持指标采集、存储和查询,通过 Exporter 实现多类型数据接入;
  • Exporter:数据采集代理,用于将不同类型的监控对象(如 Linux 主机、MySQL、Redis)的指标转换为 Prometheus 可识别的格式,常见的有 node_exporter(主机监控)、mysqld_exporter(MySQL 监控);
  • Grafana:开源可视化工具,支持对接 Prometheus、Elasticsearch 等数据源,通过仪表盘展示监控数据,支持报警配置;
  • 时序数据:按时间顺序记录的数据,如 CPU 使用率随时间的变化、MySQL 连接数的实时统计;
  • PromQL:Prometheus 的查询语言,用于从时序数据库中筛选、聚合监控指标;
  • Dashboard(仪表盘):Grafana 中的可视化页面,包含多个图表,用于集中展示某一业务或组件的监控指标;
  • OneAlert:第三方报警平台,支持多渠道通知(邮件、微信、短信),可与 Grafana 集成实现报警转发。

🧩 一、环境准备(三台虚拟机)

首先明确三台机器的角色与配置,确保基础环境一致,避免后续部署出现兼容性问题。

角色主机名IP 地址用途
Prometheus 服务器prometheus10.1.1.13运行 Prometheus 服务,收集监控指标
被监控主机(含 MySQL)mysql10.1.1.14运行 node_exporter、mysqld_exporter 及 MariaDB
Grafana 服务器grafana10.1.1.15运行 Grafana,实现监控数据可视化

✅ 基础环境初始化(所有三台主机均需执行)

所有机器需满足静态 IP 配置、能上网,并完成以下操作:

1. 设置简化主机名

bash

# prometheus主机执行
hostnamectl set-hostname prometheus

# mysql主机执行
hostnamectl set-hostname mysql

# grafana主机执行
hostnamectl set-hostname grafana
2. 关闭防火墙与 SELinux

bash

# 停止并禁用防火墙(避免端口访问被拦截)
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 临时关闭SELinux(立即生效)
sudo setenforce 0
# 永久关闭SELinux(重启后生效)
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
3. 配置主机名解析(/etc/hosts)

确保三台机器可通过简化主机名互相访问,避免 IP 地址硬编码:

bash

echo "10.1.1.13 prometheus" >> /etc/hosts
echo "10.1.1.14 mysql" >> /etc/hosts
echo "10.1.1.15 grafana" >> /etc/hosts
4. 时间同步(可选但推荐)

监控数据对时间精度要求高,建议通过 chrony 或 ntpdate 同步时间:

bash

# 安装chrony(时间同步工具)
sudo yum install -y chrony
# 启动并设置开机自启
sudo systemctl start chronyd
sudo systemctl enable chronyd
# 验证时间同步状态(查看同步源)
chronyc sources

📦 二、安装 Prometheus(操作主机:prometheus)

Prometheus 是监控系统的核心,负责收集、存储监控指标,此处采用文档推荐的二进制包安装方式(无需编译,直接解压使用)。

1. 下载并解压 Prometheus 安装包

bash

# 切换到/root目录(便于管理安装包)
cd /root

# 下载v2.5.0版本(指定版本,生产环境建议升级至最新稳定版)
wget https://github.com/prometheus/prometheus/releases/download/v2.5.0/prometheus-2.5.0.linux-amd64.tar.gz

# 解压到/usr/local目录(常用软件安装目录)
tar xf prometheus-*.tar.gz -C /usr/local/

# 重命名目录(简化后续操作路径,避免版本号干扰)
mv /usr/local/prometheus-2.5.0.linux-amd64 /usr/local/prometheus

2. 启动 Prometheus(后台运行)

bash

# 用nohup后台启动,指定配置文件和监听端口(默认9090)
nohup /usr/local/prometheus/prometheus \
  --config.file="/usr/local/prometheus/prometheus.yml" \
  --web.listen-address="0.0.0.0:9090" \
  > /var/log/prometheus.log 2>&1 &

说明prometheus.yml 是默认配置文件,已包含对本机(localhost:9090)的监控,后续需添加其他监控目标。

3. 验证 Prometheus 服务

bash

# 检查9090端口是否被占用(确认服务启动)
lsof -i :9090

# 访问本地metrics接口,验证指标是否正常输出(返回大量时序数据)
curl http://localhost:9090/metrics
Web UI 验证

打开浏览器访问:http://prometheus:9090(或 http://10.1.1.13:9090),进入 Prometheus 控制台:

  • 点击顶部菜单栏 Status → Targets,应看到 prometheus 任务状态为 UP(表示本机监控正常)。

🖥️ 三、监控远程 Linux 主机(操作主机:mysql + prometheus)

通过 node_exporter 采集 Linux 主机的 CPU、内存、磁盘等硬件指标,需在被监控主机(mysql)安装 exporter,并在 Prometheus 服务器配置监控目标。

1. 安装 node_exporter(操作主机:mysql)

bash

# 切换到/root目录
cd /root

# 下载v0.16.0版本的node_exporter(适配Linux主机监控)
wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz

# 解压到/usr/local目录
tar xf node_exporter-*.tar.gz -C /usr/local/

# 重命名目录(简化路径)
mv /usr/local/node_exporter-0.16.0.linux-amd64 /usr/local/node_exporter

2. 启动 node_exporter(操作主机:mysql)

bash

# 后台启动node_exporter(默认监听9100端口,无需额外配置)
nohup /usr/local/node_exporter/node_exporter > /var/log/node_exporter.log 2>&1 &

3. 验证 node_exporter(操作主机:mysql)

bash

# 检查9100端口是否启动
lsof -i :9100

# 访问metrics接口,确认硬件指标输出(如cpu_usage、mem_usage等)
curl http://localhost:9100/metrics

4. 在 Prometheus 配置监控目标(操作主机:prometheus)

需编辑 Prometheus 配置文件,添加 mysql 主机的监控任务:

bash

# 编辑prometheus.yml配置文件(若文件不在/etc/prometheus,用find查找)
vi /etc/prometheus/prometheus.yml 
# 若文件不存在执行以下命令查找文件即可
find / -name prometheus.yml

# 在文件末尾追加以下内容(新增mysql主机监控任务)
  - job_name: 'mysql_host'  # 任务名称,自定义(便于识别Linux主机监控)
    static_configs:
      - targets: ['mysql:9100']  # 被监控主机的主机名:端口(node_exporter端口9100)

追加完成后效果参考

yaml

global:
  scrape_interval: 15s  # 全局采集间隔(每15秒采集一次指标)

scrape_configs:
  - job_name: 'prometheus'  # 第一个任务:监控Prometheus本机
    static_configs:
      - targets: ['localhost:9090']
  # 下面追加 mysql_host 任务(注意前面有 2 个空格,和上面的 job 同级)
  - job_name: 'mysql_host'
    static_configs:
      - targets: ['mysql:9100']  # 这里的mysql建议改为 IP,如 10.1.1.14:9100(避免主机名解析问题)

5. 重启 Prometheus 使配置生效(操作主机:prometheus)

bash

# 先杀死原有Prometheus进程
pkill prometheus

# 重新启动Prometheus(同步骤二的启动命令)
nohup /usr/local/prometheus/prometheus --config.file="/usr/local/prometheus/prometheus.yml" > /var/log/prometheus.log 2>&1 &

6. 验证监控状态(操作主机:prometheus)

打开浏览器访问 http://prometheus:9090,进入 Status → Targets,应看到 mysql_host 任务状态为 UP(表示 Linux 主机监控正常)。

💡 若想监控 Prometheus 本机资源,可在 prometheus 主机上重复步骤 1-3 安装 node_exporter,再在配置文件中添加 targets: ['localhost:9100'] 即可。

🗄️ 四、监控远程 MySQL(操作主机:mysql + prometheus)

通过 mysqld_exporter 采集 MySQL(MariaDB)的连接数、查询量、表空间等指标,需在 mysql 主机安装 exporter 并配置数据库授权,再在 Prometheus 添加监控目标。

1. 安装 MariaDB(操作主机:mysql)

bash

# 安装MariaDB服务(CentOS 7默认源包含,兼容MySQL)
yum install -y mariadb-server mariadb

# 启动并设置开机自启
systemctl start mariadb
systemctl enable mariadb

# 可选:初始化数据库(设置root密码、删除匿名用户等,按提示操作)
mysql_secure_installation

2. 创建 MySQL 监控用户(操作主机:mysql)

需创建专用监控用户并授权,供 mysqld_exporter 连接数据库(避免使用 root 用户):

bash

# 登录MySQL(若设置了root密码,需加 -p 并输入密码)
mysql -u root -p

# 执行授权语句(授权给localhost,因为exporter本地连接数据库)
GRANT SELECT, REPLICATION CLIENT, PROCESS ON *.* TO 'mysql_monitor'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;  # 刷新权限(使授权立即生效)
EXIT;  # 退出MySQL

3. 安装 mysqld_exporter(操作主机:mysql)

bash

# 切换到/root目录
cd /root

# 下载v0.11.0版本的mysqld_exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz
# 若SSL连接失败,可使用如下命令(跳过SSL证书检查)
# wget --no-check-certificate https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz

# 解压到/usr/local目录
tar xf mysqld_exporter-*.tar.gz -C /usr/local/

# 重命名目录
mv /usr/local/mysqld_exporter-0.11.0.linux-amd64 /usr/local/mysqld_exporter

4. 创建 MySQL 配置文件(操作主机:mysql)

创建配置文件存储监控用户的账号密码,供 exporter 读取(避免命令行暴露密码):

bash

cat > /usr/local/mysqld_exporter/.my.cnf <<EOF
[client]
user=mysql_monitor
password=123456
EOF

5. 启动 mysqld_exporter(操作主机:mysql)

bash

# 后台启动mysqld_exporter,指定配置文件(默认监听9104端口)
nohup /usr/local/mysqld_exporter/mysqld_exporter \
  --config.my-cnf=/usr/local/mysqld_exporter/.my.cnf \
  > /var/log/mysqld_exporter.log 2>&1 &

6. 验证 mysqld_exporter(操作主机:mysql)

bash

# 检查9104端口是否启动
lsof -i :9104

# 访问metrics接口,验证MySQL指标(mysql_up=1表示连接正常,0表示失败)
curl http://localhost:9104/metrics | grep mysql_up

7. 在 Prometheus 添加 MySQL 监控(操作主机:prometheus)

编辑 Prometheus 配置文件,新增 MySQL 监控任务:

bash

# 编辑prometheus.yml配置文件
vi /etc/prometheus/prometheus.yml

# 在文件末尾追加以下内容
- job_name: 'mysql_service'  # 任务名称,自定义(便于识别MySQL服务监控)
  static_configs:
    - targets: ['mysql:9104']  # mysql主机的主机名:端口(mysqld_exporter端口9104)

8. 重启 Prometheus 生效(操作主机:prometheus)

bash

pkill prometheus
nohup /usr/local/prometheus/prometheus --config.file="/usr/local/prometheus/prometheus.yml" > /var/log/prometheus.log 2>&1 &

9. 验证 MySQL 监控状态(操作主机:prometheus)

访问 http://prometheus:9090 → Status → Targets,应看到 mysql_service 任务状态为 UP(表示 MySQL 监控正常)。

📊 五、安装与配置 Grafana(操作主机:grafana)

Grafana 是专业的可视化工具,可对接 Prometheus 数据源,通过仪表盘直观展示监控指标(如 CPU 使用率、MySQL 连接数趋势等)。

1. 安装 Grafana(RPM 包方式)

bash

# 切换到/root目录
cd /root

# 下载文档推荐的5.3.4版本(兼容性好,新版本安装命令类似)
wget https://dl.grafana.com/oss/release/grafana-5.3.4-1.x86_64.rpm

# 安装Grafana(RPM包安装,自动配置系统服务)
sudo rpm -ivh grafana-5.3.4-1.x86_64.rpm

2. 启动 Grafana 服务

bash

# 启动并设置开机自启
systemctl start grafana-server
systemctl enable grafana-server

# 检查3000端口(Grafana默认端口)是否启动
lsof -i :3000

3. 访问 Grafana Web UI

打开浏览器访问:http://grafana:3000(或 http://10.1.1.15:3000):

  • 默认账号密码:admin / admin
  • 首次登录会要求修改密码(建议设置强密码,如 Admin@123

4. 添加 Prometheus 数据源

登录后,点击左侧菜单栏 Configuration(齿轮图标)→ Data Sources → Add data source

  1. 在数据源列表中选择 Prometheus
  2. 配置数据源:
    • URL:填写 http://prometheus:9090(Prometheus 服务的地址);
    • 其他配置保持默认,点击 Save & Test
  3. 提示 “Data source is working” 表示连接成功。

🔸 重要:数据源名称必须保持为 Prometheus(首字母大写),否则后续导入监控模板会失败!

5. 导入 Dashboard 模板(可视化监控数据)

推荐使用 Percona 提供的 MySQL 监控模板,包含主机资源、MySQL 性能等完整仪表盘,支持两种导入方式:

方法一:通过 Git 克隆(推荐,自动加载模板)

bash

# 安装git工具(用于克隆模板仓库)
sudo yum install -y git

# 切换到Grafana模板目录
cd /var/lib/grafana

# 克隆Percona官方模板库(包含MySQL和Linux主机监控模板)
sudo git clone https://github.com/percona/grafana-dashboards.git

# 复制模板到Grafana加载目录
sudo cp -r grafana-dashboards/dashboards /var/lib/grafana/

# 修改Grafana配置,启用JSON模板加载
sudo sed -i '/\[dashboards\.json\]/,/^$/ s/enabled = false/enabled = true/' /etc/grafana/grafana.ini
sudo sed -i '/\[dashboards\.json\]/a path = /var/lib/grafana/dashboards' /etc/grafana/grafana.ini

# 重启Grafana使配置生效
sudo systemctl restart grafana-server

重启后,刷新 Grafana 页面,点击左侧 Dashboards → Manage,即可看到自动加载的模板(如 “MySQL Overview”、“Linux Host Overview” 等),点击即可查看可视化仪表盘。

方法二:手动导入 JSON 模板
  1. 访问 Percona 模板仓库:https://github.com/percona/grafana-dashboards/tree/master/dashboards
  2. 下载需要的模板(如 MySQL_Overview.jsonLinux_Host_Overview.json);
  3. 在 Grafana 页面点击左侧 + → Import
  4. 上传下载的 JSON 文件,选择数据源为 Prometheus,点击 Import
  5. 导入成功后,即可在 Dashboards 列表中找到该模板。

📣 六、(可选)Grafana + OneAlert 报警配置

文档推荐使用 OneAlert 实现报警功能(替代 Alertmanager),支持邮件、微信、电话等多渠道通知,步骤如下:

1. 准备 OneAlert 配置

  1. 访问 OneAlert 官网(https://www.onealert.com/)注册账号(支持手机号、邮箱注册,注册流程需验证身份信息);
  2. 登录后,进入 应用管理 → 添加应用,在应用类型中选择 Grafana,填写应用名称(如 “MySQL 监控报警”)、描述(可选);
  3. 提交后,系统会自动生成专属 Webhook URL(点击 “复制” 按钮保存该地址,后续 Grafana 配置需直接使用);
  4. 可选配置:在 OneAlert 后台进入 通知策略,设置报警接收方式(如邮件、微信、短信、电话)、接收人及报警级别(P0-P3),按需调整即可。

2. 在 Grafana 配置报警渠道(操作主机:grafana,Web UI 操作)

登录 Grafana 后台(http://grafana:3000),点击左侧菜单栏 Alerting → Notification channels → Add channel

  1. 配置报警渠道核心参数:
    • Name:自定义名称(如 “OneAlert-MySQL 报警”,便于后续选择渠道时识别);
    • Type:下拉菜单中选择 Webhook(必须与 OneAlert 应用类型匹配);
    • URL:粘贴第一步复制的 OneAlert 专属 Webhook URL(确保无空格、拼写错误);
    • Http Method:保持默认 POST(OneAlert 仅支持 POST 方式接收报警);
    • Http Header:无需额外添加,保持默认空即可;
    • Other Settings:按需勾选(如 “Include image” 可在报警中附带仪表盘截图,“Send on all alerts” 表示接收所有级别报警);
  2. 测试连通性:点击页面底部 Test 按钮,Grafana 会发送测试报警到 OneAlert,页面提示 “Test notification sent” 且 OneAlert 后台收到 “测试报警” 消息,表示渠道配置正常;
  3. 点击 Save 保存报警渠道(保存后可在 Notification channels 列表中查看状态为 “Enabled”)。

3. 设置监控报警规则(以 MySQL 连接数过高为例)

  1. 打开 Grafana 仪表盘,进入已导入的 MySQL Overview 模板(左侧 Dashboards → Manage → 选择 MySQL Overview);
  2. 在仪表盘找到 “MySQL Connections” 面板(展示当前 MySQL 连接数的图表,通常在仪表盘上方区域);
  3. 点击该面板右上角的 ⋮(更多选项)→ Edit,进入面板编辑页面;
  4. 切换到 Alert(报警) 标签页,开始配置报警规则:
    • Alert Name:自定义报警名称(如 “MySQL 连接数超出阈值”,便于识别报警类型);
    • Condition(触发条件):点击下拉菜单选择 “avg () OF query (A, 5m, now) IS ABOVE 100”(含义:最近 5 分钟的平均连接数超过 100);
      • 说明:query (A) 表示使用面板默认查询语句(统计 MySQL 连接数),5m 表示取最近 5 分钟的平均数据,now 表示当前时间点,100 为阈值(可根据实际业务调整,如小型应用设 50,大型应用设 200);
    • For(持续时间):输入 “1m”(表示连接数持续 1 分钟超过阈值才触发报警,避免瞬时峰值误报警);
    • Notification channels(通知渠道):下拉选择第二步创建的 “OneAlert-MySQL 报警”(可多选多个渠道,此处仅选 OneAlert 即可);
    • Message(报警内容):自定义报警描述(如 “MySQL 服务器(IP:10.1.1.14)连接数持续 1 分钟超过 100,当前平均连接数:{{ $value }},请及时排查!”),支持变量 {{ $value }} 显示实际触发值;
  5. 配置完成后,点击页面底部 Save 保存面板配置,报警规则立即生效。

4. 报警验证与常见问题排查

(1)报警验证方法

手动触发报警:在 mysql 主机执行以下命令,模拟高连接数场景:

bash

# 循环创建 MySQL 连接(需安装 mysql-client,若未安装执行 yum install -y mysql)
for i in {1..120}; do mysql -u mysql_monitor -p123456 -e "SELECT 1" & done

等待 1 分钟后,查看 OneAlert 后台是否收到报警通知(邮件 / 微信 / 短信),同时 Grafana 面板会显示 “Alerting” 状态。

解除报警:执行 pkill -f "mysql -u mysql_monitor" 关闭所有模拟连接,等待 1-2 分钟后,报警状态自动恢复为 “OK”,OneAlert 会发送恢复通知。

(2)常见问题排查
  • 测试报警失败

    1. 检查 Grafana 服务器是否能访问 OneAlert 官网(执行 curl -I https://www.onealert.com,返回 200 表示网络通畅);
    2. 核对 Webhook URL 是否正确(无多余空格、拼写错误);
    3. 检查 OneAlert 应用状态是否为 “启用”(应用管理中查看,若禁用需重新启用)。
  • 未收到实际报警

    1. 确认报警规则的 “For” 持续时间是否满足(如设 5m 需等待 5 分钟才触发);
    2. 检查 Prometheus 数据源是否正常(Grafana → Data Sources → Prometheus → Save & Test,确保连接正常);
    3. 查看 Grafana 日志排查错误(tail -f /var/log/grafana/grafana.log,搜索 “alert” 关键词)。
  • 报警重复发送

    1. 调整 OneAlert 通知策略中的 “重复通知间隔”(避免短时间内重复推送);
    2. 优化报警阈值(避免阈值设置过低导致频繁触发)。

✅ 部署总结与架构图

1. 部署成果

通过以上步骤,已完成一套完整的监控系统部署,包含:

  • 🔹 Prometheus 服务端:集中收集 Linux 主机(CPU / 内存 / 磁盘)、MySQL 服务(连接数 / 查询量 / 表空间)指标;
  • 🔹 多节点监控:通过 node_exporter、mysqld_exporter 实现分布式指标采集;
  • 🔹 可视化仪表盘:Grafana 对接 Prometheus,提供直观的图表展示(支持自定义模板);
  • 🔹 多渠道报警:通过 OneAlert 实现报警通知(邮件 / 微信 / 短信),及时响应异常。

2. 系统架构图

plaintext

[mysql 主机]
  ├─ node_exporter(9100端口)→ 采集Linux硬件指标
  └─ mysqld_exporter(9104端口)→ 采集MySQL服务指标
         ↓
[prometheus 主机(9090端口)] → 存储/聚合监控指标
         ↓
[grafana 主机(3000端口)] → 可视化仪表盘 + 报警触发
         ↓
[OneAlert 平台] → 多渠道报警通知(邮件/微信/短信)

3. 后续优化建议

  • 版本升级:文档使用的 Prometheus、Grafana 版本较旧,生产环境建议升级至最新稳定版(如 Prometheus v2.40+、Grafana v10+),支持更多功能和安全修复;
  • 进程守护:当前使用 nohup 启动服务,建议配置 systemd 服务文件(如 prometheus.service、node_exporter.service),实现服务自动重启、状态管理;
  • 数据持久化:Prometheus 默认数据存储在本地,可配置存储目录(--storage.tsdb.path)并挂载独立磁盘,避免数据丢失;
  • 多节点扩展:若需监控更多主机,可在新主机重复 “安装 exporter → Prometheus 配置 targets” 步骤,支持批量添加监控节点;
  • 自定义仪表盘:根据业务需求修改 Grafana 模板,添加关键指标(如 MySQL 慢查询数、磁盘使用率阈值线)。

总结

本文从环境准备到报警配置,完整覆盖了 Prometheus + Grafana 监控系统的搭建流程,核心要点包括:

  1. Exporter 采集:通过 node_exporter 和 mysqld_exporter 实现 Linux 主机与 MySQL 服务的指标采集;
  2. Prometheus 配置:通过静态任务添加监控目标,实现指标的集中收集与存储;
  3. Grafana 可视化:利用开源模板快速构建监控仪表盘,直观展示数据;
  4. 报警集成:通过 OneAlert 实现多渠道报警,及时响应异常。

这套监控系统可作为中小团队的基础监控框架,后续可根据业务需求扩展至 Redis、Kafka 等中间件的监控,构建全栈式监控体系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值