xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)

背景

PostgreSQL凭借友好的开源许可(类BSD开源许可),商业、创新两大价值,以及四大能力(企业级特性,兼容Oracle,TPAP混合负载能力,多模特性),在企业级开源数据库市场份额节节攀升,并蝉联2017,2018全球权威数据库评测机构db-engine的年度数据库冠军。

《中国 PostgreSQL 生态构建思考 - 安全合规、自主可控、去O战略》

如果说兼容Oracle是企业级市场的敲门砖,那么跨Oracle, PostgreSQL 的异构数据库迁移、同步能力就是连接新旧世界的桥梁。如何将Oracle的数据库以及应用平滑,有据可循的迁移到PostgreSQL,可参考阿里云ADAM产品,增量的同步到PostgreSQL可使用xDB replication server。

ADAM

xDB replicatoin server

《从人类河流文明 洞察 数据流动的重要性》

数据同步技术是数据流动的重要环节。在很多场景有非常重要的作用:

1、线上业务系统上有实时分析查询,担心影响线上数据库。使用同步技术,实时将数据同步到BI库,减少在线业务数据库的负载。

2、跨版本,跨硬件平台升级数据库版本。使用同步、增量实时同步技术,可以尽可能的减少停库、中断服务的时间。

3、构建测试系统,使用同步技术,构建与线上同样负载的实时SQL回放的测试库。

4、跨数据库平台异构迁移数据,使用异构数据库同步技术,尽可能的减少减少停库、中断服务的时间。例如oracle到postgresql的迁移。

5、多中心,多写。当业务部署在多中心时,使用多写同步技术,当一个节点出现故障时,由于数据库可以多写,所以可以尽可能减少业务中断时间。

6、写扩展。当写负载非常大时,将写分担到多个库,少量需要共享的数据通过同步方式同步到多个库。扩展整体写吞吐能力。

7、本地化数据访问,当需要经常访问外部数据源时,使用同步技术,将数据同步到本地访问,降低访问延迟。

PostgreSQL, Oracle, SQL Server, PPAS(兼容Oracle),这些产品如何实现同构,异构数据库的全量,增量实时同步?

EDB提供的xDB replication server是一款可以用于以上产品的同构、异构同步的产品。

一、xDB replication server原理

xDB replication server smr架构、组件

SMR单向复制,xDB提供pub server,用户可配置源库的发布表,pub server捕获发布表的全量,增量。sub server从pub server将全量,增量订阅到目标数据库。

xDB replication server包括三个组件:

1、xdb pub server,发布

2、xdb sub server,订阅

3、xdb console,控制台(支持命令行与GUI界面)

xDB replication server mmr架构、组件

MMR双向复制。双向复制的技术点除了SMR以外,还需要解决数据打环,数据冲突(同一条数据,同一个时间窗口被更新时,或者同一个主键值同一个时间窗口被写入时)的问题。

xDB replication server smr支持场景

Advanced Server指EDB提供的PPAS(兼容Oracle)。

1、Replication between PostgreSQL and Advanced Server databases (between products in either direction)

2、Replication from Oracle to PostgreSQL

3、Replication in either direction between Oracle and Advanced Server

4、Replication in either direction between SQL Server and PostgreSQL

5、Replication in either direction between SQL Server and Advanced Server

xDB replication server MMR支持场景

双向同步仅支持pg, ppas。

1、PostgreSQL database servers

2、PostgreSQL database servers and Advanced Servers operating in PostgreSQL compatible mode (EDB PPAS使用PG兼容模式时)

3、Advanced Servers operating in PostgreSQL compatible mode

4、Advanced Servers operating in Oracle compatible mode

同步模式支持

全量同步

snapshot,支持批量同步。

增量同步模式支持

增量同步支持两种模式:
1、wal-logged base,推荐。

2、trigger base

二、xDB replication server 使用例子

CentOS 7.X x64 为例

部署xDB pub,sub,console

pub, sub, console三个组件可以部署在任意服务器上,并且三个组件可以分开独立部署。

推荐:

1、pub部署在靠近源数据库的地方。

2、sub部署在靠近目标数据库的地方。

3、console部署在可以连通sub, pub, 数据库的地方。同时考虑到方便打开console进行同步任务的管理操作。

下面假设三个组件、以及源库、目标库都部署在一台服务器上。

部署依赖

1、安装java 1.7.0以上版本

https://www.java.com/en/download/

pic

https://www.java.com/en/download/manual.jsp#lin

pic

安装java1.7.0以上版本

wget https://javadl.oracle.com/webapps/download/AutoDL?BundleId=235716_2787e4a523244c269598db4e85c51e0c    
    
rpm -ivh AutoDL\?BundleId\=235716_2787e4a523244c269598db4e85c51e0c     

检查安装目录

rpm -ql jre1.8-1.8.0_191|grep ext    
    
/usr/java/jre1.8.0_191-amd64/lib/deploy/ffjcext.zip    
/usr/java/jre1.8.0_191-amd64/lib/desktop/icons/HighContrast/16x16/mimetypes/gnome-mime-text-x-java.png    
/usr/java/jre1.8.0_191-amd64/lib/desktop/icons/HighContrast/48x48/mimetypes/gnome-mime-text-x-java.png    
/usr/java/jre1.8.0_191-amd64/lib/desktop/icons/HighContrastInverse/16x16/mimetypes/gnome-mime-text-x-java.png    
/usr/java/jre1.8.0_191-amd64/lib/desktop/icons/HighContrastInverse/48x48/mimetypes/gnome-mime-text-x-java.png    
/usr/java/jre1.8.0_191-amd64/lib/desktop/icons/LowContrast/16x16/mimetypes/gnome-mime-text-x-java.png    
/usr/java/jre1.8.0_191-amd64/lib/desktop/icons/LowContrast/48x48/mimetypes/gnome-mime-text-x-java.png    
/usr/java/jre1.8.0_191-amd64/lib/desktop/icons/hicolor/16x16/mimetypes/gnome-mime-text-x-java.png    
/usr/java/jre1.8.0_191-amd64/lib/desktop/icons/hicolor/48x48/mimetypes/gnome-mime-text-x-java.png    
/usr/java/jre1.8.0_191-amd64/lib/ext    
/usr/java/jre1.8.0_191-amd64/lib/ext/cldrdata.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/dnsns.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/jaccess.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/jfxrt.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/localedata.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/localedata.pack    
/usr/java/jre1.8.0_191-amd64/lib/ext/meta-index    
/usr/java/jre1.8.0_191-amd64/lib/ext/nashorn.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/sunec.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/sunjce_provider.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/sunpkcs11.jar    
/usr/java/jre1.8.0_191-amd64/lib/ext/zipfs.jar    

