基于postgresql11逻辑复制实现业务中心和数据中心数据订阅同步方案

1 场景

  • 中台的各个中心划分较细,主数据在用户、渠道、会员、商品这些中心,业务流程数据在支付、交易、库存、结算等中心,跨中心进行数据查询频繁使用feign调用的方式太过笨重。

2 方案

  • 搭建一个数据中心,通过pgsql-11提供的逻辑复制功能,实现各个业务中心的表数据实时同步到数据中心,再由数据中心多表联查提供对外的服务能力,也常用于读写分离,高可用的场景。
  • 本文基于开发环境进行演示记录,生产环境RDS类似。
  • 官方文档:https://www.postgresql.org/docs/devel/logical-replication.html

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;

你可能感兴趣的:(基于postgresql11逻辑复制实现业务中心和数据中心数据订阅同步方案)