架构
订阅者会实时接收到来自发布者上到更改,订阅者会按照发布者上被提交的顺序来应用数据,只有这样任意的单一订阅中的发布的事务一致性才能得到保证。
逻辑复制是由walsender
和apply
两个进程来实现的。walsender
进程对WAL进行逻辑解码并且会加载标准的逻辑解码插件(pgoutput
),这个插件的作用是将从WAL中读取到的更改转成逻辑复制协议并且可以根据发布中的说明进行数据过滤,这些数据将通过流复制协议源源不断地传输到订阅者,订阅者会把这些更改数据映射到本地表,并且会按照发布者提交的事务顺序来应用接收到的更改数据。
apply
进程在openGauss中当前只会引发行触发器,而不会引发语句触发器。不过初始的表同步是会引发insert的行触发器和语句触发器的。
监控
我们可以在pg_stat_subscription
表中看到订阅的监控信息。每一个订阅都在这个视图上有一行数据记录。订阅上的工作者数取决于订阅的状态,可以有零个或者多个。
安全性
用于发布订阅连接的用户角色必须要具有REPLICATION
权限属性,角色的访问权限在pg_hba.conf
文件中进行配置,并且这个角色必须要具有可以登录LOGIN
权限属性。
只有当用户具有CREATE
权限后才能在数据库中创建发布。
当用户对某个表有拥有权的时候才能把表加入到发布中,当时如果要自动将所有表自动添加到发布,那么这个用户必须要拥有SYSADMIN
权限。
订阅者要创建订阅,用户必须要具有SYSADMIN
权限。
上面讲到的权限是在什么时候检查呢?只会在复制连接开始的时候被执行一次,其余时候均不会重新检查。
节点规划
节点名 | ip地址 | 端口 | 备注 |
---|---|---|---|
源节点 | 192.168.31.118 | 5432 | 作为发布端数据库节点 |
目标节点 | 192.168.31.60 | 9999 | 作为订阅端数据库节点 |
修改数据库配置
涉及到的所有配置都根据你自己的实际情况进行设置,我这里仅仅作为实现功能的演示。
发布端
如下图我们将在postgresql.conf
这个文件中更改相关的配置。文件所在路径根据你的安装实际情况不同而不同,请切换到你自己的路径下。
vim postgresql.conf
#-----------------------------------
#修改如下配置
# 必须设置为logical
wal_level = logical
# 该值必须要设置成预期至少要连接到订阅数加上保留给表同步到连接数
max_replication_slots = 8
# 该应该满足max_wal_senders >= max_replication_slots + 同时连接的物理复制槽的数量 + 1
max_wal_senders = 20
订阅端
在postgresql.conf
文件中进行配置,订阅者还要求max_replication_slots被设置。在这种情况下,它必须至少被设置为将被加入到该订阅者的订阅数。max_logical_replication_workers必须至少被设置为订阅数加上保留给表同步的连接数。
max_replication_slots = 8
max_logical_replication_workers = 4
开始设置
发布端
创建用户并设置权限
-- 创建用户
CREATE USER replicator WITH PASSWORD 'Rsc@123456';
-- 赋予登录权限
ALTER USER replicator SYSADMIN;
-- 或者 --
ALTER USER replicator REPLICATION;
ALTER USER replicator LOGIN;
编辑pg_hba.conf文件
设置允许订阅者用户连接数据库
host replication replicator 192.168.31.60/32 sha256
创建发布
-- 创建一个发布,发布所有表中的所有更改。
-- 发布名:pubtest
create publication pubtest for all tables;
订阅端
编辑pg_hba.conf文件
vim pg_hba.conf
# 在其中添加如下的配置
host replication replicator 192.168.31.118/32 sha256
创建数据库和模式
create database pub_sub_test;
\c pub_sub_test
create schema rsc;
创建订阅
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
,如此订阅创建成功。