java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

2、安装数据源java驱动

需要被迁移的数据库,需要下载对应的jdbc驱动。

https://www.enterprisedb.com/docs/en/52.0.0/MTK_Guide/EDB_Postgres_Migration_Guide_v52.0.0.1.12.html#

https://www.enterprisedb.com/advanced-downloads

pic

例如,下载PG的驱动。

wget https://jdbc.postgresql.org/download/postgresql-42.2.5.jar    

驱动拷贝到 JAVA_HOME/jre/lib/ext ,从jre的安装路径获取路径

mv postgresql-42.2.5.jar /usr/java/jre1.8.0_191-amd64/lib/ext/    

安装xdb

1、下载软件,可以选择60天试用

https://www.enterprisedb.com/software-downloads-postgres

chmod 700 xdbreplicationserver-6.2.4-1-linux-x64.run   

安装

./xdbreplicationserver-6.2.4-1-linux-x64.run --mode text  
  
  
  
Language Selection  
  
Please select the installation language  
[1] English - English  
[2] Simplified Chinese - 简体中文  
[3] Traditional Chinese - 繁体中文  
[4] Japanese - 日本語  
[5] Korean - ???  
Please choose an option [1] :   
----------------------------------------------------------------------------  
Welcome to the Postgres Plus xDB Replication Server Setup Wizard.  
  
----------------------------------------------------------------------------  
Please read the following License Agreement. You must accept the terms of this   
agreement before continuing with the installation.  
  
Press [Enter] to continue:  
  
..........  
  
  
Press [Enter] to continue:  
  
Do you accept this license? [y/n]: y  
  
----------------------------------------------------------------------------  
Please specify the directory where xDB Replication Server will be installed.  
  
Installation Directory [/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer]:   
  
----------------------------------------------------------------------------  
Select the components you want to install; clear the components you do not want   
to install. Click Next when you are ready to continue.  
  
Replication Console [Y/n] :Y   
  
Publication Server [Y/n] :Y  
  
Subscription Server [Y/n] :Y  
  
Is the selection above correct? [Y/n]: Y  
  
----------------------------------------------------------------------------  
xDB Admin User Details.  
  
Please provide admin user credentials.  
  
xDB pub、sub server以及console 之间相互认证的用户,密码  
  
Admin User [admin]:     
  
Admin Password : 密码 digoal123321    
Confirm Admin Password :  digoal123321    
  
  
pub与sub server的监听端口  
----------------------------------------------------------------------------  
Publication Server Details  
  
Please specify a port on which publication server will run.  
  
Port [9051]:   
  
----------------------------------------------------------------------------  
Subscription Server Details  
  
Please specify a port on which subscription server will run.  
  
Port [9052]:   
  
  
pub, sub server跑在哪个OS用户下面  
----------------------------------------------------------------------------  
Publication/Subscription Service Account  
  
Please provide the user name of the account under which the   
publication/subscription service will run.  
  
Operating system username [postgres]: digoal   操作系统用户名   
  
----------------------------------------------------------------------------  
Setup is now ready to begin installing xDB Replication Server on your computer.  
  
Do you want to continue? [Y/n]: Y  
  
----------------------------------------------------------------------------  
Please wait while Setup installs xDB Replication Server on your computer.  
  
 Installing xDB Replication Server  
 0% ______________ 50% ______________ 100%  
 #########################################  
  
----------------------------------------------------------------------------  
EnterpriseDB is the leading provider of value-added products and services for   
the Postgres community.  
  
Please visit our website at www.enterprisedb.com  

可以看到pub与sub server已启动

[root@pg11-test ~]# ps -ewf|grep xdb  
digoal   13289     1  0 16:58 ?        00:00:00 /bin/bash -c cd /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin; ./runPubServer.sh  >> /var/log/edb/xdbpubserver/edb-xdbpubserver.log 2>&1 &  
digoal   13375 13289  3 16:58 ?        00:00:01 /usr/bin/java -XX:-UsePerfData -Xms256m -Xmx1536m -XX:ErrorFile=/var/log/xdb-6.2/pubserver_pid_%p.log -Djava.library.path=/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin -Djava.awt.headless=true -jar /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin/edb-repserver.jar pubserver 9051  
digoal   13469     1  0 16:58 ?        00:00:00 /bin/bash -c cd /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin; ./runSubServer.sh  >> /var/log/edb/xdbsubserver/edb-xdbsubserver.log 2>&1 &  
digoal   13551 13469  4 16:58 ?        00:00:01 /usr/bin/java -XX:-UsePerfData -XX:ErrorFile=/var/log/xdb-6.2/subserver_pid_%p.log -Djava.awt.headless=true -jar /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin/edb-repserver.jar subserver 9052  

xDB安装的软件目录内容

# cd /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin  
  
[root@pg11-test bin]# ll  
total 5808  
-rwxrwxr-x 1 root root   45544 Nov 15 15:45 DataValidator.jar  
-rwxr-xr-x 1 root root    4837 Nov 15 15:47 edb_audit.sh  
-rwxr-xr-x 1 root root   30550 Nov 15 15:47 edb_bugreport.sh  
-rwxrwxr-x 1 root root 1746041 Nov 15 15:45 edb-repcli.jar  
-rwxrwxr-x 1 root root 1679061 Nov 15 15:45 edb-repconsole.jar  
-rwxrwxr-x 1 root root 2250159 Nov 15 15:45 edb-repserver.jar  
-rwxrwxr-x 1 root root   25994 Nov 15 15:45 libnativehandler.so  
-rwxrwxr-x 1 root root  129596 Nov 15 15:45 libpqjniwrapper.so  
-rwxr-xr-x 1 root root     889 Feb  3 17:08 runPubServer.sh  
-rwxr-xr-x 1 root root     531 Feb  3 17:08 runRepConsole.sh  
-rwxr-xr-x 1 root root     701 Feb  3 17:08 runSubServer.sh  
-rwxr-xr-x 1 root root     538 Feb  3 17:08 runValidation.sh  

1、控制台

java -jar ./edb-repconsole.jar  

2、pub启动脚本

runPubServer.sh  

3、sub启动脚本

runSubServer.sh  

xDB 相关配置文件

1、pub server配置文件

/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/xdb_pubserver.conf

可配置的一些性能相关项  
  
#This option represents the MTK option "-cpBatchSize" that has a default value of 8MB.  
#The user can customize the default value to optimize the data speed for Snapshot  
#that involves large datasets and enough memory on the system.  
# size in MB  
#cpBatchSize=8            
  
