17.2.2 组件部署与目录结构规划

在生产环境中部署 Prometheus 时,应将组件、数据与配置分离,形成清晰的目录结构与生命周期管理方式。推荐以二进制方式部署 Prometheus Server、Alertmanager 与常用 Exporter,并通过 systemd 管理进程,以便统一启动、日志与权限控制。

原理草图(组件关系)

文章图片

组件部署规划
- Prometheus Server:负责指标采集、存储与查询。
- Alertmanager:负责告警分组、去重与通知。
- Node Exporter:采集主机指标,建议与 Prometheus 分离部署。
- 可选 Exporter:如 mysqld_exporter、redis_exporter、nginx_exporter,根据业务选择。

推荐目录结构
- /opt/prometheus/:程序安装目录
- prometheuspromtool 可执行文件
- /etc/prometheus/:配置目录
- prometheus.yml 主配置
- rules/ 告警规则与记录规则
- /var/lib/prometheus/:数据存储目录
- TSDB 数据与 WAL 日志
- /var/log/prometheus/:日志目录(或由 systemd journal 管理)

Alertmanager 目录结构
- /opt/alertmanager/:程序目录
- /etc/alertmanager/:配置文件 alertmanager.yml
- /var/lib/alertmanager/:运行数据与静态资源

Exporter 部署建议
- 统一安装至 /opt/exporters/,每个 exporter 独立子目录
- 以 systemd 单独管理,便于升级与重启
- 端口规划避免冲突,例如:9100(node)、9121(redis)、9104(mysql)

权限与用户建议
- 创建独立用户 prometheusalertmanager
- 仅授予配置与数据目录读写权限,禁止 root 运行
- 配置文件设置只读,防止误操作修改

目录创建与用户初始化(示例命令)

# 创建用户
useradd -r -s /sbin/nologin prometheus
useradd -r -s /sbin/nologin alertmanager

# 创建目录
mkdir -p /opt/prometheus /etc/prometheus/rules /var/lib/prometheus /var/log/prometheus
mkdir -p /opt/alertmanager /etc/alertmanager /var/lib/alertmanager
mkdir -p /opt/exporters/node_exporter

# 权限设置
chown -R prometheus:prometheus /opt/prometheus /etc/prometheus /var/lib/prometheus /var/log/prometheus
chown -R alertmanager:alertmanager /opt/alertmanager /etc/alertmanager /var/lib/alertmanager

二进制解压与文件摆放(示例)

# Prometheus
tar -xzf prometheus-2.48.0.linux-amd64.tar.gz
cp prometheus-2.48.0.linux-amd64/{prometheus,promtool} /opt/prometheus/

# Alertmanager
tar -xzf alertmanager-0.26.0.linux-amd64.tar.gz
cp alertmanager-0.26.0.linux-amd64/{alertmanager,amtool} /opt/alertmanager/

# Node Exporter
tar -xzf node_exporter-1.7.0.linux-amd64.tar.gz
cp node_exporter-1.7.0.linux-amd64/node_exporter /opt/exporters/node_exporter/

systemd 服务文件位置
- /etc/systemd/system/prometheus.service
- /etc/systemd/system/alertmanager.service
- /etc/systemd/system/node_exporter.service

systemd 启动配置示例(Prometheus)

# /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
After=network.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/opt/prometheus/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --web.listen-address=:9090
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动与验证(示例命令)

systemctl daemon-reload
systemctl enable --now prometheus

# 预期效果:Prometheus 监听 9090
ss -lntp | grep 9090

# 查看日志(systemd)
journalctl -u prometheus -n 50 --no-pager

常见排错(示例与解释)

# 1) 端口未监听:检查进程状态与参数
systemctl status prometheus

# 2) 配置文件错误:使用 promtool 验证
/opt/prometheus/promtool check config /etc/prometheus/prometheus.yml

# 3) 权限问题:确认数据目录可写
sudo -u prometheus touch /var/lib/prometheus/.perm_test && rm -f /var/lib/prometheus/.perm_test
  • promtool check config:语法检查失败会给出具体行号,便于快速定位。
  • 权限测试:以 prometheus 用户写入文件,避免运行后报 permission denied

练习
1. 在 /opt/exporters/ 下新增 redis_exporter 目录,规划端口为 9121,并写出对应 systemd 服务文件路径。
2. 修改 Prometheus 监听端口为 19090,重启后用 ss -lntp 验证。
3. 刻意删除 /var/lib/prometheus 写权限,观察日志报错并修复权限。