找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3241

积分

0

好友

415

主题
发表于 2026-2-11 10:21:43 | 查看: 39| 回复: 0

Prometheus Logo

本文档将手把手指导你,如何利用 Docker Compose 这一利器,将 Prometheus 监控生态的核心组件(包括 Grafana、MySQL、Node Exporter、MySQL Exporter 及 Alertmanager)一键编排部署。实现从主机到数据库的全面指标采集、可视化展示以及告警通知。所有组件容器化运行,既保证了环境的一致性,也极大地简化了部署流程,非常适合测试环境快速搭建,也为生产环境的基础架构提供了可靠的起点(生产部署需额外考虑高可用与数据备份策略)。

部署环境要求为 CentOS 7.x(兼容主流 Linux 发行版),并已安装 Docker 20.10+ 和 Docker Compose 2.0+。

二、环境预处理

2.1 安装 Docker 及 Docker Compose

首先需要安装必要的依赖工具,确保 Docker 服务正常运行,为后续的容器编排打下坚实基础。

# 卸载系统原有旧版 Docker
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 安装 Docker 依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 配置 Docker 官方 YUM 源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker CE 版本
yum install -y docker-ce docker-ce-cli containerd.io

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

# 安装 Docker Compose(二进制方式,适配 Linux x86_64 架构)
curl -SL https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

# 赋予执行权限
chmod +x /usr/local/bin/docker-compose

# 验证安装结果
docker --version  # 输出 Docker 版本信息即正常
docker-compose --version  # 输出 Docker Compose 版本信息即正常

2.2 创建统一部署目录

为了避免配置文件和数据分散各处,我们创建一个统一的目录结构,方便配置持久化和后续维护,同时也能有效避免因容器销毁而导致配置丢失的问题。

# 创建部署根目录
mkdir -p /opt/prometheus-stack
cd /opt/prometheus-stack

# 创建各组件专属目录(配置、数据分离)
mkdir -p prometheus/{config,rules}  # Prometheus 主配置及告警规则目录
mkdir -p grafana/data              # Grafana 数据持久化目录(面板、用户配置)
mkdir -p alertmanager/config       # Alertmanager 告警配置目录
mkdir -p mysql/data                # MySQL 数据持久化目录

# 赋予目录读写权限(解决容器内权限不足导致的启动失败问题)
chmod -R 777 /opt/prometheus-stack

2.3 端口规划说明

提前规划好各组件的端口,可以避免潜在的端口冲突。宿主机需要开放以下端口,以便外部访问及组件间通信:

组件名称 容器内部端口 宿主机映射端口 用途
Prometheus 9090 9090 核心监控服务、UI 访问、指标抓取
Grafana 3000 3000 可视化面板访问
MySQL 3306 3306 数据库服务访问
Node Exporter 9100 9100 宿主机指标采集暴露
MySQL Exporter 9104 9104 MySQL 指标采集暴露
Alertmanager 9093 9093 告警管理、通知推送

提示:如果宿主机上已有服务占用了上述端口,可以在后续的 Docker Compose 配置文件中调整端口映射(格式:宿主机端口:容器端口)。

三、编写 Docker Compose 编排文件

/opt/prometheus-stack 目录下创建 docker-compose.yml 文件。这个文件将整合所有组件的容器配置,通过定义依赖关系来控制启动顺序,最终实现一键启停所有服务。

version: '3.8' # 兼容 Docker Compose 2.0+ 版本