#This option represents the MTK option "-batchSize" that has a default value of 100 rows.  
# size in rows  
#batchSize=100  
  
#The option to import Oracle Partitioned table as a normal table in PPAS/PPSS.  
#importPartitionAsTable=false  
  
  
#It controls how many rows are fetched from the publication database in one round (network) trip. For example,  
#if there are 1000 row changes available in shadow table(s), the default fetch size will require 5 database round trips.  
#Hence using a fetch size of 500 will bring all the changes in 2 round trips. Fine tune the performance by using a fetch size  
#that conforms to the average data volume consumed by rows fetched in one round trip.   
#syncFetchSize=200  
  
#Synchronize Replication batch size. Default to 100 statements per batch.  
#syncBatchSize=100  
  
#This defines the maximum number of transactional rows that can be grouped in a single transaction set.  
#The xDB loads and processes the delta changes by fetching as many rows in memory as grouped in a single  
#transaction set. A higher value is expected to boost the performance. However increasing it to a very large  
#value might result in out of memory error, hence increase/decrease the default value in accordance with  
#the average row size (low/high).  
#txSetMaxSize=10000  
  
#This option controls the number of maximum threads used to load data from source publication tables  
#in parallel mode. The default count is 4, however depending on the target system  
#architecture specifically multi CPUs/cores one can choose to specify a custom count (normally  
#equals CPU/core count) to fully utilize the system resources.  
#syncLoadThreadLimit=4  
  
#It defines the upper limit for number of (WAL) entries that can be hold in the queue  
#A value of zero indicates there will be no upper limit. The default is set to 10000.  
#walStreamQueueLimit=10000  

2、sub server配置

/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/xdb_subserver.conf

可配置的一些性能相关项  
#The option to import Oracle Partitioned table as a normal table in PPAS/PPSS.  
#importPartitionAsTable=false  
  
  
#This option controls the number of threads used to perform snapshot data migration in parallel mode.  
#The default behavior is to use a single data loader thread. However depending on the target system  
#architecture specifically multi CPUs/cores one can choose to specify a custom count (normally  
#equals CPU/core count) to fully utilize the system resources.  
#snapshotParallelLoadCount=1  

3、通用配置

/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/sysconfig/xdbReplicationServer-62.config

#!/bin/sh  
  
JAVA_EXECUTABLE_PATH="/usr/bin/java"  
JAVA_MINIMUM_VERSION=1.7  
JAVA_BITNESS_REQUIRED=64  
JAVA_HEAP_SIZE="-Xms8192m -Xmx32767m"   # 这个可以配大一点  
PUBPORT=9051  
SUBPORT=9052  

三、同步测试

1、测试目标:

PG到PG的SMR(单向同步),全量,增量,添加表,多个SUB,PUB对,修改表结构。几个功能点的测试。

2、测试环境

pub , sub server xdb console, 源db, 目标db 使用同一台服务器。(仅测试)

CentOS 7.x x64  
  
512G memory  
  
源, PostgreSQL 11.1  
  
127.0.0.1:8001:db1  
  
目标, PostgreSQL 11.1  
  
127.0.0.1:8001:db2  

使用wal based replication。

配置source database

1、配置postgresql.conf

wal_level = replica  
max_worker_processes = 128  
max_wal_senders = 32  
max_replication_slots = 32  
max_logical_replication_workers = 8  
max_sync_workers_per_subscription = 4  

2、配置pg_hba.conf

host all all 0.0.0.0/0 md5  
host replication all 0.0.0.0/0 md5  

3、被复制的table,(update,delete)必须有pk

4、如果需要table filter,需要设置table的REPLICA IDENTITY 为 full

5、创建源库

postgres=# create database db1;  
CREATE DATABASE  

6、用户权限

pub database 用户权限要求:

1、The database user can connect to the publication database.

2、The database user has superuser privileges.
Superuser privileges are required because the database configuration parameter
session_replication_role is altered by the database user to replica for snapshot
operations involving replication of the control schema from one publication
database to another.

3、The database user must have the ability to modify the system catalog tables
in order to disable foreign key constraints on the control schema tables
for snapshot operations involving replication of the control schema
from one publication database to another.
(See appendix Section 10.4.4 for more information on this requirement.)

create role digoal superuser login encrypted password 'digoal123321';  

配置target database

1、创建目标库

postgres=# create database db2;  
CREATE DATABASE  

2、用户权限要求

superuser

create role digoal superuser login encrypted password 'digoal123321';  

配置xdb

1、JAVA_HEAP_SIZE,建议加大

cd /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/sysconfig  
  
vi xdbReplicationServer-62.config  
  
  
  
#!/bin/sh  
  
JAVA_EXECUTABLE_PATH="/usr/bin/java"  
JAVA_MINIMUM_VERSION=1.7  
JAVA_BITNESS_REQUIRED=64  
JAVA_HEAP_SIZE="-Xms4096m -Xmx16384m"  
PUBPORT=9051  
SUBPORT=9052  

2、配置pub, sub server配置文件(可选)

/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/xdb_pubserver.conf

/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/xdb_subserver.conf

数据链路

数据同步访问链路如下:

1、xDB pub server 访问 pub database

2、xDB pub server <-相互访问-> xDB sub server

3、xDB sub server 访问 sub database

4、xDB console 访问 pub, sub, (源、目标)database

使用xDB replication console图形界面配置

为了方便控制,建议初学者开始先使用图形界面console

《Linux vnc server, vnc viewer(远程图形桌面)使用》

以下进入Linux vnc桌面操作

1、启动xDB replication console

java -jar /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin/edb-repconsole.jar  

2、注册pub server

输入pub server的连接地址,用户,密码

3、往pub server,添加用于发布的源数据库

选择数据库类型

输入源数据库的连接地址,端口,用户(超级用户),密码,数据库名(db1)

4、配置pub tables group

勾选table,一个pub group,一个slot,最多用一个核。

可以创建多个pub group,例如一张表一个。但是每个pub group会耗费一个slot, 一个replication worker,源库如下参数:

postgres=# show max_wal_senders ;  
 max_wal_senders   
-----------------  
 32  
(1 row)  
  
postgres=# show max_replication_slots ;  
 max_replication_slots   
-----------------------  
 32  
(1 row)  

如果你需要复制表的部分数据,可以配置table filter,但是要求表的REPLICA IDENTITY配置为full。

alter table tbl set REPLICA IDENTITY full;  

5、注册sub server

输入sub server的连接地址,用户,密码。

