春光微醺逐,夏日踏步至。
逻辑复制历经版本10~13四轮次的清新刚劲,14~16三轮次的细腻收敛,每轮次均蕴含独特的风味和年轮记忆,本文将介绍7个引人入胜的逻辑复制特性。
1.流式传输大事务及并行应用
大事务可能导致插槽增长,这其实可以避免。版本14之前只能在事务提交后进行解码和复制,主要是防止事务可能被中止。14提供了流式传输的功能,无需等待事务提交完成,亦可将解码后的更新传输到订阅端,这有助于减少大事务的回放延迟,带来较大的性能提升。
流式传输的特性通过订阅上设置streaming选项来实现:
ALTER SUBSCRIPTION mysub SET (streaming = on);
复制
此时通过pg_stat_activity可以观察到START_REPLICATION命令使用proto_version为2来消费大事务。
ALTER SUBSCRIPTION mysub SET (streaming = parallel);
复制
streaming选项在版本16还增加了parallel值,可不写临时文件,直接通过workers进行回放应用。
同时增加了max_parallel_apply_workers_per_subscription参数控制并行应用大事务来提升性能,此时的proto_version版本号为4。
2.使用二进制格式传输数据
从版本14开始,创建或修改订阅时可设置binary选项以二进制模式传输。binary选项默认值为false,打开binary选项后具有二进制发送和接收函数的数据类型能以二进制格式传输,速度会更快。
ALTER SUBSCRIPTION mysub SET (binary = on);
复制
binary选项在版本16还支持以二进制COPY格式同步表的初始数据。
3.两阶段提交流式传输
从版本15开始,订阅端支持通过two_phase选项启用两阶段提交,示例如下:
CREATE SUBSCRIPTION mysub WITH (two_phase = on);
复制
注意:two_phase选项只能在创建订阅时设置,不能修改,两阶段提交使用的proto_version版本号为3。
4.数据过滤选择:
从版本15开始,创建发布时可以有选择地过滤捕获感兴趣的更改,使用where命令过滤数据行,示例如下:
CREATE PUBLICATION mypub FOR TABLE tab1 WHERE (id > 100 and id <= 1000);
复制
也能过滤部分列,示例如下:
CREATE PUBLICATION mypub FOR TABLE tab1(a,b);
复制
还可以对行列进行组合,示例如下:
CREATE PUBLICATION mypub FOR TABLE tab1(a, b) WHERE (a > 0);
复制
限定指定表、模式、DML、行列值进行服务端过滤,能减少通过网络传输的数据量。
5.调控解码内存
版本13引入了名为logical_decoding_work_mem参数,用于控制逻辑复制连接(walsender)可以使用的解码内存。当工作负载涉及大事务时,默认配置的64MB可能不够,解码过程可能会溢出到磁盘,解码速度会变慢。
关注pg_stat_activity活动视图,如果walsender进程经常出现IO等待事件,在可用内存比较充足的情况下应该考虑调优logicallogical_decoding_work_mem参数,增大该值可以显著提高解码性能。
注意logical_decoding_work_mem参数虽然可以在会话级别进行设置,但并不能直接对单个 walsender进程设置。walsender进程是作为后台进程运行而非用户会话,无法直接对单个walsender进程设置,因此需要调整全局的logical_decoding_work_mem参数值。
6.标识复制来源,避免事务回环
版本16之前,某个事务从源节点被复制到目标节点后,又再次被复制回源节点,这就产生了事务回环。在16版本里设置origin选项后,可以区分复制的数据是由用户的SQL语句或流复制本身引起。
创建或修改订阅时可设置origin为none,从而避免陷入事务回环。示例如下:
ALTER SUBSCRIPTION mysub SET (origin = none);
复制
7.从standby解码
版本16还支持从standby节点创建逻辑复制插槽,允许客户端使用standby节点而不是主节点来消费WAL变更,这带来了3个好处:消除主节点复制槽磁盘增长的风险、主节点负载减轻、可防御故障转移。
以上7点展示了逻辑复制的主要特点,除此之外,逻辑复制还拥有一些其他特性,例如非唯一索引可作为复制标识、跳过冲突事务等,这些特性进一步丰富了逻辑复制的功能,使其更为灵活和强大。
本文到此结束,希望大家喜欢这个主题!