解决循环复制,逻辑复制双向订阅发布最佳实践

2023年 11月 16日 102.1k 0

适用范围

openGauss5.0 / MogDB 5.0

问题概述

逻辑复制从openGauss 3.0开始支持,但双向订阅发布下会存在循环复制的问题。

PostgreSQL 16可以区分数据变化是由用户的SQL语句或replication复制引起,在创建订阅时可设置发布端不发布replication复制源,从而避免陷入复制循环。参考语法如下:
B节点:

create subscription... publication... with(origin='none');

A节点:

create subscription... publication... with(origin='none',copy_data=false);

而openGauss 5.0也直接解决了循环复制的问题,不需要设置任何参数。

循环复制问题验证

在openGauss 5.0单机环境下使用两个不同的端口号模拟两个节点。

initdb -D pgdata1610 -W
initdb -D pgdata1620 -W

上面初始化了1610节点和1620节点,配置参数如下:

wal_level=logical
password_policy = 0
password_encryption_type = 0
port=1610/1620

pg_hba.conf文件增加如下设置:

host replication all 127.0.0.1/32 md5

同时创建repuser如下:

CREATE USER repuser REPLICATION SYSADMIN PASSWORD 'XXX';

1610节点发布数据到1620节点

1610节点创建表结构及发布

create table public.tab1(id int primary key,info varchar);

create publication mypub_in_1610 for table public.tab1;

1620节点创建表结构及订阅

create table public.tab1(id int primary key,info varchar);

create subscription mysub_in_1620
connection 'host=127.0.0.1 port=1611 user=repuser password=XXX dbname=postgres' publication mypub_in_1610 ;

注意上面的端口需要使用replication加1端口1611(1610+1),否则使用1610主端口会出现如下错误:

WARNING: apply worker could not connect to the remote server
ERROR: Failed to connect to publisher.

1620节点发布数据到1610节点

1620节点发布

create publication mypub_in_1620 for table public.tab1;

1610节点创建订阅

create subscription mysub_in_1610
connection 'host=127.0.0.1 port=1621 user=repuser password=XXX dbname=postgres' publication mypub_in_1620 ;

同样需要注意端口需要使用replication加1端口1621(1620+1)。

并且需要配置完双向订阅与发布后,再进行数据操作。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论