Prometheus
Prometheus 是一套开源的分布式时序数据库监控系统,具备强大的数据采集、存储、分析及告警能力,广泛应用于云原生、微服务、传统服务器等多场景监控。本文将基于 Docker 部署方式,详细讲解 Prometheus 监控平台的架构、搭建流程及各类监控目标(操作系统、MySQL、Redis、Nginx、Docker 容器)的配置方法,同时补充实操备注与问题排查技巧,确保新手也能顺利落地。
一、 Prometheus 监控平台架构
1.1 核心组件概念详解
Prometheus 平台采用组件化架构设计,各组件分工明确、协同工作,核心组件包括以下三类:
- Exporter(数据采集器): 专门用于采集目标对象(如服务器、数据库、中间件)的性能指标数据,将其转换为 Prometheus 可识别的格式并暴露端口供拉取。官方及社区提供了丰富的 Exporter,覆盖绝大多数主流技术栈,不同监控目标对应专属 Exporter(如 node_exporter 监控操作系统、mysqld_exporter 监控 MySQL),也支持自定义 Exporter 适配特殊业务场景。
- Prometheus Server(核心服务): 平台核心组件,兼具时序数据库与数据拉取功能。主要负责从 Exporter 定期拉取指标数据、对数据进行时序存储与索引、支持 PromQL 语句进行数据查询与分析,同时可配置告警规则触发告警通知。
- Grafana(可视化平台): 专业的开源可视化工具,并非 Prometheus 生态专属,但与 Prometheus 兼容性极强。可通过配置 Prometheus 为数据源,利用内置模板或自定义面板,将时序数据以折线图、柱状图、仪表盘等形式直观展示,支持多维度数据筛选与趋势分析,大幅提升监控数据的可读性。
补充说明:完整的 Prometheus 生态还可搭配 AlertManager(告警管理)、PushGateway(被动推送数据)等组件,本文聚焦基础监控搭建,暂不涉及扩展组件。
1.2 部署前准备工作(必做)
为确保各组件通信正常、数据采集准确,部署前需完成以下环境配置,所有涉及的 Linux 机器均需执行:
-
关闭防火墙及 SELinux: 避免端口被拦截,影响组件间通信(生产环境可按需开放指定端口,测试环境直接关闭更便捷)。
# 关闭防火墙(临时关闭,重启失效) systemctl stop firewalld # 禁止防火墙开机自启(永久关闭) systemctl disable firewalld # 关闭 SELinux(临时关闭) setenforce 0 # 永久关闭 SELinux,编辑配置文件 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config -
时间同步配置: Prometheus 基于时序数据存储,时间准确性直接影响数据一致性与监控有效性,需确保所有机器时间同步至北京时间。
# 安装 NTP 时间同步工具 yum install -y ntp # 设置时区为上海(永久生效) ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 同步网络时间(使用国内 NTP 服务器,速度更快) ntpdate cn.pool.ntp.org # 验证时间是否正确 date # 输出格式包含 CST 时区且时间准确即可备注:若执行 ntpdate 命令报错,可尝试更换 NTP 服务器(如 210.72.145.44 国家授时中心服务器),或检查网络是否能访问外网。
-
Docker 环境部署: 本文所有组件均通过 Docker 安装,需提前在部署机器上安装 Docker 及 Docker Compose(可选,用于批量管理容器)。
# 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加 Docker 镜像源(阿里云镜像,加速下载) yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装 Docker yum install -y docker-ce docker-ce-cli containerd.io # 启动 Docker 并设置开机自启 systemctl start docker systemctl enable docker # 验证 Docker 是否安装成功 docker --version # 输出 Docker 版本信息即正常
二、Prometheus 监控平台搭建流程
本套监控体系覆盖 5 类核心监控目标:操作系统、MySQL 数据库、Redis 缓存、Nginx 服务、Docker 容器,整体搭建顺序为:Exporter → Prometheus → Grafana,逐步完成数据采集、存储、可视化全链路配置。
2.1 安装 node_exporter(操作系统监控)
node_exporter 是官方提供的操作系统监控 Exporter,可采集 CPU、内存、磁盘 IO、网络流量、负载等核心指标,支持 Linux、Windows 等主流操作系统,此处以 Linux 为例。
2.1.1 启动 node_exporter 容器
docker run -d \
-p 9100:9100 \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /:/rootfs:ro \
--name node-exporter \
prom/node-exporter
2.1.2 参数说明
- -d:后台运行容器;
- -p 9100:9100:映射容器端口 9100 到宿主机 9100(node_exporter 默认端口为 9100,不可修改);
- -v 挂载目录:以只读模式(ro)挂载宿主机的 /proc、/sys、/ 目录,用于采集系统底层指标,只读模式可避免容器对宿主机文件系统造成误操作;
- --name:给容器命名,便于后续管理(如重启、删除容器)。
2.1.3 验证启动结果
# 查看容器是否正常运行
docker ps | grep node-exporter
# 访问 Exporter 暴露的指标接口,验证数据是否正常输出
curl http://localhost:9100/metrics
若 curl 命令能输出大量以 “# HELP” “# TYPE” 开头的指标数据,说明 node_exporter 启动成功且正常采集数据。
2.2 安装 Prometheus Server
Prometheus Server 负责拉取、存储 Exporter 数据,需先配置采集规则,再启动容器。
2.2.1 创建配置文件与目录
# 在宿主机创建 Prometheus 配置目录(用于挂载容器配置文件,便于修改)
mkdir -p /root/prometheus
# 进入目录,创建核心配置文件 prometheus.yml
cd /root/prometheus
vi prometheus.yml
2.2.2 编写 prometheus.yml 配置文件
global:
scrape_interval: 15s # 数据采集间隔,默认 15 秒,可根据需求调整(最小 1s)
evaluation_interval: 15s # 告警规则评估间隔,与采集间隔保持一致即可
alerting:
alertmanagers: # 告警管理器配置,本文暂不启用,注释留空
- static_configs:
- targets:
# - alertmanager:9093
scrape_configs: # 数据采集规则配置,每一个 job 对应一类监控目标
# 采集 Prometheus 自身指标的 job
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090'] # Prometheus 自身端口为 9090
# 采集操作系统指标的 job(对应 node_exporter)
- job_name: 'node' # job 名称,自定义,建议与监控目标一致
static_configs:
# 配置 node_exporter 的 IP 和端口,多个节点用逗号分隔
- targets: ['192.168.72.128:9100'] # 替换为 node_exporter 所在机器的实际 IP
备注:若需监控多台服务器的操作系统,只需在 targets 中添加多个 node_exporter 节点,格式如下:
- targets: ['192.168.2.158:9100','192.168.2.168:9100','192.168.2.178:9100']
2.2.3 启动 Prometheus 容器
docker run -d \
-p 9090:9090 \
-v /root/prometheus:/etc/prometheus \
--privileged=true \
--name prometheus \
prom/prometheus
2.2.4 参数说明
- -p 9090:9090:映射 Prometheus 默认端口 9090 到宿主机;
- -v /root/prometheus:/etc/prometheus:将宿主机配置目录挂载到容器内的 /etc/prometheus(Prometheus 容器默认读取此目录下的 prometheus.yml);
- --privileged=true:赋予容器特权模式,避免挂载目录时出现权限不足问题。
2.2.5 验证与访问
-
浏览器访问 Prometheus UI 界面:http://{Prometheus 宿主机 IP}:9090(如 http://192.168.245.130:9090);
-
点击顶部菜单栏「Status」→「Targets」,查看各 job 的采集状态:

