文章目录
- 前言
 - 1. 环境准备
 - 1.1 环境介绍
 - 1.2 发布端参数配置
 - 1.3 订阅端参数配置
 
- 2. 逻辑复制搭建
 - 2.1 创建逻辑复制用户
 - 2.2 发布节点造测试表
 - 2.3 发布节点授权
 - 2.4 创建 PUBLICATION
 - 2.5 订阅节点
 - 2.6 添加复制表
 - 2.7 删除复制任务
 
前言
本篇文章介绍 PostgreSQL 的搭建过程,原理以及维护相关内容将在下一篇文章中介绍。
1. 环境准备
1.1 环境介绍
| 角色 | 主机名 | IP | 端口 | 数据库名 | 用户 | 版本 | 
|---|---|---|---|---|---|---|
| 发布端 | 172-16-104-7 | 172.16.104.7 | 5432 | pubdb | replc | PostgreSQL 12 | 
| 订阅端 | 172-16-104-56 | 172.16.104.56 | 5432 | subdb | replc | PostgreSQL 12 | 
操作系统:CentOS Linux release 7.8.2003 (Core)
1.2 发布端参数配置
postgresql.conf 中的设置:
# 数据库监听
listen_addresses = '*'# WAL 的等级,若要开启逻辑复制,必须设置 logical 让数据库记录逻辑解码所需的信息,所以低于该级别逻辑复制不能工作。
wal_level = logical# 数据库复制槽的数量
max_replication_slots = 8# 由于每个订阅都会占用主库一个 WAL 发送进程,因此参数设置值必须大于 max_replication_slots + 物理备库数量
max_wal_senders = 10
 
pg_hba.conf 中的设置:
host    all             replc           172.16.104.56/22        md5
 
上面这行配置的含义是,允许用户 replc 从 172.16.104.56/22 的网络上发起到本数据库的流复制连接,使用 MD5 的密码认证。
1.3 订阅端参数配置
postgresql.conf 中的设置:
# 数据库监听
listen_addresses = '*'# WAL 的等级,若要开启逻辑复制,必须设置 logical 让数据库记录逻辑解码所需的信息,所以低于该级别逻辑复制不能工作。
wal_level = logical# 数据库复制槽的数量,
max_replication_slots = 8# 设置逻辑复制进程数,应大于订阅节点的数量,并且给表同步预留一些进程数量。
max_logical_replication_workers = 10
 
2. 逻辑复制搭建
2.1 创建逻辑复制用户
在发布端创建逻辑复制专用用户:
create user replc replication login connection limit 8 password 'rep';
 
用于逻辑复制的用户,必须是 replication 角色,或是 superuser 角色。
2.2 发布节点造测试表
创建一个库专用于逻辑复制搭建测试:
postgres=# create database pubdb;
CREATE DATABASEpostgres=# \c pubdb replc;
You are now connected to database "pubdb" as user "replc".pubdb=> create table tt(id int4 primary key, name text);
CREATE TABLEpubdb=> insert into tt values (1, 'a');
INSERT 0 1
 
2.3 发布节点授权
刚才创建的逻辑复制用户,仅拥有 replication 角色权限还不够,需要授予表的只读权限:
# 要创建发布,必须要拥有该库的 create 权限
grant connect, create  on database pubdb to replc;grant usage on schema public to replc;grant select on tt to replc;
 
现在 replc 用户已经拥有 tt 测试表的只读权限。
2.4 创建 PUBLICATION
发布端创建发布任务:
create PUBLICATION pub1 FOR TABLE tt;
 
如果需要多张表,则表名间使用逗号分隔,如果需要发布所有表,将 FOR TABLE 调整为 FOR ALL TABLES 即可。查看发布任务可以使用下方 SQL:
select * from pg_publication;
 
输出的结果:
  oid  | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate 
-------+---------+----------+--------------+-----------+-----------+-----------+-------------24876 | pub1    |    24866 | f            | t         | t         | t         | t
 
- pubname:发布任务名称。
 - pubowner:指发布属组,可以和 pg_user 视图的 usesysid 相关联。
 - puballtables:是否发布数据库中所有表,
t表示发布数据库中所有已存在的表和以后新建的表。 - pubinsert:如果为 
t表示发布表中的 INSERT 操作。 - pubupdate:如果为 
t表示发布表中的 UPDATE 操作。 - pubdelete:如果为 
t表示发布表中的 DELETE 操作。 - pubtruncate:如果为 
t表示发布表中的 TRUNCATE 操作。 
2.5 订阅节点
# 创建订阅节点的库名
create database subdb;# 创建用户
create user replc replication login connection limit 8 password 'rep';# 切换至 replc
\c subdb replc# 创建表
create table tt(id int4 primary key, name text);# 创建订阅任务,注意该步骤必须使用 superuser 角色账号
create subscription sub1 connection 'host=172.16.104.7 port=5432 dbname=pubdb user=replc password=rep' PUBLICATION pub1;
 
执行结果:
subdb=# create subscription sub1 connection 'host=172.16.104.7 port=5432 dbname=pubdb user=replc password=rep' PUBLICATION pub1;
NOTICE:  created replication slot "sub1" on publisher
CREATE SUBSCRIPTION
 
此时在订阅节点可以查到订阅任务信息:
select * from pg_subscription;
 
  oid  | subdbid | subname | subowner | subenabled |                           subconninfo                            | subslotname | subsynccommit | subpublications 
-------+---------+---------+----------+------------+------------------------------------------------------------------+-------------+---------------+-----------------24887 |   24878 | sub1    |       10 | t          | host=172.16.104.7 port=5432 dbname=pubdb user=replc password=rep | sub1        | off           | {pub1}
 
创建成功后,就可以在发布端查到任务运行情况:
select * from pg_replication_slots;
 
 slot_name |  plugin  | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn 
-----------+----------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------sub1      | pgoutput | logical   |  24867 | pubdb    | f         | t      |     108314 |      |          796 | 6/7000270   | 6/70002A8
 
2.6 添加复制表
经过上面的操作,我们已经成功配置 tt 表的发布与订阅,假设此时又有新需求,再添加一张表,如何操作呢?
首先,在发布节点创建测试表:
# 创建测试表
create table t2(id int4 primary key, name text);# 写入测试数据
insert into t2 values (1, 'a'),(2, 'b'),(3, 'c');
 
将该表授权给 replc 账号:
grant select on t2 to replc;
 
将该表添加到发布列表:
ALTER PUBLICATION pub1 ADD TABLE t2;
 
查看发布任务表信息:
select * from pg_publication_tables;
 
输出:
 pubname | schemaname | tablename 
---------+------------+-----------pub1    | public     | ttpub1    | public     | t2
 
现在开始配置订阅端:
# 创建表结构
create table t2(id int4 primary key, name text);
 
订阅端执行刷新任务操作:
ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;
 
订阅端查看数据:
subdb=# select * from t2;id | name 
----+------1 | a2 | b3 | c
 
至此,表 t2 已成功添加到逻辑复制任务中。
2.7 删除复制任务
DROP SUBSCRIPTION sub1;