PostgreSQL逻辑复制之pglogical篇(4)

后记: 在订阅者的表需要主键约束;不然检测不到冲突;是否需要主键约束当然这个也是根据需求而定。

五、场景介绍 5.1、可从多个上游服务器,做数据的聚集和合并

发布者跟订阅者的关系;一个发布者可以被多个订阅者订阅。多个发布者可以被同一个订阅者订阅。

数据库版本IP数据库角色
psql (PostgreSQL) 9.6.0   192.168.1.221   lottu   provider1  
psql (PostgreSQL) 9.6.0   192.168.1.221   lottu02   provider2  
psql (PostgreSQL) 10.5   192.168.1.235   lottu   subscriber  

为了加以区分;我们定制SQL提示符;例如

lottu=# \set PROMPT1 '%`echo provider1=`' provider1=

5.1.1、创建测试表

# 每个节点创建测试表; 订阅者创建的表可以无主键;若订阅者有主键,可利用序列自增来解决冲突。(例如:本例是两个发布者,则发布者1可取奇数;发布者二可取偶数)。若无主键;数据不受影响。 provider1=create table tbl_lottu05(id int primary key,name text); CREATE TABLE provider1=CREATE SEQUENCE seq_lottu05_id INCREMENT BY 2 START WITH 1; CREATE SEQUENCE provider2=create table tbl_lottu05(id int primary key,name text); CREATE TABLE provider2=CREATE SEQUENCE seq_lottu05_id INCREMENT BY 2 START WITH 2; CREATE SEQUENCE subscriber=create table tbl_lottu05(id int primary key,name text); CREATE TABLE

5.1.2、搭建模拟场景

更多介绍查看第三节;或者查考《PostgreSQL 逻辑复制文档 (pglogical 文档 )》

# provider 节点1 provider1=SELECT pglogical.create_node(node_name := 'provider1', dsn := 'host=192.168.1.221 port=5432 dbname=lottu'); create_node ------------- 2976894835 provider1=select pglogical.replication_set_add_table( set_name := 'default', relation := 'tbl_lottu05',synchronize_data := true); replication_set_add_table --------------------------- t # provider 节点2 provider2=SELECT pglogical.create_node(node_name := 'provider2', dsn := 'host=192.168.1.221 port=5432 dbname=lottu02'); create_node ------------- 1828187473 provider2=select pglogical.replication_set_add_table( set_name := 'default', relation := 'tbl_lottu05',synchronize_data := true); replication_set_add_table --------------------------- t # subscriber 节点 subscriber=SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=192.168.1.235 port=5432 dbname=lottu'); create_node ------------- 2941155235 subscriber=SELECT pglogical.create_subscription(subscription_name := 'subscription1', provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu'); create_subscription --------------------- 1763399739 subscriber=SELECT pglogical.create_subscription(subscription_name := 'subscription2', provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu02'); create_subscription --------------------- 1871150101

5.1.3、插入数据验证

provider1=insert into tbl_lottu05 select nextval('seq_lottu05_id'),'lottu' || generate_series(1,10,2); INSERT 0 5 provider2=insert into tbl_lottu05 select nextval('seq_lottu05_id'),'lottu' || generate_series(1,10,2); INSERT 0 5 subscriber=select * from tbl_lottu05; id | name ----+-------- 1 | lottu1 3 | lottu3 5 | lottu5 7 | lottu7 9 | lottu9 2 | lottu1 4 | lottu3 6 | lottu5 8 | lottu7 10 | lottu9 (10 rows)

5.2、数据库版本升级

pglogical 对 PostgreSQL 版本升级是一个很实用的工具。能实现以几乎为零的停机时间迁移和升级PostgreSQL。局限性在于pglogical支持的 PostgreSQL 版本。
本例简单模拟下pglogical 对 PostgreSQL 版本升级;忽略插件、存储空间、表空间、以及业务SQL和自定义函数创建。

数据库版本IP数据库角色
psql (PostgreSQL) 9.6.0   192.168.1.221   lottu   provider  
psql (PostgreSQL) 10.5   192.168.1.235   lottu   subscriber  
5.2.1、新建升级数据库

以一个全新的数据库进行操作

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d77f3980474f4ca9c39118dbf55906e5.html