当 SIGTERM 不起作用时:一个 Postgres 之谜

主要观点:

  • 未深入研究的 bug 是最糟糕的,如 ClickPipes 团队遇到的 Postgres 逻辑复制槽创建 bug,导致客户不满和数据库稳定性风险。
  • 详细介绍了该 bug 的出现情况、排查过程及最终发现是 Postgres 自身的问题,包括在主库和只读副本上的表现及相关代码分析。
  • 提交补丁到 Postgres 邮件列表并被接受和回溯,社区成员也在解决相关问题,如添加新的等待事件和改进等待事务完成的方式。
  • 此次调查揭示了现代数据库系统表面下的深度和复杂性,开源数据库便于发现和修复问题并提交补丁。

关键信息:

  • ClickPipes 团队负责将数据从多种源迁移到 ClickHouse,之前是专注于 Postgres 的 PeerDB。
  • 逻辑复制槽用于在 Postgres 中进行变更数据捕获,ClickPipes 围绕其构建,创建槽通常需几秒但此处耗时久。
  • 遇到问题后通过各种方法排查,如查看 pg_stat_activity、使用 SQL 命令等,发现槽标记为“active”且进程不退出,删除槽困难。
  • 从客户 Postgres 提供商的支持中得到线索,发现后端在循环睡眠,找到相关函数及问题原因,如在主库和只读副本上的不同行为。
  • 提交补丁添加中断检查,Postgres 维护者接受并回溯,社区成员也在解决其他相关问题。

重要细节:

  • 在排查过程中,通过特定 SQL 语句查看相关进程信息,如SELECT pid,backend_start,xact_start,wait_event_type,wait_event,state,query FROM pg_stat_activity WHERE query LIKE '%pg_create_logical_replication_slot%' AND pid!=pg_backend_pid();等。
  • 分析 Postgres 代码中与创建复制槽相关的函数XactLockTableWait,包括其内部的锁获取和释放逻辑、等待事务完成的方式及在主库和只读副本上的差异。
  • 介绍了 Postgres 中“hot standby”的概念及相关细节,如热备实例通过接收主库的 WAL 记录来维持数据同步等。
  • 强调了 Postgres 代码结构良好便于排查问题,开源特性便于发现和修复问题并提交补丁。
阅读 13
0 条评论