services:
  # MySQL 服务:提供数据库环境,为 MySQL Exporter 提供采集目标
  mysql:
    image: mysql:8.0.33 # 选用稳定版镜像,避免版本兼容问题
    container_name: mysql
    restart: always # 容器异常退出后自动重启
    environment:
      MYSQL_ROOT_PASSWORD: MySQL@123456 # 根用户密码(建议生产环境修改为强密码)
      MYSQL_USER: exporter # 为 MySQL Exporter 创建专用采集用户
      MYSQL_PASSWORD: Exporter@123456 # 采集用户密码
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql # 数据持久化,避免容器删除丢失数据
    networks:
      - prometheus-network # 加入自定义网络,实现组件间隔离通信
    command: --default-authentication-plugin=mysql_native_password # 兼容旧版认证,避免 Exporter 连接失败

  # Node Exporter:采集宿主机 CPU、内存、磁盘、网络等资源指标
  node-exporter:
    image: prom/node-exporter:v1.7.0
    container_name: node-exporter
    restart: always
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro # 只读挂载宿主机 proc 目录,采集系统信息
      - /sys:/host/sys:ro # 只读挂载宿主机 sys 目录,采集硬件信息
      - /:/rootfs:ro # 只读挂载宿主机根目录,采集磁盘信息
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)' # 忽略无用挂载点,减少指标冗余
    networks:
      - prometheus-network

  # MySQL Exporter:采集 MySQL 连接数、查询量、表空间等指标
  mysql-exporter:
    image: prom/mysqld-exporter:v0.15.1
    container_name: mysql-exporter
    restart: always
    ports:
      - "9104:9104"
    environment:
      # 配置 MySQL 连接信息,通过容器名实现组件间通信(无需依赖宿主机 IP)
      DATA_SOURCE_NAME: "exporter:Exporter@123456@(mysql:3306)/"
    depends_on:
      - mysql # 依赖 MySQL 服务,确保 MySQL 启动后再启动 Exporter
    networks:
      - prometheus-network

  # Prometheus:核心监控服务,抓取 Exporter 指标、评估告警规则、推送告警至 Alertmanager
  prometheus:
    image: prom/prometheus:v2.45.3
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml # 主配置文件挂载
      - ./prometheus/rules/alert_rules.yml:/etc/prometheus/alert_rules.yml # 告警规则文件挂载
      - ./prometheus/data:/prometheus # 监控数据持久化
    command:
      - '--config.file=/etc/prometheus/prometheus.yml' # 指定配置文件路径
      - '--storage.tsdb.path=/prometheus' # 指定数据存储路径
      - '--web.enable-lifecycle' # 开启配置热加载,无需重启容器即可生效配置
    depends_on:
      - node-exporter
      - mysql-exporter # 依赖两个 Exporter,确保指标源就绪
    networks:
      - prometheus-network

  # Grafana:可视化面板,对接 Prometheus 数据,生成直观监控图表
  grafana:
    image: grafana/grafana:10.1.2
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - ./grafana/data:/var/lib/grafana # 持久化面板配置、用户信息
    environment:
      GF_SECURITY_ADMIN_PASSWORD: Grafana@123456 # Grafana 管理员密码(首次登录使用)
      GF_USERS_ALLOW_SIGN_UP: "false" # 禁止新用户注册,提升安全性
    depends_on:
      - prometheus # 依赖 Prometheus,确保数据源就绪
    networks:
      - prometheus-network

  # Alertmanager:接收 Prometheus 告警,通过配置的渠道推送通知(本文以邮件为例)
  alertmanager:
    image: prom/alertmanager:v0.26.0
    container_name: alertmanager
    restart: always
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager/config/alertmanager.yml:/etc/alertmanager/alertmanager.yml # 告警配置挂载
      - ./alertmanager/data:/alertmanager # 告警历史数据持久化
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'
    depends_on:
      - prometheus # 依赖 Prometheus,确保告警源就绪
    networks:
      - prometheus-network

# 自定义桥接网络:实现组件间通信隔离,避免与宿主机其他容器冲突
networks:
  prometheus-network:
    driver: bridge

四、编写各组件核心配置文件

Docker Compose 文件定义了容器如何运行,我们还需要单独编写各组件的核心功能配置文件。所有配置文件都挂载到宿主机的目录中,方便修改和维护。

4.1 Prometheus 配置文件(prometheus.yml)

这个文件定义了指标抓取规则、关联的告警规则文件以及 Alertmanager 的地址,确保 Prometheus 能正常抓取数据并触发告警。

global:
  scrape_interval: 15s # 全局指标抓取间隔,默认 15 秒,可根据需求调整
  evaluation_interval: 15s # 告警规则评估间隔,与抓取间隔保持一致即可

# 关联 Alertmanager:指定告警推送目标地址
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093 # 通过容器名通信,无需修改为宿主机 IP

# 关联告警规则文件:指定告警规则存储路径(与 Docker Compose 挂载路径一致)
rule_files:
  - "alert_rules.yml"