6、配置订阅目标库

pic

pic

7、创建订阅

配置pub server的连接串,点load,选中pub tables group

注意,如果目标库已经存在同名表名,则会报错

需要先DROP目标表,重新配置。

8、全量同步

9、配置增量同步计划

当pub server无增量数据后,间隔多久再重试。

10、原有pub tables group,增加新表

digoal@pg11-test-> psql  
psql (11.1)  
Type "help" for help.  
  
postgres=# \c db1  
You are now connected to database "db1" as user "postgres".  
db1=# create table test (id int primary key, info text, crt_time timestamp);  
CREATE TABLE  
  
db1=# alter table test replica identity full;  
ALTER TABLE  

sub server 对应pub p1 自动获取到新增的表

压测

digoal@pg11-test-> vi test.sql  
  
\set id random(1,100000000)  
insert into test values (:id, md5(random()::text), now()) on conflict (id) do update set info=excluded.info,crt_time=excluded.crt_time;  
  
  
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 4 -j 4 -T 120 db1  
progress: 1.0 s, 83118.1 tps, lat 0.048 ms stddev 0.023  
progress: 2.0 s, 84590.4 tps, lat 0.047 ms stddev 0.022  
progress: 3.0 s, 87808.6 tps, lat 0.046 ms stddev 0.021  
progress: 4.0 s, 84952.9 tps, lat 0.047 ms stddev 0.023  
progress: 5.0 s, 91500.0 tps, lat 0.044 ms stddev 0.023  

目标库查看数据正常同步

psql -h 127.0.0.1 -p 8000 db2  
  
db2=# select count(*) from test;  
 count    
--------  
 150389  
(1 row)  
  
....  
  
db2=# select count(*) from test;  
 count    
--------  
 393261  
(1 row)  

11、修改表结构

pic

注意ddl中,必须写全schema,否则会报没有对应的TABLE。

指定schema

alter table public.test add column c1 int default 10;  

建议先执行同步,因为会执行隐式同步,堵塞

修改完后,结构一致

源库  
  
db1=# \d+ test  
                                               Table "public.test"  
  Column  |            Type             | Collation | Nullable | Default | Storage  | Stats target | Description   
----------+-----------------------------+-----------+----------+---------+----------+--------------+-------------  
 id       | integer                     |           | not null |         | plain    |              |   
 info     | text                        |           |          |         | extended |              |   
 crt_time | timestamp without time zone |           |          |         | plain    |              |   
 c1       | integer                     |           |          | 10      | plain    |              |   
Indexes:  
    "test_pkey" PRIMARY KEY, btree (id)  
Triggers:  
    rrpt_public_test AFTER TRUNCATE ON test FOR EACH STATEMENT EXECUTE PROCEDURE _edb_replicator_pub.capturetruncateevent()  
Replica Identity: FULL  
  
  
  
目标库  
  
db2=# \d+ test  
                                               Table "public.test"  
  Column  |            Type             | Collation | Nullable | Default | Storage  | Stats target | Description   
----------+-----------------------------+-----------+----------+---------+----------+--------------+-------------  
 id       | integer                     |           | not null |         | plain    |              |   
 info     | text                        |           |          |         | extended |              |   
 crt_time | timestamp without time zone |           |          |         | plain    |              |   
 c1       | integer                     |           |          | 10      | plain    |              |   
Indexes:  
    "test_pkey" PRIMARY KEY, btree (id)  

12、增加过滤器

要增加table filter,使得目标端仅订阅复合条件的记录,需要表上设置Replica Identity: FULL

test表 Replica Identity: FULL

类似如下:

13、配置多个pub, sub对

源库:

do language plpgsql $$  
declare  
begin  
  for i in 0..7 loop   
    execute format('create table t%s (id int primary key, info text, crt_time timestamp)', i);  
  end loop;  
end;  
$$;  

配置pub

配置sub

压测,配置动态写入函数

db1=# create or replace function ins_tx(int) returns void as $$  
declare  
  suffix int := abs(mod($1,8));  
begin  
  execute format('execute ps%s(%s)', suffix, $1);   
  exception when others then  
    execute format('prepare ps%s(int) as insert into t%s values ($1, md5(random()::text), now()) on conflict (id) do update set info=excluded.info,crt_time=excluded.crt_time', suffix, suffix);   
    execute format('execute ps%s(%s)', suffix, $1);  
end;  
$$ language plpgsql strict;  
CREATE FUNCTION  

测试动态写入函数

db1=# select ins_tx(1);  
 ins_tx   
--------  
   
(1 row)  
  
db1=# select ins_tx(2);  
 ins_tx   
--------  
   
(1 row)  
  
db1=# select * from t1;  
 id |               info               |          crt_time            
----+----------------------------------+----------------------------  
  1 | 44893db346d0c599bb2c3de72a6a1b9e | 2019-02-04 15:01:27.539532  
(1 row)  
  
db1=# select * from t2;  
 id |               info               |          crt_time            
----+----------------------------------+----------------------------  
  2 | fbd92d03711c0816c02b26eda23d0b93 | 2019-02-04 15:01:28.842232  
(1 row)  

压测

vi test1.sql  
  
\set id random(1,1000000000)  
select ins_tx(:id);  
pgbench -M prepared -n -r -P 1 -f ./test1.sql -c 16 -j 16 -T 120 db1   

可以看到,8个pub,sub对,最多可以用8核,并行消费。

pic

xDB pub server使用了内置的test_decoding来处理wal logical decode。

db1=# select * from pg_get_replication_slots();  
    slot_name    |    plugin     | slot_type | datoid  | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn   
-----------------+---------------+-----------+---------+-----------+--------+------------+------+--------------+-------------+---------------------  
 xdb_1910618_570 | test_decoding | logical   | 1910618 | f         | t      |      61522 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
 xdb_1910618_568 | test_decoding | logical   | 1910618 | f         | t      |      61516 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
 xdb_1910618_582 | test_decoding | logical   | 1910618 | f         | t      |      61528 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
 xdb_1910618_566 | test_decoding | logical   | 1910618 | f         | t      |      61510 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
 xdb_1910618_562 | test_decoding | logical   | 1910618 | f         | t      |      61498 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
 xdb_1910618_584 | test_decoding | logical   | 1910618 | f         | t      |      61534 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
 xdb_1910618_6   | test_decoding | logical   | 1910618 | f         | t      |      61489 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
 xdb_1910618_564 | test_decoding | logical   | 1910618 | f         | t      |      61504 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
 xdb_1910618_586 | test_decoding | logical   | 1910618 | f         | t      |      61540 |      |   1177241672 | 51/4473DD68 | 51/4474AE00  
