Postgres 中基于时间的保留策略

主要观点:介绍了三种在 Postgres 中实现保留策略的方法,包括使用pg_cron进行定时删除、使用pg_partman进行基于分区的保留以及自己实现基于分区的解决方案,并比较了它们的优缺点和适用场景。

关键信息:

  • Sequin:是一个 Postgres CDC 工具,可像 Kafka、SQS、HTTP 端点等一样进行流和队列操作,构建事件驱动工作流是其常见用例,需探索 Postgres 中的基于时间的保留策略。
  • 使用pg_cron:是 Postgres 的一个用于运行 cron 作业的扩展,可用于定期删除表中的旧数据,基本设置为启用扩展并创建 cron 作业,高级设置可创建存储过程以减少锁定问题,监控可通过cron.job_run_details表进行,但其可能存在无法跟上写量或影响性能的问题,但在 Postgres 17 中表现较好。
  • 使用pg_partman:是一个用于创建和管理分区的 Postgres 扩展,通过分区来执行保留策略更高效,设置包括创建分区表、初始化pg_partman、更新配置等,需注意默认表的使用和相关权衡,其性能可预测且能通过pg_jobmon进行监控。
  • 自己实现:可在应用层保持保留逻辑,避免pg_partman的复杂性,以 Elixir 为例展示了实现方式,包括创建管理分区的模块和后台工作者,可控制保留逻辑并管理迁移,但drop partition操作有风险。

重要细节:

  • pg_cron删除数据时会创建“死元组”,需由自动清理进程处理,基本 bench 测试在 Postgres 17 上每 5 分钟批量删除 100M 写入量的数据无问题。
  • pg_partman设置包括创建分区表、初始化扩展、更新配置等,需注意默认表的使用和相关权衡,如对于超出保留窗口的未来时间桶的行处理较复杂。
  • 自己实现的解决方案中,通过MyApp.Partitions模块管理分区,后台工作者MyApp.PartitionMaintenanceWorker根据保留策略创建和删除分区。

选择保留策略时,建议从简单的pg_cron开始,若要更高效可使用pg_partman,自己实现则可完全控制保留逻辑但有风险,且需将 cron 系统的统计信息纳入监控。

阅读 43
0 条评论