PostgreSQL逻辑复制之pglogical篇

一、pglogical介绍

pglogical 是 PostgreSQL 的拓展模块, 为 PostgreSQL 数据库提供了逻辑流复制发布和订阅的功能。 pglogical 重用了 BDR 项目中的一部分相关技术。pglogical 是一个完全作为PostgreSQL 扩展实现的逻辑复制系统。完全集成,它不需要触发器或外部程序。这种物理复制的替代方法是使用发布/订阅模型复制数据以进行选择性复制的一种高效方法。支持 PG10、9.6、9.5、9.4 ,提供比 Slony、Bucardo 或 Londiste 更快的复制速度,以及跨版本升级。
我们使用的下列术语来描述节点和数据流之间的关系,重用了一些早期的 Slony 技术中的术语:

节点 - PostgreSQL 数据库实例

发布者和订阅者 - 节点的角色名称

复制集 - 关系表的集合

pglogical 是新技术组件,使用了最新的 PostgreSQL 数据库中的一些核心功能,所以存在一些数据库版本限制:

数据源发布和订阅节点需要运行 PostgreSQL 9.4 +

复制源过滤和冲突检测需要 PostgreSQL 9.5 +

支持的使用场景:

主版本数据库之间的升级(存在上述的版本限制)

完整的数据库复制

利用复制集,选择性的筛选的关系表

可从多个上游服务器,做数据的聚集和合并

二、安装操作

本节介绍了pglogical 扩展模块复制的基本用法。
下载地址,安装步骤

tar -zxvf pglogical-REL2_2_0.tar.gz cd pglogical-REL2_2_0 . /home/postgres/.bash_profile pg_config USE_PGXS=1 make clean USE_PGXS=1 make USE_PGXS=1 make install

首先 PostgreSQL服务器必须正确配置才能够支持逻辑解码︰

wal_level = 'logical' # one per database needed on (provider/subscriber)provider node max_worker_processes = 10 # one per node needed on provider node max_replication_slots = 10 # one per node needed on provider node max_wal_senders = 10 shared_preload_libraries = 'pglogical'

如果你想要处理解决与上一次/第一次更新之间的冲突 wins(参阅冲突章节), 你的数据库版本需要为PostgreSQL 9.5+ (在9.4中无效) 您可以向 PostgreSQL.conf 添加此额外的选项:

# needed for last/first update wins conflict resolution property available in Postgre track_commit_timestamp = on

pg_hba.conf 需要配置成允许从本地主机复制,用户拥有有复制权限,连接权限;并重启数据库服务

host replication postgres 网段ip/24 trust

在所有节点上所对应数据库安装pglogical拓展模块:

CREATE EXTENSION pglogical;

三、pglogical复制配置

现有实验环境

数据库版本IP角色
psql (PostgreSQL) 9.6.0   192.168.1.221   provider  
psql (PostgreSQL) 10.5   192.168.1.235   subscriber  
3.1、时间同步

服务器时间同步(主备库都需操作)

echo "*/20 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null" >> /var/spool/cron/root

3.2、提供者节点配置 1、创建节点

在一个数据库里创建提供者节点

# 创建节点 SELECT pglogical.create_node( node_name := 'provider1', dsn := 'host=192.168.1.221 port=5432 dbname=lottu' );

2、创建复制集

将public架构中的所有表添加到default复制集中

SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);

复制集default的表都必需要primary key

3.3、订阅者节点配置 1、创建节点

在另一个数据库创建订阅者节点

SELECT pglogical.create_node( node_name := 'subscriber1', dsn := 'host=192.168.1.235 port=5432 dbname=lottu' );

2、创建订阅

订阅提供者节点,该订阅将在后台启动同步和复制过程

SELECT pglogical.create_subscription( subscription_name := 'subscription1', provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu' );

3.4、验证复制

前面我们已经完成安装/配置 pglogical 操作。

1、创建测试表

create table tbl_lottu01(id int primary key, name text, reg_time timestamp);

由于需要验证insert/update/delete/truncate操作是否同步;所以创建的表要有主键。当然只对发布者必须要主键约束。

2、添加测试数据

lottu=# insert into tbl_lottu01 select generate_series(1,10000),'lottu',now(); INSERT 0 10000

3、将表添加对应的复制集

对新建的表;并没有为其分配对应的复制集;需要手动添加。当然可以利用触发器自动添加;后续补充。

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

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