(9 rows)  

源库

db1=# select application_name,query from pg_stat_activity where application_name='PostgreSQL JDBC Driver';
    application_name    |                                                                                           query                                                                                           
------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL JDBC Driver | UPDATE _edb_replicator_pub.rrep_properties SET value=$1 WHERE key=$2
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | SELECT db_host,db_port,db_name,db_user,db_password,db_type,url_options FROM _edb_replicator_sub.xdb_sub_database WHERE sub_db_id=31
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | INSERT INTO _edb_replicator_pub.rrep_txset (set_id, pub_id, sub_id, status, start_rrep_sync_id, end_rrep_sync_id, last_repl_xid, last_repl_xid_timestamp) VALUES($1,$2,$3,$4,$5,$6,$7,$8)
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | SELECT 1
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | INSERT INTO _edb_replicator_pub.rrep_txset (set_id, pub_id, sub_id, status, start_rrep_sync_id, end_rrep_sync_id, last_repl_xid, last_repl_xid_timestamp) VALUES($1,$2,$3,$4,$5,$6,$7,$8)
 PostgreSQL JDBC Driver | SELECT 1
(14 rows)

源库使用流复制协议,logical decoding技术获取增量。

db1=# select * from pg_stat_replication ;
  pid  | usesysid | usename | application_name | client_addr | client_hostname | client_port |         backend_start         | backend_xmin |   state   |  sent_lsn   |  write_lsn  |  flush_lsn  | replay_lsn | write_lag | flush_lag | repl
ay_lag | sync_priority | sync_state 
-------+----------+---------+------------------+-------------+-----------------+-------------+-------------------------------+--------------+-----------+-------------+-------------+-------------+------------+-----------+-----------+-----
-------+---------------+------------
 30636 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57908 | 2019-02-05 09:06:42.379879+08 |              | streaming | 52/D3170F18 | 52/D24E5F60 | 52/D24E5F60 |            |           |           |     
       |             1 | sync
 30645 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57912 | 2019-02-05 09:06:42.463486+08 |              | streaming | 52/DA123D98 | 52/D85D4A40 | 52/D85D4A40 |            |           |           |     
       |             1 | potential
 30657 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57916 | 2019-02-05 09:06:42.513406+08 |              | streaming | 52/DAE6BF10 | 52/D717B0E8 | 52/D717B0E8 |            |           |           |     
       |             1 | potential
 30664 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57918 | 2019-02-05 09:06:42.54752+08  |              | streaming | 52/DB40FAC8 | 52/D9910E98 | 52/D9910E98 |            |           |           |     
       |             1 | potential
 30670 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57920 | 2019-02-05 09:06:42.58003+08  |              | streaming | 52/D9D004F0 | 52/D7EAC580 | 52/D7EAC580 |            |           |           |     
       |             1 | potential
 30692 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57926 | 2019-02-05 09:06:42.610619+08 |              | streaming | 52/DA37DB60 | 52/D8703390 | 52/D8703390 |            |           |           |     
       |             1 | potential
 30698 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57928 | 2019-02-05 09:06:42.637593+08 |              | streaming | 52/DAAB88E0 | 52/D8D66BD8 | 52/D8D66BD8 |            |           |           |     
       |             1 | potential
 30707 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57932 | 2019-02-05 09:06:42.660029+08 |              | streaming | 52/DB829380 | 52/D95AEB10 | 52/D95AEB10 |            |           |           |     
       |             1 | potential
 30713 |    16634 | digoal  |                  | 127.0.0.1   |                 |       57934 | 2019-02-05 09:06:42.684417+08 |              | streaming | 52/DAA15428 | 52/D8B98AA8 | 52/D8B98AA8 |            |           |           |     
       |             1 | potential
(9 rows)
db1=# insert into t1 values (-1),(-2),(-3);
INSERT 0 3

db1=# select xmin,xmax,cmin,cmax,* from t1 where id in (-1,-2,-3);
    xmin    | xmax | cmin | cmax | id | info | crt_time 
------------+------+------+------+----+------+----------
 1203620149 |    0 |    0 |    0 | -3 |      | 
 1203620149 |    0 |    0 |    0 | -2 |      | 
 1203620149 |    0 |    0 |    0 | -1 |      | 
(3 rows)

目标库

db2=# select application_name,query from pg_stat_activity ;
    application_name    |                         query                         
------------------------+-------------------------------------------------------
                        | 
                        | 
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | COMMIT
 PostgreSQL JDBC Driver | COMMIT
 psql                   | select application_name,query from pg_stat_activity ;
                        | 
                        | 
                        | 
(10 rows)

db2=# select xmin,xmax,cmin,cmax,* from t1 limit 100;
    xmin    | xmax | cmin | cmax |    id     |               info               |          crt_time          
------------+------+------+------+-----------+----------------------------------+----------------------------
 1137051069 |    0 |    0 |    0 |         1 | 44893db346d0c599bb2c3de72a6a1b9e | 2019-02-04 15:01:27.539532
 1137051074 |    0 |    0 |    0 | 761776169 | 310e9b568dd1860afd9e12c9179a5068 | 2019-02-04 15:02:45.225487
 1137051074 |    0 |    1 |    1 | 665001137 | 46b42b0d62e21373aaaeb69afd76db63 | 2019-02-04 15:02:45.227018
 1137051074 |    0 |    2 |    2 | 697990337 | 877a5ec25b68bfc44d6c837a3f75c6e5 | 2019-02-04 15:02:45.227858
 1137051074 |    0 |    3 |    3 | 109521385 | c6f1b0d41a641a75fa9c07211efa0026 | 2019-02-04 15:02:45.228195
 1137051074 |    0 |    4 |    4 | 432996345 | 6980bdea340d8b23f5d065dc71342c4a | 2019-02-04 15:02:45.228366
 1137051074 |    0 |    5 |    5 | 850543097 | 0b06d401c1a74df3f100c63f350150ea | 2019-02-04 15:02:45.228332
 1137051074 |    0 |    6 |    6 | 954130457 | 8f1fca5404f72bd6079f7f503ef9594a | 2019-02-04 15:02:45.228319
 1137051074 |    0 |    7 |    7 | 373804529 | a7750ea5faa6e69a55cf2635fc62cb76 | 2019-02-04 15:02:45.226744
 1137051074 |    0 |    8 |    8 | 722564465 | c94d25c5c54c7ca801be9706f84def70 | 2019-02-04 15:02:45.228678
 1137051074 |    0 |    9 |    9 |  97279721 | a5374504b82575952dd22c3238729467 | 2019-02-04 15:02:45.228788
 1137051074 |    0 |   10 |   10 | 312386249 | a30c971886332fdb860cb0d6ab20ed9e | 2019-02-04 15:02:45.229182
 1137051074 |    0 |   11 |   11 | 785120921 | 9e176dc1e5ef4c75d085c87572c03f04 | 2019-02-04 15:02:45.229475
 1137051074 |    0 |   12 |   12 | 326792793 | 66cf1fe49b3018f756cb7b1c2303266b | 2019-02-04 15:02:45.229535
 1137051074 |    0 |   13 |   13 | 510541273 | fafc393cfef443eb05f069d91937da9b | 2019-02-04 15:02:45.229609

