openGauss基于逻辑复制的发布订阅实现数据实时同步(二)

在这里插入图片描述

本文承接上一篇openGauss基于逻辑复制的发布订阅实现数据实时同步(一)

架构

订阅者会实时接收到来自发布者上到更改,订阅者会按照发布者上被提交的顺序来应用数据,只有这样任意的单一订阅中的发布的事务一致性才能得到保证。

逻辑复制是由walsenderapply两个进程来实现的。walsender进程对WAL进行逻辑解码并且会加载标准的逻辑解码插件(pgoutput),这个插件的作用是将从WAL中读取到的更改转成逻辑复制协议并且可以根据发布中的说明进行数据过滤,这些数据将通过流复制协议源源不断地传输到订阅者,订阅者会把这些更改数据映射到本地表,并且会按照发布者提交的事务顺序来应用接收到的更改数据。

apply进程在openGauss中当前只会引发行触发器,而不会引发语句触发器。不过初始的表同步是会引发insert的行触发器和语句触发器的。

监控

我们可以在pg_stat_subscription表中看到订阅的监控信息。每一个订阅都在这个视图上有一行数据记录。订阅上的工作者数取决于订阅的状态,可以有零个或者多个。

安全性

用于发布订阅连接的用户角色必须要具有REPLICATION权限属性,角色的访问权限在pg_hba.conf文件中进行配置,并且这个角色必须要具有可以登录LOGIN权限属性。

只有当用户具有CREATE权限后才能在数据库中创建发布。

当用户对某个表有拥有权的时候才能把表加入到发布中,当时如果要自动将所有表自动添加到发布,那么这个用户必须要拥有SYSADMIN权限。

订阅者要创建订阅,用户必须要具有SYSADMIN权限。

上面讲到的权限是在什么时候检查呢?只会在复制连接开始的时候被执行一次,其余时候均不会重新检查。

节点规划

节点名ip地址端口备注
源节点192.168.31.1185432作为发布端数据库节点
目标节点192.168.31.609999作为订阅端数据库节点

修改数据库配置

涉及到的所有配置都根据你自己的实际情况进行设置,我这里仅仅作为实现功能的演示。

发布端

如下图我们将在postgresql.conf这个文件中更改相关的配置。文件所在路径根据你的安装实际情况不同而不同,请切换到你自己的路径下。
image.png

vim postgresql.conf

#-----------------------------------
#修改如下配置
# 必须设置为logical
wal_level = logical
# 该值必须要设置成预期至少要连接到订阅数加上保留给表同步到连接数
max_replication_slots = 8
# 该应该满足max_wal_senders >= max_replication_slots + 同时连接的物理复制槽的数量 + 1
max_wal_senders = 20 

image.png

订阅端

postgresql.conf文件中进行配置,订阅者还要求max_replication_slots被设置。在这种情况下,它必须至少被设置为将被加入到该订阅者的订阅数。max_logical_replication_workers必须至少被设置为订阅数加上保留给表同步的连接数。

max_replication_slots = 8
max_logical_replication_workers = 4

image.png

开始设置

发布端

创建用户并设置权限

-- 创建用户
CREATE USER replicator WITH PASSWORD 'Rsc@123456';
-- 赋予登录权限
ALTER USER replicator SYSADMIN;
-- 或者 --
ALTER USER replicator REPLICATION;
ALTER USER replicator LOGIN;

image.png

编辑pg_hba.conf文件

设置允许订阅者用户连接数据库

host    replication     replicator      192.168.31.60/32        sha256

image.png

创建发布

-- 创建一个发布,发布所有表中的所有更改。
-- 发布名:pubtest
create publication pubtest for all tables;

image.png

订阅端

编辑pg_hba.conf文件

vim pg_hba.conf
# 在其中添加如下的配置
host    replication     replicator      192.168.31.118/32       sha256

image.png

创建数据库和模式

create database pub_sub_test;
\c pub_sub_test
create schema rsc;

image.png

创建订阅

pub_sub_test=# CREATE SUBSCRIPTION subtest CONNECTION 'host=192.168.31.118 user=replicator dbname=pub_sub_test port=5432 password=Rsc@123456' PUBLICATION pubtest;
ERROR:  No key file subscription.key.cipher
HINT:  Please create subscription.key.cipher file with gs_guc and gs_ssh, such as :gs_ssh -c "gs_guc generate -S XXX -D $GAUSSHOME/bin -o subscription"

从上面的信息可以看到缺少了subscription.key.cipher这个文件,提示需要通过gs_ssh这个工具去创建。

gs_guc generate -S Rsc@123456 -D $GAUSSHOME/bin -o subscription

再次创建订阅,发现发布端报错:

2024-08-21 14:08:22.128 replicator pub_sub_test 192.168.31.60 543317875168 0[0:0#0]  0 [BACKEND] FATAL:  subcription should connect HA port

订阅端报错:

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

解决方案
原因是创建订阅语句中的连接信息的port参数使用了主端口5432,这就与线程池发生了冲突,故发生上面的错误,解决办法是在使用**主端口 + 1**的值作为这个连接信息的port参数的值。

CREATE SUBSCRIPTION subtest CONNECTION 'host=192.168.31.118 user=replicator dbname=pub_sub_test port=5433 password=Rsc@123456' PUBLICATION pubtest;

主端口是5432,故此这里设置成了5433,如此订阅创建成功。
image.png

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值