Percona PostgreSQL Operator 3.1.0:把加密、读扩展和日志留存纳入集群配置

2026-09-10 25 预计阅读时间: 1 分钟
来源: percona.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

PostgreSQL 平台能否通过安全和运维评审,往往不只取决于数据库能不能启动,还取决于三个问题:静态数据是否加密、读流量能否从主库分担出去,以及故障发生后日志是否仍然可用。Percona Operator for PostgreSQL 3.1.0 正是围绕这三项能力推进:透明数据加密、逻辑副本和持久化日志都可以在自定义资源中表达。

这意味着它们不必再依赖一组分散的手工脚本或集群外配置。数据库平台团队可以把安全和运维要求放进声明式配置,并通过 Kubernetes 的审查、变更和回滚流程管理。

三项能力分别解决什么问题

1. 透明数据加密:降低静态数据暴露风险

透明数据加密的目标,是让数据库文件、表空间或底层存储中的数据在磁盘上保持加密,同时尽量不改变应用访问 PostgreSQL 的方式。应用仍然通过普通 SQL 读写,平台则负责处理静态数据保护相关配置。

这里要区分两个边界:

  • 静态数据加密不等于传输加密。客户端到 PostgreSQL 的连接仍应使用 TLS。
  • 加密不等于密钥管理。生产环境还需要明确密钥来源、轮换策略、备份恢复流程和访问权限。

因此,启用加密后,评审重点不会消失,而是会从“有没有加密”扩展到“谁能拿到密钥,以及恢复演练是否成功”。

2. 逻辑副本:把读能力从主库旁边拆出来

只依赖主库处理所有读请求,通常会让报表、搜索、数据导出等工作与在线事务争抢 CPU、内存和 I/O。逻辑副本提供了另一种拓扑:把符合需求的数据变化复制到独立实例,再将部分读取流量导向副本。

逻辑复制的价值不只是增加一个 PostgreSQL 实例,还包括更灵活的数据消费方式。例如,可以为分析型读取建立专用副本,减少长查询对主库事务延迟的影响。

但副本不是“免费的只读主库”。设计时必须关注:

  • 复制延迟是否满足业务的可接受范围;
  • 副本是否包含应用真正需要的表和数据;
  • DDL、序列、扩展和冲突处理是否符合使用场景;
  • 应用是否能容忍读到略旧的数据。

如果业务要求强一致读,不能仅仅因为有逻辑副本就把所有查询切过去。

3. 持久化日志:让问题发生后仍有证据

容器标准输出适合实时查看,却不一定足以满足审计、合规和故障分析要求。Pod 被重建、节点被替换或日志采集器短暂异常时,短期日志可能丢失。

持久化日志把日志保存周期从“Pod 还活着多久”提升为“存储和保留策略允许多久”。这让团队能够围绕日志容量、保留时间、访问权限和归档方式建立明确的运维规则。

不过,持久化日志也会带来真实成本:磁盘会增长,敏感字段可能被写入日志,日志卷还可能与数据库存储争抢节点资源。上线前应同时配置轮转、容量告警和访问控制,而不是只创建一个更大的卷。

在自定义资源中落地配置

3.1.0 的重要变化,是把这三类能力放进 Operator 管理的自定义资源模型中。下面给出一个可改造的配置示例,用于展示平台配置应如何组织。由于具体字段和层级必须以已安装的 3.1.0 CRD 为准,应用前请先用 kubectl explain 校验字段名;不要直接把示例中的占位字段带入生产环境。

apiVersion: pgv2.percona.com/v1
kind: PerconaPGCluster
metadata:
  name: finance-db
  namespace: database
spec:
  # 以下字段用于表达配置意图;请根据 3.1.0 CRD 校准实际字段名
  dataEncryption:
    enabled: true
    keyManagement: external

  logicalReplicas:
    enabled: true
    name: finance-read

  logging:
    persistent:
      enabled: true
      size: 20Gi
      retention: 14d

  instances:
    - name: primary
      replicas: 3
      dataVolumeClaimSpec:
        storageClassName: fast-ssd
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 200Gi

先检查 CRD 能否解释相关字段,再提交变更:

kubectl explain perconapgcluster.spec --recursive | less
kubectl get crd perconapgclusters.pgv2.percona.com -o yaml > perconapgcluster-crd.yaml
kubectl apply --dry-run=server -f finance-db.yaml
kubectl apply -f finance-db.yaml
kubectl -n database get perconapgcluster finance-db -o yaml

如果集群中 CRD 的实际字段名称不同,应以 CRD 和 3.1.0 文档为准重写 YAML。--dry-run=server 很适合放进 CI:它可以在真正修改集群前检查 API 服务器是否接受这份资源。

一次变更,三类验证

将这些能力声明在 CR 中,并不意味着只要 kubectl apply 成功就完成了上线。建议把验证拆成三条独立路径。

验证加密

检查 Operator 状态、数据库实例状态和密钥引用是否符合预期。还要进行一次恢复演练:在没有正确密钥或密钥权限不足时,确认系统会失败得清楚,而不是生成一个看似成功但无法读取的数据集。

验证逻辑副本

制造一条可识别的测试数据,确认它能按预期出现在副本中,并记录复制延迟。然后运行一条较重的读取查询,观察主库 CPU、I/O、事务延迟和副本延迟是否发生变化。

验证持久化日志

删除或重建一个测试 Pod,确认日志仍能从持久化位置或统一采集系统中查询。与此同时,检查日志卷使用率和轮转行为。没有容量告警的持久化日志,最终可能只是把“日志丢失”变成“磁盘写满”。

可以把基础检查写成一个简单的命令步骤:

set -euo pipefail

NS=database
CLUSTER=finance-db

kubectl -n "$NS" get perconapgcluster "$CLUSTER" -o wide
kubectl -n "$NS" get pods -l postgres-operator.crunchydata.com/cluster="$CLUSTER"
kubectl -n "$NS" get pvc
kubectl -n "$NS" get events --sort-by=.lastTimestamp | tail -n 30

标签键可能因 Operator 版本和资源实现而不同;如果第二条命令没有返回 Pod,应先查看资源 YAML 中的实际标签,再调整选择器。

上线前的工程清单

  • 确认加密覆盖范围:数据库文件、备份、日志和临时文件是否分别处理;
  • 明确密钥生命周期:创建、轮换、权限、备份和灾难恢复;
  • 为逻辑副本定义延迟阈值,并决定哪些查询允许读取旧数据;
  • 对副本的表范围、DDL 变化和扩展依赖做验证;
  • 为持久化日志设置保留周期、轮转、容量告警和访问权限;
  • kubectl explain、服务端 dry-run 和状态检查加入 CI/CD;
  • 在测试环境完成主库故障、密钥不可用、Pod 重建和日志恢复演练。

Percona Operator for PostgreSQL 3.1.0 的价值,不只是增加了三个开关,而是把数据保护、读取扩展和故障证据纳入同一套声明式管理边界。真正采用时,建议从一个非关键集群开始,用可观测性和恢复演练验证效果,再逐步推广到生产数据库。


相关推荐