搭建一个数据中心,通过pgsql-11提供的逻辑复制功能,实现各个业务中心的表数据实时同步到数据中心,再由数据中心多表联查提供对外的服务能力,也常用于读写分离,高可用的场景。
本文基于开发环境进行演示记录,生产环境RDS类似。
官方文档:
www.postgresql.org/docs/devel/…
3 两台pgsql的搭建和基本配置
使用docker-compose部署业务和数据两个数据库
在/home下新建pgsql-item/,pgsql-data/两个文件夹,两个docker-compose.yml文件如下:
version: "3"
services:
postgres:
image: postgres:11-alpine
container_name: pgsql-item
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 123456
MAX_CONNECTIONS: 2000
TZ: Asia/Shanghai
volumes:
- ./data:/var/lib/postgresql/data
ports:
- "15432:5432"
version: "3"
services:
postgres:
image: postgres:11-alpine
container_name: pgsql-data
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 123456
MAX_CONNECTIONS: 2000
TZ: Asia/Shanghai
volumes:
- ./data:/var/lib/postgresql/data
ports:
- "15433:5432"
可以使用数据卷挂在data文件夹,这里挂到当前目录下为了方便修改配置文件
发布端配置
vim /home/pgsql-item/data/postgresql.conf
wal_level = logical #开启逻辑复制模式
max_replication_slots = 20 #该配置项表示发布端最多可以发布多个Publication
max_wal_senders =40 #一般设置为max_replication_slots的2倍
订阅端配置
vim /home/pgsql-data/data/postgresql.conf
wal_level = logical #开启逻辑复制模式
max_replication_slots=20 #订阅端也需要配置该配置项,不能小于需要订阅的数量
max_logical_replication_workers=20 #订阅端可以配置多个订阅
max_worker_processes=22 #最少为max_logical_replication_workers+1。
重启两台pgsql
docker restart pgsql-item pgsql-data
4 数据库订阅同步
pgsql-item创建一个数据库channel-center,3张表cc_store,cc_store_sku,cc_area
pgsql-data创建一个数据库data-center,使用navicat数据传输工具同步2张表结构cc_store,cc_store_sku
发布节点和订阅节点表的模式名、表名必须一致。
create publication channel_center_pub for table cc_store,cc_store_sku;
select * from pg_publication ; #查看发布者列表
select * from pg_stat_replication; #查看逻辑复制的状态
select * from pg_publication_tables; #查看发布者发布了哪些数据表
create subscription channel_center_sub connection 'host=192.168.31.167 port=15432 user=postgres password=devops dbname=channel_center' publication channel_center_pub;
select * from pg_subscription; #查看订阅者列表
select * from pg_stat_subscription; #查看订阅者状态
验证下,在业务中心表的增删改,金融级响应速度同步到数据中心对应的表
5 一些场景操作
业务中心表结构发生变更,字段新增、字段删除、建立索引等操作,会使订阅失效
处理方法:使用navicat结构同步工具,同步表更的表到数据中心,保持两端表结构一致,订阅即可恢复正常。
一个发布修改发布的数据表,例如channel_center_pub的发布中2张表变更为3张表
发布端修改发布:alter publication channel_center_pub set table cc_store,cc_store_sku,cc_area;
订阅端刷新订阅:alter subscription channel_center_sub refresh publication;