Home avatar

蜷缩的蜗牛

专注云原生运维

Prometheus PromQL 查询最佳实践与性能优化

PromQL 查询最佳实践与性能优化

作为一名 SRE,编写高效且可读性强的 PromQL (Prometheus Query Language) 是日常工作中不可或缺的技能。糟糕的查询不仅会导致 Dashboard 加载缓慢,甚至可能导致 Prometheus OOM (Out of Memory)。本文将总结 PromQL 的查询技巧,重点关注性能优化和代码可读性。

PostgreSQL + Pgpool + Barman WAL Streaming 到 S3 SOP

1. 背景与目标

  • 现状:生产环境使用 pgpool 管理 PostgreSQL 高可用(主从切换由 pgpool 决策)。
  • 目标:在不调整任何 PostgreSQL 或 pgpool 配置的前提下,新增 Barman,使用 WAL Streaming 持续备份到本地,并将备份仓库近实时同步到 S3;提供可操作的 SOP,支持点时间恢复(PITR)。
  • 原理要点:
    • WAL Streaming 提供低延迟、持续复制能力,适合高可用场景。
    • 将 Barman 仓库同步到 S3 提供异地冗余与时间点恢复能力。
    • 不启用 archive_command;通过流式拉取实现冗余与补齐。

2. 架构概览

  • 组件:
    • barman:拉取 WAL、管理备份与保留策略、执行 cron。
    • s3sync:周期性使用 awscli 将 Barman 仓库同步到 S3。
    • primary-watcher:连接 pgpool,查询当前 primary 节点,动态更新 barman 的连接目标,自动感知主从切换。
    • scheduler(可选):每日触发一次基线备份(base backup)。
  • 数据流:PostgreSQL 主库 → Barman(pg_receivewal 流式)→ 本地仓库 → S3 同步。
  • 约束:不修改 postgresql.conf、pgpool 配置或启用 archive_command。

架构图(Mermaid)

flowchart LR
  %% 对外应用经由 pgpool 访问数据库;Barman 直连主库做 WAL 拉取与备份,并将仓库同步到 S3;primary-watcher 通过 pgpool 感知主从切换

  subgraph Clients[业务访问层]
    APP[应用/服务]
  end

  APP -->|读写路由| PGPOOL[(pgpool)]

  subgraph DB[数据库高可用集群]
    PG_PRIMARY[(PostgreSQL 主库)] --- PG_STANDBY[(PostgreSQL 备库)]
  end

  PGPOOL -->|主库连接| PG_PRIMARY
  PGPOOL -->|只读连接| PG_STANDBY

  subgraph BackupPlane[备份平面]
    PRIMARY_WATCHER[primary-watcher\n通过 pgpool 感知主库]
    BARMAN[Barman\nWAL Streaming + Base Backup]
    LOCAL[(本地Barman仓库)]
    S3SYNC[s3sync\naws s3 sync]
    S3[(S3 Bucket/prefix)]
    SCHEDULER[scheduler\n每日基线备份]
  end

  %% 感知与更新
  PRIMARY_WATCHER -->|show pool_nodes| PGPOOL
  PRIMARY_WATCHER -->|更新 conninfo.host| BARMAN

  %% 备份与同步
  BARMAN -->|直连| PG_PRIMARY
  BARMAN --> LOCAL
  SCHEDULER -->|触发 base backup| BARMAN
  S3SYNC --> LOCAL
  S3SYNC -->|同步到云端| S3

  %% 只用于感知,不经 pgpool 进行物理复制
  classDef note fill:#fff9c4,stroke:#fbc02d,color:#8a6d3b
flowchart LR
  %% 对外应用经由 pgpool 访问数据库;Barman 直连主库做 WAL 拉取与备份,并将仓库同步到 S3;primary-watcher 通过 pgpool 感知主从切换

  subgraph Clients[业务访问层]
    APP[应用/服务]
  end

  APP -->|读写路由| PGPOOL[(pgpool)]

  subgraph DB[数据库高可用集群]
    PG_PRIMARY[(PostgreSQL 主库)] --- PG_STANDBY[(PostgreSQL 备库)]
  end

  PGPOOL -->|主库连接| PG_PRIMARY
  PGPOOL -->|只读连接| PG_STANDBY

  subgraph BackupPlane[备份平面]
    PRIMARY_WATCHER[primary-watcher\n通过 pgpool 感知主库]
    BARMAN[Barman\nWAL Streaming + Base Backup]
    LOCAL[(本地Barman仓库)]
    S3SYNC[s3sync\naws s3 sync]
    S3[(S3 Bucket/prefix)]
    SCHEDULER[scheduler\n每日基线备份]
  end

  %% 感知与更新
  PRIMARY_WATCHER -->|show pool_nodes| PGPOOL
  PRIMARY_WATCHER -->|更新 conninfo.host| BARMAN

  %% 备份与同步
  BARMAN -->|直连| PG_PRIMARY
  BARMAN --> LOCAL
  SCHEDULER -->|触发 base backup| BARMAN
  S3SYNC --> LOCAL
  S3SYNC -->|同步到云端| S3

  %% 只用于感知,不经 pgpool 进行物理复制
  classDef note fill:#fff9c4,stroke:#fbc02d,color:#8a6d3b
flowchart LR
  %% 对外应用经由 pgpool 访问数据库;Barman 直连主库做 WAL 拉取与备份,并将仓库同步到 S3;primary-watcher 通过 pgpool 感知主从切换

  subgraph Clients[业务访问层]
    APP[应用/服务]
  end

  APP -->|读写路由| PGPOOL[(pgpool)]

  subgraph DB[数据库高可用集群]
    PG_PRIMARY[(PostgreSQL 主库)] --- PG_STANDBY[(PostgreSQL 备库)]
  end

  PGPOOL -->|主库连接| PG_PRIMARY
  PGPOOL -->|只读连接| PG_STANDBY

  subgraph BackupPlane[备份平面]
    PRIMARY_WATCHER[primary-watcher\n通过 pgpool 感知主库]
    BARMAN[Barman\nWAL Streaming + Base Backup]
    LOCAL[(本地Barman仓库)]
    S3SYNC[s3sync\naws s3 sync]
    S3[(S3 Bucket/prefix)]
    SCHEDULER[scheduler\n每日基线备份]
  end

  %% 感知与更新
  PRIMARY_WATCHER -->|show pool_nodes| PGPOOL
  PRIMARY_WATCHER -->|更新 conninfo.host| BARMAN

  %% 备份与同步
  BARMAN -->|直连| PG_PRIMARY
  BARMAN --> LOCAL
  SCHEDULER -->|触发 base backup| BARMAN
  S3SYNC --> LOCAL
  S3SYNC -->|同步到云端| S3

  %% 只用于感知,不经 pgpool 进行物理复制
  classDef note fill:#fff9c4,stroke:#fbc02d,color:#8a6d3b

3. 前提条件

  • 网络:barman 容器到各 PostgreSQL 节点 5432 可达;pgpool 5432/PCP 端口可达(用于“感知”主从,不用于复制)。
  • 账号:
    • 复制用户(主库执行):

0%