关注command id字段,可以看到目标库逐条回放。

db2=# select xmin,xmax,cmin,cmax,* from t1 where id in (-1,-2,-3);
    xmin    | xmax | cmin | cmax | id | info | crt_time 
------------+------+------+------+----+------+----------
 1137058058 |    0 |    2 |    2 | -3 |      | 
 1137058058 |    0 |    1 |    1 | -2 |      | 
 1137058058 |    0 |    0 |    0 | -1 |      | 
(3 rows)

内核性能提升点(当前解析slot需要扫描所有WAL内容,例如将来可以考虑用户自定义的区分TABLE来存储WAL,减少扫描量。)(配置多个WAL GROUP,用户可以指定TABLE到对应的GROUP,解析单个表,只需要解析单个WAL GROUP的内容,减少无用功)

优化方法与schema less,空间优化等思路类似。

《PostgreSQL 时序最佳实践 - 证券交易系统数据库设计 - 阿里云RDS PostgreSQL最佳实践》

《PostgreSQL 空间切割(st_split, ST_Subdivide)功能扩展 - 空间对象网格化 (多边形GiST优化)》

《PostgreSQL 空间st_contains,st_within空间包含搜索优化 - 降IO和降CPU(bound box) (多边形GiST优化)》

小结

1、xDB replication server可用于oracle, sql server, pg, ppas的数据单向,双向 全量与增量同步。

1.1、xDB replication server smr支持场景

Advanced Server指EDB提供的PPAS(兼容Oracle)。

1、Replication between PostgreSQL and Advanced Server databases (between products in either direction)  
  
2、Replication from Oracle to PostgreSQL  
  
3、Replication in either direction between Oracle and Advanced Server  
  
4、Replication in either direction between SQL Server and PostgreSQL  
  
5、Replication in either direction between SQL Server and Advanced Server  

1.2、xDB replication server MMR支持场景

双向同步仅支持pg, ppas。

1、PostgreSQL database servers  
  
2、PostgreSQL database servers and Advanced Servers operating in PostgreSQL compatible mode (EDB PPAS使用PG兼容模式时)  
  
3、Advanced Servers operating in PostgreSQL compatible mode  
  
4、Advanced Servers operating in Oracle compatible mode  

2、本文简单描述了xDB的使用,以及PG与PG的SMR例子。

3、增量同步性能取决于网络带宽,事务大小,CPU资源,组并行度 等因素。本文测试场景,未优化的情况下,每秒约同步2万行。性能有极大提升空间。

四、附录

xDB replication console 命令行

熟悉了xDB的使用流程后,可以考虑使用console命令行来管理xDB。

[root@pg11-test bin]# java -jar ./edb-repcli.jar -help  
Usage: java -jar edb-repcli.jar [OPTIONS]  
  
