Hacker News 中文摘要

RSS订阅

加速 PostgreSQL 转储/恢复快照 -- Speeding up PostgreSQL dump/restore snapshots

文章摘要

最近几个pgstream版本主要针对PostgreSQL目标优化了快照性能。本文详细介绍了关键改进措施、学到的经验以及这些改进如何显著提升性能。pgstream是一款开源的CDC(变更数据捕获)工具和库,支持PostgreSQL复制并处理DDL变更,具有复制DDL变更、模块化部署配置及支持多种目标(如PostgreSQL、Elasticsearch/Opensearch和Webhooks)等关键特性。

文章总结

文章总结

标题: 幕后故事:加速 pgstream 的 PostgreSQL 快照
作者: Esther Minano Sanz
来源: xata.io

主要内容

本文详细介绍了 pgstream 在优化 PostgreSQL 快照性能方面的改进过程。pgstream 是一个开源的 CDC(变更数据捕获)工具,支持 PostgreSQL 的 DDL 变更复制。文章从最初的实现问题出发,逐步分析了性能瓶颈,并提出了有效的解决方案。

关键点

  1. pgstream 简介

    • pgstream 是一个支持 PostgreSQL 复制的开源工具,主要功能包括:
      • DDL 变更复制:自动跟踪并复制模式变更,避免手动干预和数据丢失。
      • 模块化部署:支持简单和复杂的使用场景,可轻松集成 Kafka。
      • 快照功能:在特定时间点捕获数据库的完整视图,用于初始化目标数据库或独立使用。
      • 列转换:在复制或快照过程中修改列值,适用于数据匿名化。
  2. 初始实现的问题

    • 快照性能不如 pg_dump/pg_restore,尤其是在写入路径上存在瓶颈。
    • 读取端已经采用了高效并行模型,但写入逻辑最初设计用于低吞吐量的复制场景,不适合批量数据加载。
  3. 解决方案

    • 批量插入:测试了多种插入方法,最终选择了最快的 COPY FROM 二进制格式。
    • 延迟索引创建:借鉴 pg_dump/pg_restore 的做法,将索引和约束的创建推迟到数据加载之后,显著提高了性能。
    • 自动批量配置:将批量读取的配置从按行数改为按数据大小,使快照处理更加一致和可预测。
  4. 性能测试

    • 改进后的 pgstream 在多个数据集上的表现优于 pg_dump/pg_restore,特别是在处理大型或复杂数据库时表现出色。
  5. 结论

    • 通过优化写入策略和调整配置,pgstream 在快照性能上取得了显著提升,同时保留了逻辑复制的灵活性。

图片标记

  • Image 1
  • Image 2
  • Image 3
  • Image 4

结语

文章最后鼓励读者提供反馈和建议,并提供了相关社区链接,欢迎参与讨论和贡献代码。

评论总结

  1. 官方文档需要改进:评论1指出,官方文档缺乏关于从“冷备份”恢复的“最佳实践”指导,特别是在100GB到2TB范围内的数据库恢复过程中,顺序操作和脚本编写的错误可能导致大量时间浪费。

    • 引用1: "Finding out you did one step out of order (manually, or badly written script) halfway through the restore process can mean hours and hours of rework."(“在恢复过程中发现某一步骤顺序错误(手动或脚本编写不当)可能意味着数小时的重做。”)
    • 引用2: "Particularly in the 100-2TB range where probably most businesses lie, and backup/restore can take anywhere from 6 to 72 hours, often in less than ideal conditions."(“特别是在100GB到2TB范围内,大多数企业可能处于这个范围,备份/恢复可能需要6到72小时,通常在不理想的条件下进行。”)
  2. 希望看到更高级的技术:评论2表示,虽然现有的优化是改进,但希望看到超越标准批量插入和延迟约束模式的更高级技术,如并行工作负载和自定义压缩策略。

    • 引用1: "would love to see how pgstream handles more complex scenarios like parallel workers with partition-aware loading, or custom compression strategies for specific data types."(“希望看到pgstream如何处理更复杂的场景,如分区感知加载的并行工作负载,或特定数据类型的自定义压缩策略。”)
  3. 推荐使用pgbulkload和pgrepack:评论3推荐使用pgbulkload和pgrepack工具,前者显著缩短了大数据库的恢复时间,后者则有助于在活动系统中压缩表并回收磁盘空间。

    • 引用1: "pgbulkload has saved me so much time cold restoring large (1+ TB) databases. It went from 24-72 hours to an hour or two."(“pgbulkload大大缩短了我冷恢复大数据库(1TB以上)的时间,从24-72小时缩短到一两个小时。”)
    • 引用2: "I also recommend pgrepack to squash tables on a live system and reclaim disk space. It has saved me so much space."(“我还推荐使用pgrepack在活动系统中压缩表并回收磁盘空间,它为我节省了大量空间。”)
  4. 备份恢复的复杂性:评论4强调,即使有灾难恢复计划,也应假设增量备份无效,需要从头恢复整个数据库,并建议使用读副本作为新的主数据库。

    • 引用1: "Even if you have a DR plan you should assume your incremental backups are no good and you need to restore the whole thing from scratch."(“即使你有灾难恢复计划,也应假设增量备份无效,需要从头恢复整个数据库。”)
    • 引用2: "If things go truly south, just hope you have a read replica you can use as your new master."(“如果情况真的糟糕,只能希望有一个读副本可以作为新的主数据库。”)
  5. WAL-G的性能:评论5询问WAL-G在Postgres备份/恢复选项中的表现,但没有提供具体的使用体验或评价。

    • 引用1: "Slightly related but how does WAL-G stack up as far as backup/restoration options go for Postgres?"(“稍微相关,但WAL-G在Postgres的备份/恢复选项中表现如何?”)