1、浅析腾讯云 PG 自研特性与实践经验施博文 腾讯云数据库 内核研发工程师实践经验分享01.腾讯云 PG 近年来的一些“踩坑”经验内核自研特性介绍02.腾讯云 PG 做了哪些事情 未来与展望03.腾讯云 PG 的未来目录实践经验分享腾讯云 PG 近年来的一些“踩坑”经验实践经验分享4发布订阅复制槽被占满 问题:只建 1 个发布订阅,设置 max_sync_workers_per_subscription=1,max_replication_slots=92,发布订阅在全量同步阶段卡住(并发)。发布端报错:复制槽全部被名字叫 pg_xxx_sync_xxx 的 slot 占满订阅端报错:origi
2、n 被占满(origin 来标记逻辑复制来源)发布端报错订阅端报错实践经验分享5发布订阅复制槽被占满 原理介绍 针对表 t 的订阅,分为全量和增量两阶段:1.全量阶段:将发布端中 t 的数据 COPY 到订阅端;2.增量阶段:全量阶段结束后,解码 WAL,将关于表 t 的 WAL 解码成逻辑志,发送给订阅端;实践经验分享6发布订阅复制槽被占满 全量阶段订阅端分为以下步骤处理(省略关内容):1.apply 进程启动 table sync worker(表同步进程);2.table sync 进程在发布端创建 pg_sync_xxx slot;3.table sync 进程在订阅端创建 origi
3、n;4.全量同步(COPY)数据;5.同步完成,table sync 进程删除发布端 slot;6.apply 进程删除 origin;7.全量阶段结束,进普通逻辑复制状态(r)实践经验分享7发布订阅复制槽被占满 问题分析:个发布订阅包含多张表时,正常处理的场景如下(max_sync_workers_per_subscription=1)apply 进程视角实践经验分享8发布订阅复制槽被占满 问题分析:异常场景下,t1、t2.在 COPY 阶段出错,订阅端 origin 未被删除apply 进程视角实践经验分享9发布订阅复制槽被占满 问题分析:1.表同步阶段出错,订阅端 origin 未释放,
4、最终占满2.新启动的 table sync worker 会先在发布端创建 pg_xxx_sync_xxxxx slot,然后发现订阅端 origin 被占满,报错退出,此时发布端的 pg_xxx_sync_xxxxxx slot 并不会被删除(PG 14 特性);3.发布端 slot 被占满;4.发布端和订阅端均开始报错,发布订阅卡住,法继续进。影响版本:PG 14、15(pg_xxx_sync_xxxxxx slot 从 temporary slot 变为 permanent slot)实践经验分享10发布订阅复制槽被占满 问题修复:PG 16 已完成部分修复,分为两个 commit 提交
5、(f6c5edb、88f4883),但仍有发问题的可能社区修复:将 origin 的删除动作交由 table sync worker 完成,让其在退出前先删除 订阅端的 origin。异常修复:apply 进程择机将 table sync worker 因为异常退出留下的 origin 删掉临时规避段:订阅端 max_replication_slot 调点 实践经验分享11逻辑复制 walsender 进程卡住 背景:户在使逻辑复制时,发现 walsender 进程卡在同个位点很久(超过 1h),始终不继续向前推进 现场:perf 图显示 CPU 卡在 hash_seq_search 函数上,
6、pg_waldump 对应的 lsn 是条 drop publication 语句。rmgr:Transaction len(rec/tot):475877/475877,tx:1511906902,lsn:1F627/6ADC7DB8,prev1F627/6ADC7D80,desc:COMMIT 2022-12-08 11:22:54.989016 CST;inval msgs:catcache 45 catcache 44 catcache 47 catcache 46 catcache 47 catcache 46 catcache 47 catcache 46 后面省略很多个 catc