Where OPTIONS include:  
-help   Prints out Replication CLI command-line usage  
-version        Prints out Replication CLI version  
-encrypt -input <file> -output <file>   Encrypts input file to output file  
-repversion -repsvrfile <file>  Prints Replication Server version  
-uptime -repsvrfile <file>      Prints the time since the Replication Server has been in running state.  
  
  
Publication:  
-addpubdb -repsvrfile <file> -dbtype {oracle | enterprisedb | postgresql | sqlserver} -dbhost <host> -dbport <port> -dbuser <user> {-dbpassword <encpassword> | dbpassfile <file>} -database {<database> | <service>} [-oraconnectiontype {sid | servicename}] [-urloptions <JDBC extended URL parameters>]  [-filterrule {publication table filter id}] [-repgrouptype {m | s}] [-initialsnapshot [-verboseSnapshotOutput {true|false}]] [-nodepriority {1 to 10}] [-replicatepubschema {true|false}] [-changesetlogmode {T|W}]  Adds publication database  
-updatepubdb -repsvrfile <file> -pubdbid <id> -dbhost <host> -dbport <port> -dbuser <user> {-dbpassword <encpassword> | dbpassfile <file>} -database {<database> | <service>} [-oraconnectiontype {sid | servicename}]  [-urloptions <JDBC extended URL parameters>] [-nodepriority {1 to 10}]       Update publication database  
-printpubdbids -repsvrfile <file>  
-printpubdbidsdetails -repsvrfile <file>  
-removepubdb -repsvrfile <file> -pubdbid <id>  
-gettablesfornewpub -repsvrfile <file> -pubdbid <id>  
-createpub <pubName> -repsvrfile <file> -pubdbid <id> -reptype {T|S} -tables <schema1>.<table1> [<schema1>.<table2>...] [-views <schema1>.<view1> [<schema1>.<view2>...]] [-tablesfilterclause <index1>:<filterName>:<clause> [<index2>:<filterName>:<clause>...]] [-viewsfilterclause <index1>:<filterName>:<clause> [<index2>:<filterName>:<clause>...]][-conflictresolution <index1>:<{E|L|N|M|C:<custom_handler>}> [<index2>:<{E|L|N|M|C:<custom_handler>}>...]] [-standbyconflictresolution <index1>:<{E|L|N|M|C:<custom_handler>}> [<index2>:<{E|L|N|M|C:<custom_handler>}>...]] [-repgrouptype {M|S}]  
-validatepubs -repsvrfile <file> -pubdbid <id> -repgrouptype {m|s}  
-printpubfilterslist <pubName> -repsvrfile <file>       Prints publication filters list  
-printpublist -repsvrfile <file> [-pubdbid <id>] [-printpubid]  Prints publications list  
-printpublishedtables <pubName> -repsvrfile <file>      Print published tables  
-removepub <pubName1> [<pubName2>...] -repsvrfile <file> -repgrouptype {m | s}  
-addtablesintopub <pubName> -repsvrfile <file> -tables <schema1>.<table1> [<schema1>.<table2>...] [-views <schema1>.<view1> [<schema1>.<view2>...]] [-tablesfilterclause <index1>:<filterName>:<clause> [<index2>:<filterName>:<clause>...]] [-viewsfilterclause <index1>:<filterName>:<clause> [<index2>:<filterName>:<clause>...]] [-conflictresolution <index1>:<{E|L|N|M|C:<custom_handler>}> [<index2>:<{E|L|N|M|C:<custom_handler>}>...]] [-standbyconflictresolution <index1>:<{E|L|N|M|C:<custom_handler>}> [<index2>:<{E|L|N|M|C:<custom_handler>}>...]] [-repgrouptype {M|S}]  
-removetablesfrompub <pubName> -repsvrfile <file> -tables <schema1>.<table1> [<schema1>.<table2>...] [-views <schema1>.<view1> [<schema1>.<view2>...]]   
-cleanrephistory -repsvrfile <file>  
-cleanrephistoryforpub <pubName> -repsvrfile <file>  
-cleanshadowhistforpub <pubName> -repsvrfile <file> [-mmrdbid <dbid1>[,<dbid2>...]]  
-confcleanupjob <pubdbid> -repsvrfile <file> {-enable {-hourly <1-12> | -daily <0-23> | -minutely <1-59> | -cronexpr <"valid cron expression"> | -weekly <Monday-Sunday> <0-23>} | -disable}  
-confschedule <subName> -repsvrfile <file> {-remove | {-jobtype {t | s} {-realtime <1-n> | -daily <0-23> <0-59> | -weekly <Mon,Tue,...,Sun> <0-23> <0-59> | -monthly <Jan,Feb,...,Dec> <1-31> <0-23> <0-59> | -cronexpr <"cronexpression">}}}  
-confschedulemmr <pubdbid> -pubname <pubname> -repsvrfile <file> {-remove | {{-realtime <1-n> | -daily <0-23> <0-59> | -weekly <Mon,Tue,...,Sun> <0-23> <0-59> | -monthly <Jan,Feb,...,Dec> <1-31> <0-23> <0-59> | -cronexpr <"cronexpression">}}}  
-printschedule {<pubName> | <subName>} -repsvrfile {<pubsvrfile> | <subsvrfile>} -repgrouptype {m | s}  
-validatepub <pubName> -repsvrfile <file> -repgrouptype {m | s}  
-dommrsnapshot <pubname> -pubhostdbid <pubdbid> -repsvrfile <file> [-verboseSnapshotOutput {true|false}]  
-replicateddl <pubname> -table <tableName> -repsvrfile <file> -ddlscriptfile <filepath>  
-printconfresolutionstrategy <pubName> -repsvrfile <file> -table <tableName>   
-updateconfresolutionstrategy <pubName> -repsvrfile <file> -table <tableName> -conflictresolution <{E|L|N|M|C}> -standbyconflictresolution <{E|L|N|M|C}> [-customhandlername <customHandlerProcName>]  
-setasmdn <pubdbid> -repsvrfile <file>   
-setascontroller <pubdbid> -repsvrfile <file>   
-printcontrollerdbid -repsvrfile <file>         Prints out Controller database id  
  
  
Subscription:  
-addsubdb -repsvrfile <file> -dbtype {oracle | enterprisedb | postgresql | sqlserver} -dbhost <host> -dbport <port> -dbuser <user> {-dbpassword <encpassword> | -dbpassfile <file>} -database {<database> | <service>}  [-urloptions <JDBC extended URL parameters>]  [-oraconnectiontype {sid | servicename}]       Adds subscription database  
-updatesubdb -repsvrfile <file> -subdbid <id> -dbhost <host> -dbport <port> -dbuser <user> {-dbpassword <encpassword> | -dbpassfile <file>} -database {<database> | <service>}  [-urloptions <JDBC extended URL parameters>]  [-oraconnectiontype {sid | servicename}]       Update subscription database  
-updatesub <subname> -subsvrfile <file> -pubsvrfile <file> -host <host> -port <port>    Update host/port of source publication server for a subscription  
-printsubdbids -repsvrfile <file>  
-printsubdbidsdetails -repsvrfile <file>  
-printmdndbid -repsvrfile <file>  
-printsublist -repsvrfile <file> -subdbid <id>  Prints subscriptions list  
-removesubdb -repsvrfile <file> -subdbid <id>  
-createsub <subname> -subdbid <id> -subsvrfile <file> -pubsvrfile <file> -pubname <pubName> -filterrule <publication table filters id(s)>  
-dosnapshot <subname> -repsvrfile <file> [-verboseSnapshotOutput {true|false}]  
-dosynchronize {<subname> | <pubname>} -repsvrfile {<subsvrfile> | <pubsvrfile>} [-repgrouptype {s|m}]  
-removesub <subname> -repsvrfile <file>  
-addfilter <pubName> -repsvrfile <file> -tables <schema1>.<table1> [<schema1>.<table2>...] [-views <schema1>.<view1> [<schema1>.<view2>...]] [-tablesfilterclause <index1>:<name>:<clause> [<index2>:<name1>:<clause>...]] [-viewsfilterclause <index1>:<name>:<clause> [<index2>:<name>:<clause>...]]  
-updatefilter <pubName> -repsvrfile <file> -tablesfilterclause <filterid>:<updatedclause> [<filterid>:<updatedclause>...]  
-removefilter <pubName> -repsvrfile <file> -filterid <filterid>  
-enablefilter -repsvrfile <file> {-dbid <id> | -subname <name>} -filterids <filterid_1> [<filterid_2>...]  
-disablefilter -repsvrfile <file> {-dbid <id> | -subname <name>} -filterids <filterid_1> [<filterid_2>...]  

重启xDB sub,pub server