# 指标抓取配置:对接 Node Exporter、MySQL Exporter 及自身
scrape_configs:
  # 监控 Prometheus 自身运行状态
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # 监控宿主机:对接 Node Exporter
  - job_name: 'node'
    static_configs:
      - targets: ['node-exporter:9100'] # Node Exporter 容器地址
    scrape_interval: 10s # 单独缩短宿主机指标抓取间隔,提升监控实时性

  # 监控 MySQL:对接 MySQL Exporter
  - job_name: 'mysql'
    static_configs:
      - targets: ['mysql-exporter:9104'] # MySQL Exporter 容器地址
    scrape_interval: 10s # 数据库指标高频采集,及时发现异常

将上述内容保存至 /opt/prometheus-stack/prometheus/config/prometheus.yml。YAML 格式对缩进敏感,请确保使用 2 个空格进行缩进。

4.2 Prometheus 告警规则文件(alert_rules.yml)

这里定义了告警触发的具体条件、级别和描述信息,涵盖了主机和 MySQL 的核心监控场景,你可以根据实际业务需求进行扩展。

groups:
  - name: 主机监控告警
    rules:
      # 主机 CPU 使用率过高告警:超过 80% 且持续 2 分钟触发,避免瞬时峰值误告警
      - alert: 主机CPU使用率过高
        expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 80
        for: 2m
        labels:
          severity: critical # 告警级别(critical:紧急;warning:警告;info:提示)
        annotations:
          summary: "主机 {{ $labels.instance }} CPU 使用率过高"
          description: "主机 {{ $labels.instance }} CPU 使用率已超过 80%,当前值:{{ $value | round 2 }}%,持续时间超过 2 分钟,请及时排查。"

      # 主机内存使用率过高告警:超过 85% 且持续 2 分钟触发
      - alert: 主机内存使用率过高
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "主机 {{ $labels.instance }} 内存使用率过高"
          description: "主机 {{ $labels.instance }} 内存使用率已超过 85%,当前值:{{ $value | round 2 }}%,持续时间超过 2 分钟,可能导致服务卡顿。"

      # 主机磁盘使用率过高告警:根目录使用率超过 90% 触发
      - alert: 主机磁盘使用率过高
        expr: (1 - (node_filesystem_avail_bytes{mountpoint="/rootfs"} / node_filesystem_size_bytes{mountpoint="/rootfs"})) * 100 > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "主机 {{ $labels.instance }} 磁盘使用率过高"
          description: "主机 {{ $labels.instance }} 根目录磁盘使用率已超过 90%,当前值:{{ $value | round 2 }}%,请及时清理存储空间。"

  - name: MySQL监控告警
    rules:
      # MySQL 服务不可用告警:Exporter 无法采集数据,持续 1 分钟触发
      - alert: MySQL服务不可用
        expr: up{job="mysql"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "MySQL 服务 {{ $labels.instance }} 不可用"
          description: "MySQL 服务已停止运行或 MySQL Exporter 采集失败,持续 1 分钟未恢复,请检查数据库及 Exporter 状态。"

      # MySQL 连接数过高告警:连接数超过 100 且持续 1 分钟触发
      - alert: MySQL连接数过高
        expr: mysql_connections > 100
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "MySQL {{ $labels.instance }} 连接数过高"
          description: "MySQL 当前连接数:{{ $value }},已超过阈值 100,持续时间超过 1 分钟,可能存在连接泄露或访问峰值。"

      # MySQL 慢查询过多告警:慢查询数超过 5 个触发
      - alert: MySQL慢查询过多
        expr: mysql_slow_queries > 5
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "MySQL {{ $labels.instance }} 慢查询过多"
          description: "MySQL 当前慢查询数:{{ $value }},已超过阈值 5 个,持续时间超过 1 分钟,请优化慢查询语句。"

将上述内容保存至 /opt/prometheus-stack/prometheus/rules/alert_rules.yml。修改规则时,建议先在 Prometheus 的 UI 中测试表达式是否能正常查询到指标。

4.3 Alertmanager 告警配置文件(alertmanager.yml)

这个文件定义了告警通知的渠道(本文以邮件为例)、告警分组和重复通知策略,避免告警信息轰炸。

global:
  resolve_timeout: 5m # 告警恢复后,等待 5 分钟发送恢复通知,避免瞬时恢复误通知
  # 邮件服务器配置(需替换为实际邮箱信息,以下以 163 邮箱为例)
  smtp_smarthost: 'smtp.163.com:465' # 邮箱 SMTP 服务器地址及 SSL 端口
  smtp_from: 'your_email@163.com' # 发件人邮箱地址
  smtp_auth_username: 'your_email@163.com' # 发件人邮箱账号
  smtp_auth_password: 'your_auth_code' # 邮箱授权码(非登录密码,需在邮箱后台开启)
  smtp_require_tls: false # 关闭 TLS 验证,避免连接失败
  smtp_hello: '163.com'

# 告警路由规则:决定告警如何分发至接收渠道
route:
  group_by: ['alertname', 'severity'] # 按告警名称、级别分组,同组告警合并发送
  group_wait: 10s # 同组告警等待 10 秒,避免瞬间多告警重复推送
  group_interval: 10s # 同组告警间隔 10 秒再次推送(未恢复时)
  repeat_interval: 1h # 同一告警重复推送间隔(1 小时,避免轰炸)
  receiver: 'email-notify' # 默认告警接收渠道

# 告警接收者配置:定义邮件接收人信息
receivers:
  - name: 'email-notify'
    email_configs:
      - to: 'target_email@qq.com,target_email2@163.com' # 收件人邮箱(多个用逗号分隔)
        send_resolved: true # 开启告警恢复通知,便于知晓问题已解决

# 告警抑制规则:避免重复告警(紧急告警触发时,抑制同实例下的警告告警)
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'instance'] # 按告警名称、实例维度抑制