- 状态为 Up:表示 Prometheus 与 Exporter 通信正常,数据采集正常;
- 状态为 Down:检查 Exporter 是否正常运行、网络是否互通、IP/端口是否配置错误。
-
测试数据查询:在顶部查询框输入 PromQL 语句(如 node_cpu_seconds_total,查询 CPU 指标),点击「Execute」,若能显示指标数据,说明 Prometheus 正常工作。
2.3 安装 Grafana(可视化展示)
Grafana 提供直观的监控面板,通过导入模板可快速生成各类监控报表,无需手动配置面板。
2.3.1 启动 Grafana 容器
docker run -d -p 3000:3000 --name grafana -v grafana-storage:/var/lib/grafana grafana/grafana
备注:-v grafana-storage:/var/lib/grafana 用于持久化 Grafana 的模板、数据源配置,避免容器重启后配置丢失,首次运行会自动创建 grafana-storage 数据卷。
2.3.2 访问与初始化 Grafana
- 浏览器访问:http://{Grafana 宿主机 IP}:3000(默认端口 3000);
- 首次登录:用户名/密码均为 admin,登录后会提示修改初始密码(建议修改为复杂密码,保障安全);
- 配置 Prometheus 数据源(关联 Prometheus 数据):
- 点击左侧菜单栏「齿轮图标(Configuration)」→「Data Sources」→「Add data source」;
- 选择数据源类型为「Prometheus」;
- 在「URL」处填写 Prometheus 的访问地址(如 http://192.168.2.158:9090),其他参数保持默认;
- 点击底部「Save & Test」,若提示「Data source is working」,说明数据源配置成功。
2.3.3 导入操作系统监控模板
Grafana 社区提供大量现成模板,无需手动绘制面板,操作系统监控推荐使用模板 ID:11074(Node Exporter Full 模板,指标全面、界面美观)。
- 点击左侧菜单栏「+」→「Import」;
- 在「Import via grafana.com」输入框中填写模板 ID:11074,点击「Load」;
- 在导入页面选择已配置的 Prometheus 数据源,点击「Import」;
- 查看监控报表:导入成功后自动跳转到监控面板,可直观查看 CPU、内存、磁盘、网络等指标的实时数据与趋势图,支持按时间范围(如近 1 小时、近 24 小时)筛选数据。
2.4 安装 mysqld_exporter(MySQL 监控)
mysqld_exporter 用于采集 MySQL 数据库的性能指标(连接数、查询速率、慢查询、表空间等),需先配置 MySQL 权限,再启动 Exporter。
2.4.1 配置 MySQL 权限(必做)
mysqld_exporter 需要通过数据库账号连接 MySQL 采集指标,需创建专属账号并授予最小权限:
# 登录 MySQL 数据库(本地或远程登录)
mysql -u root -pTestfan#123 -h 192.168.2.41
# 创建监控账号并授权
CREATE USER 'exporter'@'%' IDENTIFIED BY 'Testfan#123'; # 用户名 exporter,密码自定义
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%'; # 授予必要权限
FLUSH PRIVILEGES; # 刷新权限
# 验证权限(可选)
SHOW GRANTS FOR 'exporter'@'%';
备注:权限说明——PROCESS(查看进程)、REPLICATION CLIENT(查看主从状态)、SELECT(查询系统表),无需授予写权限,遵循最小权限原则。
2.4.2 启动 mysqld_exporter 容器
docker run -d \
-p 9104:9104 \
-e DATA_SOURCE_NAME="exporter:123456789@(192.168.72.129:3306)/" \
--name mysqld-exporter \
prom/mysqld-exporter:v0.14.0
2.4.3 参数说明
- -p 9104:9104:mysqld_exporter 默认端口为 9104,映射到宿主机;
- -e DATA_SOURCE_NAME:环境变量,指定 MySQL 连接信息,格式为「用户名:密码@(数据库IP:端口)/」,无需指定具体数据库;
- 指定版本 v0.14.0:避免使用最新版本出现兼容性问题,此版本稳定且支持主流 MySQL 版本(5.7、8.0)。
2.4.4 配置 Prometheus 采集规则
# 编辑 prometheus.yml 配置文件
vi /root/prometheus/prometheus.yml
# 在 scrape_configs 下添加 MySQL 采集 job
- job_name: 'mysql'
static_configs:
- targets: ['192.168.72.129:9104'] # 替换为 mysqld_exporter 所在机器的 IP 和端口
# 重启 Prometheus 容器,使配置生效
docker restart prometheus
验证:访问 Prometheus Targets 页面,确认 mysql job 状态为 Up。
2.4.5 导入 MySQL 监控模板
推荐使用社区成熟模板,ID:7362(MySQL Overview 模板,覆盖核心指标),导入步骤与操作系统模板一致:
- Grafana 导入页面输入模板 ID:7362,点击 Load;
- 选择 Prometheus 数据源,点击 Import;
- 查看 MySQL 监控面板:可查看连接数、QPS、慢查询、表空间、缓存命中率等核心指标,支持按时间范围分析趋势。
2.5 安装 redis_exporter(Redis 监控)
redis_exporter 用于采集 Redis 缓存的性能指标(内存占用、连接数、命中率、键数量等),支持单机、集群模式 Redis。
2.5.1 启动 redis_exporter 容器
根据 Redis 是否设置密码,分为两种启动方式:
方式一:Redis 无密码
docker run -d \
-p 9121:9121 \
--name redis-exporter \
oliver006/redis_exporter \
--redis.addr redis://192.168.2.41:6379
方式二:Redis 有密码(推荐)
docker run -d \
-p 9121:9121 \
--name redis-exporter \
oliver006/redis_exporter \
--redis.addr redis://192.168.72.129:6379 \ # Redis 地址和端口
--redis.password '123456' # Redis 密码,替换为实际密码
docker run -d -p 9121:9121 --name redis-exporter oliver006/redis_exporter --redis.addr redis://192.168.72.129:6379 --redis.password '123456'
2.5.2 配置 Prometheus 采集规则
# 编辑 prometheus.yml
vi /root/prometheus/prometheus.yml
# 添加 redis job
- job_name: 'redis'
static_configs:
- targets: ['192.168.2.41:9121'] # redis_exporter 所在 IP 和端口(默认 9121)
# 重启 Prometheus
docker restart prometheus
2.5.3 导入 Redis 监控模板
推荐模板 ID:763(Redis Dashboard 模板),导入后可查看 Redis 内存、连接数、命中率、命令执行速率等指标,支持识别 Redis 角色(主从、集群)。
2.6 安装 nginx_exporter(Nginx 监控)
nginx_exporter 需依赖 Nginx 的 stub_status 模块(内置模块,无需额外安装)暴露监控指标,需先配置 Nginx,再启动 Exporter。
2.6.1 配置 Nginx stub_status 模块
# 进入 Nginx 配置目录(根据实际 Nginx 安装路径调整,此处为默认路径)
cd /root/docker/nginx/conf.d
# 创建监控配置文件 sub_status.conf
vi sub_status.conf
# 定义一个 HTTP 服务块
server {
# 监听 80 端口(HTTP 默认端口)
listen 80;
# 匹配的域名/IP,这里指定为服务器的内网 IP 192.168.72.129
server_name 192.168.72.129;
# 配置 Nginx 状态监控的访问路径
location /nginx_status {
# 开启 stub_status 模块(用于查看 Nginx 运行状态)
stub_status on;
# 补充建议:增加访问限制,避免任意IP访问(可选)
# allow 127.0.0.1; # 允许本机访问
# allow 192.168.72.0/24; # 允许同网段IP访问
# deny all; # 拒绝其他所有IP
}
# 配置 500/502/503/504 错误码的跳转页面
error_page 500 502 503 504 /50x.html;
# 精准匹配 50x.html 页面的访问路径
location = /50x.html {
# 指定 50x.html 页面所在的根目录
root /usr/share/nginx/html;
}
}
2.6.2 验证 Nginx 配置并重启
# 重启 Nginx 使配置生效
systemctl restart nginx # 若为 Docker 部署的 Nginx,执行 docker restart nginx
# 验证状态接口是否正常
curl http://192.168.4.85/nginx_status
正常输出如下,说明 stub_status 模块配置成功:
Active connections: 2
server accepts handled requests
100 100 200
Reading: 0 Writing: 1 Waiting: 1
2.6.3 启动 nginx_exporter 容器
docker run -d \
-p 9113:9113 \
--name nginx-exporter \
nginx/nginx-prometheus-exporter \
-nginx.scrape-uri http://192.168.72.129/nginx_status
参数说明:-nginx.scrape-uri 指定 Nginx 状态接口地址,必须与 Nginx 配置的接口一致。
2.6.4 配置 Prometheus 与导入模板
-
添加 Prometheus 采集 job:
# 编辑 prometheus.yml vi /root/prometheus/prometheus.yml # 添加 redis job - job_name: 'nginx' static_configs: - targets: ['192.168.72.129:9113'] # # nginx_exporter 所在 IP 和端口(默认 9113) # 重启 Prometheus docker restart prometheus -
导入 Nginx 监控模板:模板 ID:12708(Nginx Dashboard 模板),支持查看连接数、请求速率、响应时间、Worker 状态等指标。
2.7 安装 cAdvisor(Docker 容器监控)
cAdvisor(Container Advisor)是 Google 开源的容器监控工具,可采集 Docker 容器的 CPU、内存、磁盘 IO、网络等资源占用指标,弥补 node_exporter 无法细化到容器级监控的短板。
2.7.1 环境预处理(解决权限与挂载问题)
# 重新挂载 /sys/fs/cgroup,赋予读写权限
mount -o remount,rw '/sys/fs/cgroup'
# 建立软连接,解决 cAdvisor 采集时的路径识别问题
ln -s /sys/fs/cgroup/cpu,cpuacct /sys/fs/cgroup/cpuacct,cpu
2.7.2 启动 cAdvisor 容器
docker run -d \
-p 18080:8080 \
--name cadvisor \
-v /:/rootfs:ro \
-v /var/run:/var/run:rw \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
-v /dev/disk/:/dev/disk:ro \
--privileged=true \
google/cadvisor
2.7.3 参数说明
- -p 18080:8080:cAdvisor 默认端口为 8080,此处映射为 18080(避免与其他服务冲突);
- 挂载目录:通过挂载宿主机的 /、/var/run、/sys、/var/lib/docker 等目录,采集容器及宿主机底层资源指标。
2.7.4 配置 Prometheus 与导入模板
-
添加 Prometheus 采集 job:
# 编辑 prometheus.yml vi /root/prometheus/prometheus.yml # 添加 redis job - job_name: 'cadvisor' static_configs: - targets: ['192.168.72.129:18080'] # # # cAdvisor 所在 IP 和映射端口 # 重启 Prometheus docker restart prometheus -
导入容器监控模板:模板 ID:193(Docker and system monitoring 模板),可查看单个容器的资源占用、容器总数、资源使用率排行等指标,支持按容器名称筛选。
3. 常见问题排查
- Prometheus Targets 状态为 Down:
- 检查 Exporter 容器是否正常运行:docker ps | grep 对应 Exporter 名称;
- 测试网络连通性:在 Prometheus 机器上执行 curl Exporter 地址:端口/metrics,查看是否能访问;
- 检查防火墙/SELINUX 是否关闭,或是否开放对应端口;
- 确认 prometheus.yml 中 IP、端口配置正确,无拼写错误。
- Grafana 模板导入后无数据:
- 检查数据源是否选择正确(需对应 Prometheus 数据源);
- 验证 Prometheus 是否正常采集对应指标(在 Prometheus query 框输入模板关联的指标,查看是否有数据);
- 检查模板是否兼容当前 Grafana 版本,若不兼容可更换模板或升级 Grafana。
- mysqld_exporter 采集失败:
- 确认 MySQL 账号密码正确,且已授予对应权限;
- 检查 MySQL 远程连接是否开启(允许 exporter 所在机器访问);
- 查看 exporter 日志排查错误:docker logs mysqld-exporter。
4. 平台优化建议
- 数据持久化:Prometheus 容器默认数据存储在容器内,重启后数据丢失,建议挂载宿主机目录或使用云存储持久化数据;
- 告警配置:部署 AlertManager 组件,结合 Prometheus 告警规则,实现指标异常时邮件、钉钉、企业微信告警;
- 性能优化:若监控目标较多,可调整 Prometheus 采集间隔(避免过小导致资源占用过高),同时开启数据分片与Retention Policy(数据保留策略,如保留 7 天数据);
- 安全加固:给 Grafana、Prometheus 设置复杂密码,限制访问 IP,生产环境建议通过 HTTPS 访问。

浙公网安备 33010602011771号