背景介绍:为什么需要专业的监控系统?
在现代运维工作中,业务系统的复杂度和并发量不断提升,单纯依靠人工巡检或日志排查已无法满足稳定性需求。一套高效的监控系统需要具备数据采集、存储、分析、可视化、报警五大核心能力,而 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 服务器 | prometheus | 10.1.1.13 | 运行 Prometheus 服务,收集监控指标 |
| 被监控主机(含 MySQL) | mysql | 10.1.1.14 | 运行 node_exporter、mysqld_exporter 及 MariaDB |
| Grafana 服务器 | grafana | 10.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:
- 在数据源列表中选择 Prometheus;
- 配置数据源:
- URL:填写
http://prometheus:9090(Prometheus 服务的地址); - 其他配置保持默认,点击 Save & Test;
- URL:填写
- 提示 “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 模板
- 访问 Percona 模板仓库:https://github.com/percona/grafana-dashboards/tree/master/dashboards;
- 下载需要的模板(如
MySQL_Overview.json、Linux_Host_Overview.json); - 在 Grafana 页面点击左侧 + → Import;
- 上传下载的 JSON 文件,选择数据源为 Prometheus,点击 Import;
- 导入成功后,即可在 Dashboards 列表中找到该模板。
📣 六、(可选)Grafana + OneAlert 报警配置
文档推荐使用 OneAlert 实现报警功能(替代 Alertmanager),支持邮件、微信、电话等多渠道通知,步骤如下:
1. 准备 OneAlert 配置
- 访问 OneAlert 官网(https://www.onealert.com/)注册账号(支持手机号、邮箱注册,注册流程需验证身份信息);
- 登录后,进入 应用管理 → 添加应用,在应用类型中选择 Grafana,填写应用名称(如 “MySQL 监控报警”)、描述(可选);
- 提交后,系统会自动生成专属 Webhook URL(点击 “复制” 按钮保存该地址,后续 Grafana 配置需直接使用);
- 可选配置:在 OneAlert 后台进入 通知策略,设置报警接收方式(如邮件、微信、短信、电话)、接收人及报警级别(P0-P3),按需调整即可。
2. 在 Grafana 配置报警渠道(操作主机:grafana,Web UI 操作)
登录 Grafana 后台(http://grafana:3000),点击左侧菜单栏 Alerting → Notification channels → Add channel:
- 配置报警渠道核心参数:
- 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” 表示接收所有级别报警);
- 测试连通性:点击页面底部 Test 按钮,Grafana 会发送测试报警到 OneAlert,页面提示 “Test notification sent” 且 OneAlert 后台收到 “测试报警” 消息,表示渠道配置正常;
- 点击 Save 保存报警渠道(保存后可在 Notification channels 列表中查看状态为 “Enabled”)。
3. 设置监控报警规则(以 MySQL 连接数过高为例)
- 打开 Grafana 仪表盘,进入已导入的 MySQL Overview 模板(左侧 Dashboards → Manage → 选择 MySQL Overview);
- 在仪表盘找到 “MySQL Connections” 面板(展示当前 MySQL 连接数的图表,通常在仪表盘上方区域);
- 点击该面板右上角的 ⋮(更多选项)→ Edit,进入面板编辑页面;
- 切换到 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 }} 显示实际触发值;
- 配置完成后,点击页面底部 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)常见问题排查
-
测试报警失败:
- 检查 Grafana 服务器是否能访问 OneAlert 官网(执行
curl -I https://www.onealert.com,返回 200 表示网络通畅); - 核对 Webhook URL 是否正确(无多余空格、拼写错误);
- 检查 OneAlert 应用状态是否为 “启用”(应用管理中查看,若禁用需重新启用)。
- 检查 Grafana 服务器是否能访问 OneAlert 官网(执行
-
未收到实际报警:
- 确认报警规则的 “For” 持续时间是否满足(如设 5m 需等待 5 分钟才触发);
- 检查 Prometheus 数据源是否正常(Grafana → Data Sources → Prometheus → Save & Test,确保连接正常);
- 查看 Grafana 日志排查错误(
tail -f /var/log/grafana/grafana.log,搜索 “alert” 关键词)。
-
报警重复发送:
- 调整 OneAlert 通知策略中的 “重复通知间隔”(避免短时间内重复推送);
- 优化报警阈值(避免阈值设置过低导致频繁触发)。
✅ 部署总结与架构图
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 监控系统的搭建流程,核心要点包括:
- Exporter 采集:通过 node_exporter 和 mysqld_exporter 实现 Linux 主机与 MySQL 服务的指标采集;
- Prometheus 配置:通过静态任务添加监控目标,实现指标的集中收集与存储;
- Grafana 可视化:利用开源模板快速构建监控仪表盘,直观展示数据;
- 报警集成:通过 OneAlert 实现多渠道报警,及时响应异常。
这套监控系统可作为中小团队的基础监控框架,后续可根据业务需求扩展至 Redis、Kafka 等中间件的监控,构建全栈式监控体系。
5205

被折叠的 条评论
为什么被折叠?



