一、部署基础信息(核心参数汇总)
1. 目录规划(数据与程序分离)
-
根目录:
/data(建议挂载独立磁盘,便于扩容) -
子目录创建命令:
mkdir -p /data/{prometheus,grafana,alertmanager,node_exporter,blackbox_exporter,mysqld_exporter} -
目录用途:所有组件的安装文件、配置、数据均存储在对应子目录,权限统一归属
prometheus用户。不再列举每个service都要创建用户,也可以不创建都用root用户执行
2. 核心组件版本与下载地址
3. 前置准备(必做)
# 1. 安装基础依赖
yum install -y wget tar vim docker # 含Docker(用于cadvisor)
# 2. 创建专用用户(无登录权限)不再列举每个service都要创建,也可以不创建都用root执行
useradd -M -s /sbin/nologin prometheus
# 3. 放行核心端口(CentOS/RHEL)
firewall-cmd --add-port={9090,9093,9100,3000,8080,9115,9104}/tcp --permanent
firewall-cmd --reload
# 4. 启动Docker(用于cadvisor)
systemctl enable --now docker
# 5. 切换工作目录
cd /data
二、核心组件部署步骤(完整命令)
1. Prometheus(监控核心)
# 1. 下载解压
wget https://github.com/prometheus/prometheus/releases/download/v2.53.4/prometheus-2.53.4.linux-amd64.tar.gz
tar -xvf prometheus-2.53.4.linux-amd64.tar.gz
mv prometheus-2.53.4.linux-amd64/* /data/prometheus
# 2. 权限配置
chown -R prometheus.prometheus /data/prometheus
# 3. 创建systemd服务
cat >> /etc/systemd/system/prometheus.service << EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs
After=network.target
[Service]
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/data/prometheus/prometheus \
--config.file=/data/prometheus/prometheus.yml \
--storage.tsdb.path=/data/prometheus/data \
--storage.tsdb.retention.time=15d \
--web.enable-lifecycle
[Install]
WantedBy=multi-user.target
EOF
# 4. 启动验证
systemctl daemon-reload
systemctl enable --now prometheus.service
systemctl status prometheus.service
curl http://10.0.0.104:9090 # 访问成功即正常
2. Alertmanager(告警管理)
# 1. 下载解压
wget https://github.com/prometheus/alertmanager/releases/download/v0.28.1/alertmanager-0.28.1.linux-amd64.tar.gz
tar -xvf alertmanager-0.28.1.linux-amd64.tar.gz
mv alertmanager-0.28.1.linux-amd64/* /data/alertmanager
# 2. 权限配置
chown -R prometheus.prometheus /data/alertmanager
# 3. 创建systemd服务
cat >> /etc/systemd/system/alertmanager.service << EOF
[Unit]
Description=Alert Manager
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
ExecStart=/data/alertmanager/alertmanager \
--config.file=/data/alertmanager/alertmanager.yml \
--storage.path=/data/alertmanager/data
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 4. 启动验证
systemctl daemon-reload
systemctl enable --now alertmanager.service
systemctl status alertmanager.service
curl http://10.0.0.104:9093 # 访问成功即正常
3. node_exporter(主机监控)
# 1. 下载解压
wget https://github.com/prometheus/node_exporter/releases/download/v1.9.0/node_exporter-1.9.0.linux-amd64.tar.gz
tar -xvf node_exporter-1.9.0.linux-amd64.tar.gz
mv node_exporter-1.9.0.linux-amd64/* /data/node_exporter
# 2. 权限配置
chown -R prometheus.prometheus /data/node_exporter
# 3. 创建systemd服务
cat >> /etc/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
User=prometheus
Group=prometheus
ExecStart=/data/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 4. 启动验证
systemctl daemon-reload
systemctl enable --now node_exporter.service
curl http://10.0.0.104:9100/metrics # 输出指标即正常
4. Grafana(可视化)
# 1. 下载解压
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-11.5.3.linux-amd64.tar.gz
tar -xvf grafana-enterprise-11.5.3.linux-amd64.tar.gz
mv grafana-enterprise-11.5.3.linux-amd64/* /data/grafana
# 2. 权限配置
chown -R prometheus.prometheus /data/grafana
# 3. 创建systemd服务
cat >> /etc/systemd/system/grafana-server.service << EOF
[Unit]
Description=Grafana server
Documentation=http://docs.grafana.org
[Service]
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/data/grafana/bin/grafana-server --config=/data/grafana/conf/defaults.ini --homepath=/data/grafana
[Install]
WantedBy=multi-user.target
EOF
# 4. 启动验证
systemctl daemon-reload
systemctl enable --now grafana-server.service
curl http://10.0.0.104:3000 # 访问成功即正常(默认账号admin/admin)
5. cadvisor(容器监控)
docker run -d \
--name=cadvisor \
--net=host \
--privileged=true \
-v /:/rootfs:ro \
-v /var/run:/var/run:rw \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
--restart=always \
google/cadvisor:v0.47.0
# 验证
curl http://10.0.0.104:8080/metrics # 输出容器指标即正常
6. blackbox_exporter(黑盒监控)
# 1. 下载解压
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.25.0/blackbox_exporter-0.25.0.linux-amd64.tar.gz
tar -xvf blackbox_exporter-0.25.0.linux-amd64.tar.gz
mv blackbox_exporter-0.25.0.linux-amd64/* /data/blackbox_exporter
# 2. 配置监控模块
cat > /data/blackbox_exporter/blackbox.yml << EOF
modules:
http_2xx: # HTTP接口监控
prober: http
timeout: 5s
http:
valid_status_codes: [200,201,204]
tcp_connect: # TCP端口监控
prober: tcp
timeout: 5s
icmp: # ICMP ping监控
prober: icmp
timeout: 5s
EOF
# 3. 权限配置
chown -R prometheus.prometheus /data/blackbox_exporter
# 4. 创建systemd服务
cat >> /etc/systemd/system/blackbox_exporter.service << EOF
[Unit]
Description=Blackbox Exporter
After=network.target
[Service]
User=prometheus
Group=prometheus
ExecStart=/data/blackbox_exporter/blackbox_exporter --config.file=/data/blackbox_exporter/blackbox.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 5. 启动验证
systemctl daemon-reload
systemctl enable --now blackbox_exporter.service
curl http://10.0.0.104:9115/metrics # 输出指标即正常
7. mysqld_exporter(MySQL 监控)
# 1. 下载解压
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
tar -xvf mysqld_exporter-0.15.1.linux-amd64.tar.gz
mv mysqld_exporter-0.15.1.linux-amd64/* /data/mysqld_exporter
# 2. 创建MySQL监控用户
mysql -uroot -p
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'Exporter@123';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
exit
# 3. 配置连接信息
cat > /data/mysqld_exporter/.my.cnf << EOF
[client]
user=exporter
password=Exporter@123
host=localhost
EOF
# 4. 权限配置
chown -R prometheus.prometheus /data/mysqld_exporter
# 5. 创建systemd服务
cat >> /etc/systemd/system/mysqld_exporter.service << EOF
[Unit]
Description=MySQL Exporter
After=network.target
[Service]
User=prometheus
Group=prometheus
Environment=DATA_SOURCE_NAME=exporter:Exporter@123@(localhost:3306)/
ExecStart=/data/mysqld_exporter/mysqld_exporter --config.my-cnf=/data/mysqld_exporter/.my.cnf
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 6. 启动验证
systemctl daemon-reload
systemctl enable --now mysqld_exporter.service
curl http://10.0.0.104:9104/metrics # 输出MySQL指标即正常
三、监控核心配置(监控什么?怎么配?)
1. 核心监控对象与指标
| 监控维度 | 监控内容 | 对应组件 | 核心指标示例 |
|---|---|---|---|
| 主机层面 | CPU、内存、磁盘 IO、网络、负载、磁盘使用率 | node_exporter | node_cpu_usage、node_memory_usage |
| 容器层面 | 容器 CPU / 内存 / 磁盘、状态、镜像占用 | cadvisor | container_cpu_usage_seconds_total |
| 服务层面 | 接口存活、端口监听、响应耗时 | blackbox_exporter | probe_success、http_request_duration_seconds |
| 数据库层面 | 连接数、QPS、慢查询、表空间 | mysqld_exporter | mysql_connected_clients、mysql_slow_queries |
| 中间件层面 | Nginx 连接数、Kafka 消费延迟、Redis 命中率 | 专属 Exporter(如 nginx_exporter) | nginx_http_requests_total、redis_keyspace_hits |
| 应用层面 | JVM 内存、线程、接口调用量 | jmx_exporter | jvm_memory_used_bytes |
2. Prometheus 核心配置(prometheus.yml)
完整配置示例
global:
scrape_interval: 1m # 默认拉取频率
evaluation_interval: 1m # 告警规则评估频率
external_labels: # 全局标签(区分环境/集群)
env: "production"
cluster: "prod-cluster"
# 对接Alertmanager
alerting:
alertmanagers:
- static_configs:
- targets: ["10.0.0.104:9093"]
timeout: 10s
# 告警规则文件
rule_files:
- "/data/alertmanager/rule/*.yml"
# 指标拉取配置(核心)
scrape_configs:
# 1. 监控自身
- job_name: "prometheus"
static_configs:
- targets: ["10.0.0.104:9090"]
# 2. 主机监控
- job_name: "node_exporter"
scrape_interval: 15s # 覆盖全局拉取频率
static_configs:
- targets: ["10.0.0.104:9100", "10.0.0.105:9100"]
labels:
group: "web-server"
# 3. 容器监控
- job_name: "cadvisor"
scrape_interval: 15s
static_configs:
- targets: ["10.0.0.104:8080"]
# 4. HTTP接口监控(blackbox)
- job_name: "blackbox_http"
scrape_interval: 10s
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets: ["http://10.0.0.104:80", "http://10.0.0.104:8080/api/health"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 10.0.0.104:9115
# 5. TCP端口监控(blackbox)
- job_name: "blackbox_tcp"
scrape_interval: 10s
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets: ["10.0.0.104:3306", "10.0.0.104:6379"]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 10.0.0.104:9115
# 6. MySQL监控
- job_name: "mysql_exporter"
scrape_interval: 15s
static_configs:
- targets: ["10.0.0.104:9104"]
配置语法核心说明
| 配置节点 | 核心参数 | 含义 |
|---|---|---|
| global | scrape_interval | 所有 job 默认拉取频率(默认 1m,密集监控可设 15s) |
| alerting | alertmanagers.targets | Alertmanager 地址列表 |
| rule_files | - | 告警规则文件路径(支持通配符) |
| scrape_configs | job_name | 监控任务名称(唯一) |
| static_configs.targets | 监控目标(IP: 端口) | |
| labels | 自定义标签(用于分类筛选) | |
| relabel_configs | 标签重写(清洗 / 添加 / 删除标签) | |
| file_sd_configs | 动态发现(适合大量目标,通过文件更新) |
配置验证与重载
# 1. 语法验证(必做)
cd /data/prometheus
./promtool check config prometheus.yml
# 2. 热重载(推荐,无中断)
curl -X POST http://10.0.0.104:9090/-/reload
# 3. 重启(配置结构变更时用)
systemctl restart prometheus.service
3. 告警规则编写(实战示例)
规则文件目录创建
mkdir -p /data/alertmanager/rule
chown -R prometheus.prometheus /data/alertmanager/rule
通用告警规则示例(/data/alertmanager/rule/common.yml)
groups:
- name: 通用监控规则
rules:
# 1. 主机宕机
- alert: 主机宕机
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} 主机宕机"
description: "{{ $labels.instance }} 持续1分钟未响应,请检查服务器状态。"
# 2. 磁盘使用率过高
- alert: 磁盘使用率过高
expr: 100 - (node_filesystem_avail_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100) > 90
for: 5m
labels:
severity: warning
annotations:
summary: "{{ $labels.instance }} 磁盘使用率过高"
description: "分区 {{ $labels.mountpoint }} 使用率达 {{ $value | printf \"%.2f\" }}%,超过90%阈值。"
# 3. HTTP接口不可用
- alert: HTTP接口不可用
expr: probe_success{job="blackbox_http"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} 接口不可用"
description: "接口 {{ $labels.instance }} 访问失败,请检查服务。"
# 4. MySQL连接数过高
- alert: MySQL连接数过高
expr: mysql_global_status_threads_connected > 500
for: 2m
labels:
severity: warning
annotations:
summary: "{{ $labels.instance }} MySQL连接数过高"
description: "当前连接数 {{ $value }},超过500阈值。"
Alertmanager 告警渠道配置(邮件示例)
# /data/alertmanager/alertmanager.yml
global:
smtp_smarthost: 'smtp.163.com:25'
smtp_from: 'your_email@163.com'
smtp_auth_username: 'your_email@163.com'
smtp_auth_password: '邮箱授权码'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email-receiver'
receivers:
- name: 'email-receiver'
email_configs:
- to: 'admin@example.com'
subject: '【告警】{{ .CommonLabels.alertname }}'
html: |
<h3>告警详情</h3>
<p>告警名称:{{ .CommonLabels.alertname }}</p>
<p>级别:{{ .CommonLabels.severity }}</p>
<p>描述:{{ .CommonAnnotations.description }}</p>
<p>时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }}</p>
# 抑制规则(避免重复告警)
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
四、Grafana 可视化配置
1. 对接 Prometheus 数据源
- 登录 Grafana(http://10.0.0.104:3000),首次登录修改默认密码;
- 左侧菜单栏 →
Connections→Data sources→Add data source→ 选择Prometheus; - 填写
URL:http://10.0.0.104:9090→ 点击Save & test,提示 "Data source is working" 即成功。
2. 导入预制仪表盘
| 监控场景 | 仪表盘 ID | 导入步骤 |
|---|---|---|
| Linux 主机详情 | 12633 | 左侧Dashboards → New → Import → 输入 ID → 选择数据源 → Import |
| Linux 主机列表 | 12632 | 同上 |
| 容器监控 | 893 | 同上 |
| MySQL 监控 | 7362 | 同上 |

3. 自定义仪表盘
- 新建 Dashboard →
Add Panel→ 选择Prometheus数据源; - 输入 PromQL 查询语句(如
node_cpu_usage{instance="10.0.0.104"}); - 配置图表类型(折线图 / 柱状图)、阈值标注(如 > 90% 标红);
- 保存面板,命名 Dashboard(如 "生产环境主机监控")。
五、PromQL 查询语言核心语法
1. 基础查询
-
直接查询指标:
node_memory_usage(返回所有标签的内存使用率); -
标签过滤:
node_memory_usage{instance="10.0.0.104",env="production"}; -
聚合运算:
sum(node_cpu_usage) by (instance) # 按实例汇总CPU使用率 avg(node_disk_usage) by (env) # 按环境计算平均磁盘使用率 max(node_load15) # 最大15分钟负载
2. 时间范围查询
node_load15[5m]:过去 5 分钟的 15 分钟负载;increase(node_http_requests_total[1m]):1 分钟内请求数增量;rate(node_http_requests_total[1m]):1 分钟内请求速率(每秒);irate(node_http_requests_total[10s]):10 秒内瞬时速率(适合高频指标)。
3. 阈值判断
node_disk_usage > 90:磁盘使用率超过 90%;probe_success == 0:监控目标不可用;increase(mysql_slow_queries[5m]) > 10:5 分钟慢查询超过 10 个。
六、进阶补充(生产环境必备)
1. 监控数据持久化与扩容
- 数据保留 :通过
--storage.tsdb.retention.time=30d(保留 30 天)或--storage.tsdb.retention.size=100GB(限制 100GB)控制数据量; - 扩容方案 :
/data挂载独立磁盘,定期清理旧数据;- 生产环境用 Thanos 实现数据集群化存储和查询;
- 指标分片:按业务 / 环境拆分 Prometheus 实例。
2. 常见问题排查
| 问题现象 | 排查步骤 |
|---|---|
| Prometheus 启动失败 | 1. 检查权限:chown -R prometheus.prometheus /data/prometheus;2. 验证配置:./promtool check config;3. 查看日志:journalctl -u prometheus -f |
| 监控目标显示 DOWN | 1. 检查 Exporter 状态:systemctl status xxx_exporter;2. 测试端口连通:telnet IP 端口;3. 防火墙放行端口 |
| 告警误触发 | 1. 增加for持续时间(如 1m→5m);2. 用rate/irate平滑指标;3. 调整阈值适应业务场景 |
| Grafana 无数据 | 1. 验证数据源连通性;2. 在 Prometheus Graph 中测试 PromQL;3. 检查 targets 状态 |
3. 性能调优建议
- Prometheus 调优 :
- 降低非核心指标拉取频率(如从 15s 改为 1m);
- 删除无用标签(通过
relabel_configs的labeldrop); - 限制标签维度(避免单指标标签数超过 10 个);
- Grafana 调优 :
- 减少面板查询次数(合并重复查询);
- 增大查询时间范围步长(如 1m→5m);
- 避免使用
irate查询长时间段数据。
4. 其他常用 Exporter 扩展
| 插件名称 | 监控对象 | 下载地址(示例版本) | 默认端口 | 核心指标 |
|---|---|---|---|---|
| redis_exporter | Redis | https://github.com/oliver006 /redis_exporter/releases/downl oad/v1.52.0/redis_exporter-v1.52.0.linux-amd64.tar.gz | 9121 | redis_connected_clients、redis_keyspace_hits |
| nginx_exporter | Nginx | https://github.com/nginxinc/ngi nx-prometheus-exporter/releases/download/v0.11.0/nginx-prometh eus-exporter_0.11.0_linux_amd64.tar.gz | 9113 | nginx_http_requests_total、nginx_active_connections |
| jmx_exporter | Java 应用 | https://repo1.maven.org/maven2/i o/prometheus/jmx/jmx_promethe us_javaagent/0.19.0/jmx_prome theus_javaagent-0.19.0.jar | 自定义 | jvm_memory_used_bytes、jvm_threads_active |
七、总结
- 核心逻辑:Exporter 采集指标 → Prometheus 拉取 / 存储 → PromQL 分析 → 告警 / 可视化,所有配置需先验证语法再重载;
- 部署重点:目录规划(数据与程序分离)、专用用户授权、systemd 服务配置,确保服务可启停、自启动;
- 监控配置:按 "主机→容器→服务→数据库" 逐步扩展,通用场景用 blackbox_exporter,专属场景用对应 Exporter;
- 进阶关键:掌握 PromQL 实现指标分析,配置告警抑制避免误触发,生产环境做好数据持久化和性能调优。