1 場(chǎng)景
- 中臺(tái)的各個(gè)中心劃分較細(xì)违帆,主數(shù)據(jù)在用戶、渠道金蜀、會(huì)員刷后、商品這些中心,業(yè)務(wù)流程數(shù)據(jù)在支付渊抄、交易尝胆、庫(kù)存、結(jié)算等中心护桦,跨中心進(jìn)行數(shù)據(jù)查詢頻繁使用feign調(diào)用的方式太過笨重含衔。
2 方案
- 搭建一個(gè)數(shù)據(jù)中心,通過pgsql-11提供的邏輯復(fù)制功能,實(shí)現(xiàn)各個(gè)業(yè)務(wù)中心的表數(shù)據(jù)實(shí)時(shí)同步到數(shù)據(jù)中心贪染,再由數(shù)據(jù)中心多表聯(lián)查提供對(duì)外的服務(wù)能力缓呛,也常用于讀寫分離,高可用的場(chǎng)景杭隙。
- 本文基于開發(fā)環(huán)境進(jìn)行演示記錄强经,生產(chǎn)環(huán)境RDS類似。
- 官方文檔:https://www.postgresql.org/docs/devel/logical-replication.html
3 兩臺(tái)pgsql的搭建和基本配置
使用docker-compose部署業(yè)務(wù)和數(shù)據(jù)兩個(gè)數(shù)據(jù)庫(kù)
-
在/home下新建pgsql-item/,pgsql-data/兩個(gè)文件夾寺渗,兩個(gè)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"
可以使用數(shù)據(jù)卷掛在data文件夾,這里掛到當(dāng)前目錄下為了方便修改配置文件
-
發(fā)布端配置
vim /home/pgsql-item/data/postgresql.conf
wal_level = logical #開啟邏輯復(fù)制模式 max_replication_slots = 20 #該配置項(xiàng)表示發(fā)布端最多可以發(fā)布多個(gè)Publication max_wal_senders =40 #一般設(shè)置為max_replication_slots的2倍
-
訂閱端配置
vim /home/pgsql-data/data/postgresql.conf
wal_level = logical #開啟邏輯復(fù)制模式 max_replication_slots=20 #訂閱端也需要配置該配置項(xiàng)兰迫,不能小于需要訂閱的數(shù)量 max_logical_replication_workers=20 #訂閱端可以配置多個(gè)訂閱 max_worker_processes=22 #最少為max_logical_replication_workers+1信殊。
-
重啟兩臺(tái)pgsql
docker restart pgsql-item pgsql-data
4 數(shù)據(jù)庫(kù)訂閱同步
pgsql-item創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)channel-center,3張表cc_store,cc_store_sku,cc_area
-
pgsql-data創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)data-center汁果,使用navicat數(shù)據(jù)傳輸工具同步2張表結(jié)構(gòu)cc_store涡拘,cc_store_sku
發(fā)布節(jié)點(diǎn)和訂閱節(jié)點(diǎn)表的模式名、表名必須一致据德。
-
發(fā)布端
-- 創(chuàng)建發(fā)布 create publication channel_center_pub for table cc_store,cc_store_sku; -- 發(fā)布端常用命令 select * from pg_publication ; #查看發(fā)布者列表 select * from pg_stat_replication; #查看邏輯復(fù)制的狀態(tài) select * from pg_publication_tables; #查看發(fā)布者發(fā)布了哪些數(shù)據(jù)表
-
訂閱端
-- 創(chuàng)建訂閱 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; #查看訂閱者狀態(tài)
驗(yàn)證下鳄乏,在業(yè)務(wù)中心表的增刪改,金融級(jí)響應(yīng)速度同步到數(shù)據(jù)中心對(duì)應(yīng)的表
5 一些場(chǎng)景操作
-
業(yè)務(wù)中心表結(jié)構(gòu)發(fā)生變更棘利,字段新增橱野、字段刪除、建立索引等操作善玫,會(huì)使訂閱失效
處理方法:使用navicat結(jié)構(gòu)同步工具水援,同步表更的表到數(shù)據(jù)中心,保持兩端表結(jié)構(gòu)一致茅郎,訂閱即可恢復(fù)正常蜗元。
-
一個(gè)發(fā)布修改發(fā)布的數(shù)據(jù)表,例如channel_center_pub的發(fā)布中2張表變更為3張表
發(fā)布端修改發(fā)布:alter publication channel_center_pub set table cc_store,cc_store_sku,cc_area;
訂閱端刷新訂閱:alter subscription channel_center_sub refresh publication;