一、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、将表添加对应的复制集对新建的表;并没有为其分配对应的复制集;需要手动添加。当然可以利用触发器自动添加;后续补充。