配置说明

  • 邮箱授权码获取:登录你的邮箱,进入设置,开启 POP3/SMTP 服务,然后生成授权码(不同邮箱的操作路径可能略有差异)。
  • 其他渠道:除了邮件,Alertmanager 还支持钉钉、企业微信、Slack 等通知渠道,你可以根据实际需求替换相关配置。

将上述内容保存至 /opt/prometheus-stack/alertmanager/config/alertmanager.yml

五、启动服务并验证

5.1 启动所有组件

/opt/prometheus-stack 目录下执行命令,Docker Compose 会根据依赖关系自动启动所有容器。

# 后台启动服务(-d 表示后台运行)
docker-compose up -d

# 查看容器运行状态
docker-compose ps

# 排查启动故障(实时查看所有容器日志)
docker-compose logs -f
# 单独查看某组件日志(如 Prometheus)
docker-compose logs -f prometheus

正常情况下,所有容器的状态都应为“Up”。如果某个容器状态是“Exit”,就需要通过日志来定位问题,常见原因包括配置文件语法错误、目录权限不足或端口冲突。

5.2 组件可用性验证

我们需要逐一验证各个组件是否正常运行。

  1. Prometheus 验证:访问 http://宿主机IP:9090,进入 UI 界面 -> 点击顶部「Status -> Targets」-> 确认 prometheus、node、mysql 三个 Job 的状态均为「UP」,这表示指标抓取正常。
  2. Node Exporter 验证:访问 http://宿主机IP:9100/metrics,页面会显示大量宿主机指标数据(如 node_cpu_seconds_total),出现即正常。
  3. MySQL Exporter 验证:访问 http://宿主机IP:9104/metrics,页面显示大量 MySQL 指标数据(如 mysql_connections)即正常。
  4. Alertmanager 验证:访问 http://宿主机IP:9093,进入 UI 界面,可查看告警历史及当前状态。
  5. Grafana 验证:访问 http://宿主机IP:3000,使用账号 admin、密码 Grafana@123456 登录,登录成功即表示服务正常。

5.3 Grafana 可视化配置

成功登录 Grafana 后,需要添加数据源并导入监控面板。

5.3.1 添加 Prometheus 数据源

  1. 登录 Grafana -> 点击左侧菜单栏「设置(齿轮图标)-> Data sources -> Add data source」。
  2. 搜索并选择「Prometheus」-> 在「HTTP -> URL」中输入 http://prometheus:9090(这是容器内部的通信地址)。
  3. 点击底部「Save & test」,出现「Data source is working」提示即配置成功。

5.3.2 导入预置监控面板

无需自己从头创建图表,Grafana 社区提供了丰富的预置面板,直接导入即可使用。

  1. 点击左侧菜单栏「+ -> Import」。
  2. 输入面板 ID 并导入:
    • 宿主机监控面板(Node Exporter):ID 1860(官方推荐,覆盖 CPU、内存、磁盘等核心指标)。
    • MySQL 监控面板:ID 7362(支持连接数、慢查询、表空间等指标展示)。
  3. 选择我们刚刚添加的 Prometheus 数据源 -> 点击「Import」,面板会自动生成并展示数据。

