PostgreSQL码农集散地

PostgreSQL数据回环的另一解决方案——bilogical

一、前言

在上一篇文章中,我们了解到了当PostgreSQL的版本低于16的时候,搭建多主复制,如果不加各种手段去限制的话,会出现数据回环的场景。

如果正在进行数据回环的表上面没有唯一约束,最坏的情况就是耗光磁盘容量,如果存在主键或者唯一约束的情况下,应该会一直报错,感兴趣的朋友可以自己动手搭着玩玩。

文章链接:搭建一个多主复制数据回环场景

二、多主复制的场景

我注意到有些朋友不是很能理解多主复制的场景,或者觉得多主复制其实并没有多少意义。

这个就看个人怎么理解了,这里我胡诌一个场景,就是多数据中心。虚构一个夸张的场景,记得前不久,有个游戏破圈了,叫绝地潜兵 还是啥啥啥的,破圈的那部分游戏内容大概是保卫多个大城市不被外星人占领来着,里面有上海还有纽约还有别的地方来着。这都不重要,我们只要记住有上海、还有纽约两个地方就好了。

现在有一家跨国大企业,业务遍布上海和纽约,两个地方建有数据中心,然后数据库使用的是PostgreSQL,纽约有纽约的数据库,上海有上海对应的数据库,搭建着双向复制,在数据库上层部署着分布式应用,平常的时候两个地方都是就近处理业务逻辑。比如上海的客户进行了相关业务操作更新的数据库会经过逻辑复制到远端纽约的数据库中,纽约的业务也是同理会同步到上海这边的数据库中。

然后有一天外星人入侵了,外星战舰一炮把纽约的数据中心给炸掉了,分布式应用在经过各种判断之后,发现无法连上纽约的数据库中心,所以将连接调整至上海的数据中心,这样子在纽约的客户还是可以正常进行业务操作,应用并没有因为数据中心炸了而无法正常运行,就是延迟会明显了些,毕竟这里实际的物理距离摆在这。

(瞎诌的场景,别太在意这里面的不合理~)

三、bilogical

回到正题,今天要解决低于16版本PostgreSQL的多主复制的数据回环问题。

这边要请出今天的主角bilogical,这个插件是我们团队暨openHalo、monetdb_fdw之后,推出的第三个开源项目(好像不止第三个,还有个数据迁移的工具来着,在另一个github账号上)。

它的作用就是前言所述的问题,欢迎大家的使用和测试,项目地址:https://github.com/HaloTech-Co-Ltd/bilogical。

废话不多说,继续按照昨天的简单演示一下,当然数据库版本,相关环境依旧没有发生变化。

编译就不说了,就是拉取代码,make && make install即可

  • 初始化数据目录
  • 修改配置文件,和昨天相比就是在多了个shared_preload_libraries = 'bilogical'
-- 会话一wal_level = logicalmax_replication_slots = 10max_wal_senders = 10listen_addresses = '*'logging_collector = on log_min_messages = infoshared_preload_libraries = 'bilogical'
-- 会话二wal_level = logicalmax_replication_slots = 10max_wal_senders = 10listen_addresses = '*'logging_collector = on log_min_messages = infoport=1921shared_preload_libraries = 'bilogical'
  • 创建数据库 为了方便区分数据名不一致
-- 会话一create database logical_demo_publisher;-- 会话二create database my_subscriber_db;
  • 会话一、会话二分别创建表products
CREATE TABLE products (    name TEXT NOT NULL,    category TEXT,    price DECIMAL(10, 2) NOT NULL,    stock_quantity INT DEFAULT 0,    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,    description TEXT,    is_active BOOLEAN DEFAULT TRUE);
  • 会话一 CREATE PUBLICATION 且执行pg_create_logical_replication_slot

和上篇文章相比多了调用pg_create_logical_replication_slot这一步动作,且必须要指定bilogical

CREATE PUBLICATION my_publication FOR TABLE products;-- 此处非常重要SELECT pg_create_logical_replication_slot('lrs_subbib', 'bilogical'); -- 需要指定bilogical

此时会话一的运行结果如下:

Image
  • 会话二 CREATE SUBSCRIPTION
CREATE SUBSCRIPTION my_subscription    CONNECTION 'host=127.0.0.1 port=5432 user=zxm dbname=logical_demo_publisher'    PUBLICATION my_publication    WITH (create_slot = false, slot_name = 'lrs_subbib');
会话二运行结果如图:
Image

逻辑复制搭建完成,接下来搭建双向复制。

  • 会话二 CREATE PUBLICATION 且执行pg_create_logical_replication_slot

和上篇文章相比多了调用pg_create_logical_replication_slot这一步动作,且必须要指定bilogical

CREATE PUBLICATION my_publication2 FOR TABLE products;SELECT pg_create_logical_replication_slot('lrs_subbia', 'bilogical');
  • 会话一执行 CREATE SUBSCRIPTION
CREATE SUBSCRIPTION my_subscription2    CONNECTION 'host=127.0.0.1 port=1921 user=zxm dbname=my_subscriber_db'    PUBLICATION my_publication2    WITH (create_slot = false, slot_name = 'lrs_subbia');
  • 最后简单验证一下,会话一会话二分别插入数据验证

最终总体的运行结果如下

Image

可以看到没有发生数据回环的情况。

四、声明

若文中存在错误或不当之处,敬请指出,以便我进行修正和完善。希望这篇文章能够帮助到各位。

文章转载请联系,谢谢合作~

其他文章推荐
搭建一个多主复制数据回环场景
在PostgreSQL中,你不仅可以看到Bad Apple,还可以看故人唱跳、rap、打篮球的名场面
简单聊聊PostgreSQL中的多态伪类型
外国CTO也感兴趣的开源数据库项目——openHalo
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
玩一玩系列——玩玩login_hook(一款即将停止维护的PostgreSQL登录插件)
玩一玩系列——玩玩pg_mooncake(PostgreSQL的高性能列存新贵)
玩一玩系列——玩玩pg_duckdb
玩一玩系列——玩玩postgres_fdw
玩一玩系列——玩玩pg_dirtyread
惯性思维不可取 (看懂PostgreSQL where子句中表达式的先后执行顺序)
打破认知幻像:你写的SQL是否如你心意?
聊聊pg_bulkload的大概的实现逻辑
换一种角度理解PostgreSQL的search_path
PostgreSQL——关于autocommit功能的实现
PostgreSQL——关于临时表的二三事
让PostgreSQL拥抱全局临时表功能
Oracle、PostgreSQL、羲和(Halo)数据库中的的IN、OUT 和 INOUT参数模式