openGauss发布订阅支持基础数据同步设计评审纪要
会议时间:2022.5.6 16:00-17:45
与会人:熊小军 彭炯 吴岳川 陈琛 陈晓滨 李恒 胡正超 王小兵 彭煜玮
特性需求来源:openGauss 3.0.0新增了发布订阅特性,支持逻辑复制创建订阅之后插入的数据,但并不支持复制表的基础数据。
总体方案(详细方案可见附件):
[cid:image002.png@01D8618C.98A670B0]
1. 全量复制快照确定:创建复制槽时根据HISTORIC快照生成普通MVCC快照,其中snapshotcsn取HISTORIC快照的xip数组中最大的csn,并返回给订阅端,后续增量复制阶段过滤掉小于该csn的事务,以此达到数据不重不漏的目标。
2. 新增系统表pg_subscription_rel:记录每个订阅中每个被复制表的状态
3. 创建订阅流程变更:新增往pg_subscription_rel添加订阅表的步骤,方式是向发布端发送sql,查询发布端发布的所有表信息,插入到系统表中。
4. 基础数据复制流程:
[cid:image001.png@01D8618A.98E18FD0]
5. WalSender改造:上述2、3是基于walsender具备执行SQL语句的能力,如copy命令和查询发布表,因此WalSender改造为走常规的PostgresMain流程,具体为如果是流复制命令,则依然走WalSndLoop,如果是普通的SQL查询,则调exec_simple_query处理。
6. subscription新增语法:create subscription新增copy_data和connect选项,alter subscription新增refresh publication语法。
遗留问题:
1. 新增了系统表pg_subscription_rel,但openGauss的syscache已满
2. 全量复制过程中可能存在数据不一致,原因是存在这种场景:表1在做全量复制,而表2在做增量复制,此时多表查询结果不一致
3. WalSender打印的信息,订阅端如何正确处理,可否用SPI接口执行命令。
4. 创建订阅时不存在connect为false的使用场景,可以选择不添加
5. 后续是否有计划逻辑解码支持DDL,如果有就不需要fresh,并确认下fresh是否能正确识别发布表的删除
6. PG的基础数据复制性能摸底
7. 后续需要输出博客,介绍发布订阅的使用流程
8. 考虑双向订阅的场景下基础数据复制是否有重复问题
9. 修改了WalSender流程,测试应考虑物理复制和逻辑复制场景