5.4 告警功能验证

我们可以手动模拟一个告警场景,来验证整个告警链路是否通畅。

  1. 登录 Prometheus UI -> 点击顶部「Alerts」,查看所有告警规则状态(默认应为「Inactive」,表示没有告警触发)。
  2. 模拟主机 CPU 使用率过高:在宿主机执行 stress -c 4(需要先安装 stress 工具:yum install -y stress),持续运行 2 分钟后,观察对应告警规则的状态应变为「Firing」(触发中)。
  3. 查看 Alertmanager UI:确认告警已被接收,状态同样为「Firing」。
  4. 检查收件邮箱:此时你应该会收到告警邮件,其中包含告警摘要、描述及当前值。停止 stress 命令(按 Ctrl+C),等待大约 5 分钟后,你会收到另一封告警恢复的邮件。

如果告警没有正常推送,请依次排查:Prometheus 告警规则是否触发、Alertmanager 配置文件是否正确、邮箱服务器网络是否通畅。

六、常用操作与维护

6.1 核心操作命令

# 启动所有服务
docker-compose up -d

# 停止所有服务(保留容器及数据)
docker-compose stop

# 停止并删除所有容器(保留数据卷)
docker-compose down

# 重启所有服务
docker-compose restart

# 热加载 Prometheus 配置(修改配置后无需重启容器)
curl -X POST http://宿主机IP:9090/-/reload

# 热加载 Alertmanager 配置
curl -X POST http://宿主机IP:9093/-/reload

# 查看容器资源占用情况
docker stats

6.2 数据备份策略

生产环境中,定期备份核心数据至关重要。

  • MySQL 数据:备份 /opt/prometheus-stack/mysql/data 目录。
  • Prometheus 监控数据:备份 /opt/prometheus-stack/prometheus/data 目录。
  • Grafana 面板配置:备份 /opt/prometheus-stack/grafana/data 目录。

建议通过 crontab 设置定时任务,编写备份脚本将数据备份到异地存储。

6.3 注意事项

  • 密码安全:配置文件中的密码(MySQL、Grafana、邮箱授权码)建议使用环境变量或加密存储,避免明文暴露。生产环境务必修改为强密码并定期更换。
  • 权限控制:宿主机目录权限建议细化(避免 777 权限),根据容器内运行的用户身份来调整目录权限,以提升安全性。
  • 性能优化:根据监控目标的规模,适当调整 scrape_interval(抓取间隔)。大规模监控场景下,可以适当延长间隔,避免 Prometheus 占用过多系统资源。
  • 高可用:生产环境应考虑部署 Prometheus 集群、Alertmanager 集群,并搭配 Grafana 多实例,以避免单点故障。
  • 版本兼容:各组件版本需匹配(本文使用的版本组合经过测试,相对稳定)。升级版本前,务必先验证兼容性,避免配置失效或功能异常。

七、问题排查指南

  • 容器启动失败:查看日志 docker-compose logs -f 组件名,重点排查配置文件语法错误(YAML 缩进、关键字拼写)、端口冲突、目录权限。
  • Prometheus 目标状态为 Down:检查对应的 Exporter 容器是否正常运行、组件间网络是否连通(可进入 Prometheus 容器 ping 对应 Exporter 的容器名)、Exporter 的端口是否正常暴露。
  • Grafana 无数据展示:检查 Prometheus 数据源配置的 URL 是否正确、Prometheus 是否能正常抓取到对应指标、面板的查询表达式是否匹配当前的指标名称。
  • 告警无法推送:检查 Alertmanager 配置文件语法、邮箱授权码是否正确、宿主机网络是否能正常访问邮箱的 SMTP 服务器(可通过 telnet smtp.163.com 465 命令测试网络连通性)。

点赞动图

箭头动图

至此,一个功能完整的 Prometheus 监控栈就已经部署完成了。从主机资源到数据库性能,再到灵活的可视化和及时的告警通知,这个方案为你的系统提供了一层可靠的“观察层”。如果你在部署过程中遇到其他问题,或者想深入了解 云原生 监控的更多高级特性,欢迎在云栈社区与大家交流探讨。




上一篇:从DNS解析到Go网络模型:一个HTTP请求的完整后端处理流程与源码解析
下一篇:聊透xxl-job定时调度原理:秒级循环、快慢线程池与MySQL分布式锁
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 10:26 , Processed in 0.690523 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表