主要观点:
- 未深入研究的 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 代码结构良好便于排查问题,开源特性便于发现和修复问题并提交补丁。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。