digoal@pg11-test-> ps -ewf|grep xdb  
digoal   16942     1  0 Feb03 ?        00:00:00 /bin/bash -c cd /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin; ./runPubServer.sh  >> /var/log/edb/xdbpubserver/edb-xdbpubserver.log 2>&1 &  
digoal   17024 16942  0 Feb03 ?        00:03:30 /usr/bin/java -XX:-UsePerfData -Xms256m -Xmx1536m -XX:ErrorFile=/var/log/xdb-6.2/pubserver_pid_%p.log -Djava.library.path=/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin -Djava.awt.headless=true -jar /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin/edb-repserver.jar pubserver 9051  
digoal   17120     1  0 Feb03 ?        00:00:00 /bin/bash -c cd /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin; ./runSubServer.sh  >> /var/log/edb/xdbsubserver/edb-xdbsubserver.log 2>&1 &  
digoal   17202 17120  0 Feb03 ?        00:00:58 /usr/bin/java -XX:-UsePerfData -XX:ErrorFile=/var/log/xdb-6.2/subserver_pid_%p.log -Djava.awt.headless=true -jar /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin/edb-repserver.jar subserver 9052  
digoal@pg11-test-> kill 17024  
digoal@pg11-test-> ps -ewf|grep xdb  
digoal   17120     1  0 Feb03 ?        00:00:00 /bin/bash -c cd /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin; ./runSubServer.sh  >> /var/log/edb/xdbsubserver/edb-xdbsubserver.log 2>&1 &  
digoal   17202 17120  0 Feb03 ?        00:00:58 /usr/bin/java -XX:-UsePerfData -XX:ErrorFile=/var/log/xdb-6.2/subserver_pid_%p.log -Djava.awt.headless=true -jar /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin/edb-repserver.jar subserver 9052  
digoal@pg11-test-> kill 17202  
digoal@pg11-test-> ps -ewf|grep xdb  
  
  
su - digoal  
  
  
cat /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/sysconfig/xdbReplicationServer-62.config  
  
#!/bin/sh  
  
JAVA_EXECUTABLE_PATH="/usr/bin/java"  
JAVA_MINIMUM_VERSION=1.7  
JAVA_BITNESS_REQUIRED=64  
JAVA_HEAP_SIZE="-Xms4096m -Xmx16384m"  
PUBPORT=9051  
SUBPORT=9052  
  
  
cd /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin  
  
nohup ./runPubServer.sh >> /var/log/edb/xdbpubserver/edb-xdbpubserver.log 2>&1 &   
  
nohup ./runSubServer.sh  >> /var/log/edb/xdbsubserver/edb-xdbsubserver.log 2>&1 &  
  
  
digoal@pg11-test-> ps -ewf|grep xdb  
digoal    7767  7687  1 10:46 pts/8    00:00:01 /usr/bin/java -XX:-UsePerfData -Xms4096m -Xmx16384m -XX:ErrorFile=/var/log/xdb-6.2/pubserver_pid_%p.log -Djava.library.path=/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin -Djava.awt.headless=true -jar /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin/edb-repserver.jar pubserver 9051  
digoal    7981  7901  2 10:47 pts/8    00:00:01 /usr/bin/java -XX:-UsePerfData -XX:ErrorFile=/var/log/xdb-6.2/subserver_pid_%p.log -Djava.awt.headless=true -jar /opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/bin/edb-repserver.jar subserver 9052  

参考

2、《MTK使用 - PG,PPAS,oracle,mysql,ms sql,sybase 迁移到 PG, PPAS (支持跨版本升级)》

3、《Linux vnc server, vnc viewer(远程图形桌面)使用》

4、xDB 配置文件

/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/xdb_pubserver.conf

性能相关配置  
  
#This option represents the MTK option "-cpBatchSize" that has a default value of 8MB.  
#The user can customize the default value to optimize the data speed for Snapshot  
#that involves large datasets and enough memory on the system.  
# size in MB  
#cpBatchSize=8            
  
#This option represents the MTK option "-batchSize" that has a default value of 100 rows.  
# size in rows  
#batchSize=100  
  
#The option to import Oracle Partitioned table as a normal table in PPAS/PPSS.  
#importPartitionAsTable=false  
  
  
#It controls how many rows are fetched from the publication database in one round (network) trip. For example,  
#if there are 1000 row changes available in shadow table(s), the default fetch size will require 5 database round trips.  
#Hence using a fetch size of 500 will bring all the changes in 2 round trips. Fine tune the performance by using a fetch size  
#that conforms to the average data volume consumed by rows fetched in one round trip.   
#syncFetchSize=200  
  
#Synchronize Replication batch size. Default to 100 statements per batch.  
#syncBatchSize=100  
  
#This defines the maximum number of transactional rows that can be grouped in a single transaction set.  
#The xDB loads and processes the delta changes by fetching as many rows in memory as grouped in a single  
#transaction set. A higher value is expected to boost the performance. However increasing it to a very large  
#value might result in out of memory error, hence increase/decrease the default value in accordance with  
#the average row size (low/high).  
#txSetMaxSize=10000  
  
#This option controls the number of maximum threads used to load data from source publication tables  
#in parallel mode. The default count is 4, however depending on the target system  
#architecture specifically multi CPUs/cores one can choose to specify a custom count (normally  
#equals CPU/core count) to fully utilize the system resources.  
#syncLoadThreadLimit=4  
  
#It defines the upper limit for number of (WAL) entries that can be hold in the queue  
#A value of zero indicates there will be no upper limit. The default is set to 10000.  
#walStreamQueueLimit=10000  

/opt/PostgreSQL/EnterpriseDB-xDBReplicationServer/etc/xdb_subserver.conf

性能相关配置  
  
#The option to import Oracle Partitioned table as a normal table in PPAS/PPSS.  
#importPartitionAsTable=false  
  
  
#This option controls the number of threads used to perform snapshot data migration in parallel mode.  
#The default behavior is to use a single data loader thread. However depending on the target system  
#architecture specifically multi CPUs/cores one can choose to specify a custom count (normally  
#equals CPU/core count) to fully utilize the system resources.  
#snapshotParallelLoadCount=1  

PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
2月前
|
SQL 存储 关系型数据库
redo log 的执行流程?
redo log 的执行流程?
|
3天前
|
Java 应用服务中间件
解决IDEA tomcat控制台只有server日志
请注意,确保在调试或开发阶段使用更详细的日志级别(如 `DEBUG`或 `TRACE`),但在生产环境中应将其设置为更高的级别以减少日志量。
7 0
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
6天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
7天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
7天前
|
运维 Oracle 关系型数据库
Oracle日志文件:数据王国的“记事本”
【4月更文挑战第19天】Oracle日志文件是数据库稳定运行的关键,记录数据变更历史,用于恢复和故障处理。它们协调并发操作,确保数据一致性和完整性。日志文件实时写入操作信息并定期刷新到磁盘,便于数据恢复。然而,日志文件需备份和归档以保证安全性,防止数据丢失。日志文件,数据王国的“记事本”,默默守护数据安全。
|
1月前
|
存储 SQL 关系型数据库
[MySQL]事务原理之redo log,undo log
[MySQL]事务原理之redo log,undo log
|
1月前
|
SQL Oracle 关系型数据库
Oracle系列十一:PL/SQL
Oracle系列十一:PL/SQL

相关产品

  • 云原生数据库 PolarDB
  • 推荐镜像

    更多