类似文章
OGG有传统的经典架构,也有最新的微服务,2个都可以远程捕获和应用数据,对数据库服务器是0侵入,而传统的经典架构是纯命令行模式,最新的微服务架构是图形化界面操作,几乎所有操作都可以在界面进行。相关文章可以参考:
使用OGG for MySQL微服务快速双向同步RDS数据库:https://www.xmmup.com/shiyongoggweifuwukuaisushuangxiangtongburdsshujuku.html
OGG用于跨云RDS for MySQL之间配置双主实时同步–OGG远程捕获和投递:https://www.xmmup.com/oggyongyukuayunrdszhijianpeizhishuangzhushishitongbuyuanchengbuhuohetoudi.html
otter用于跨云RDS for mysql之间配置双主实时同步:https://www.xmmup.com/otteryongyukuayunrdszhijianpeizhishuangzhushishitongbu.html
OGG用于PG数据库之间双主实时同步(RDS for PG亦可)–OGG远程捕获和投递:https://www.xmmup.com/oggyongyupgshujukuzhijianshuangzhushishitongburds-for-pgyikeoggyuanchengbuhuohetoudi.html
使用OGG for PG微服务

1-- 创建专用网络
2docker network create --subnet=172.72.6.0/24 pg-network
3
4
5-- OGG微服务
6docker pull lhrbest/ogg213mapg:v1.0
7
8docker rm -f lhrogg213mapg
9docker run -d --name lhrogg213mapg -h lhrogg213mapg \
10 --net=pg-network --ip 172.72.6.25 \
11 -p 9390:3389 -p 19000-19005:9000-9005 \
12 -v /sys/fs/cgroup:/sys/fs/cgroup \
13 --privileged=true lhrbest/ogg213mapg:v1.0 \
14 /usr/sbin/init
15
16
17
18-- PG A
19docker rm -f lhrpga
20docker run -d --name lhrpga -h lhrpga \
21 -p 64320:5432 --net=pg-network --ip 172.72.6.20 \
22 -e POSTGRES_PASSWORD=lhr \
23 -e TZ=Asia/Shanghai \
24 postgres:13.4
25
26
27-- PG B
28docker rm -f lhrpgb
29docker run -d --name lhrpgb -h lhrpgb \
30 -p 64321:5432 --net=pg-network --ip 172.72.6.21 \
31 -e POSTGRES_PASSWORD=lhr \
32 -e TZ=Asia/Shanghai \
33 postgres:13.4
34
35
36-- 2个PG库需要配置
37psql -U postgres -h 192.168.66.35 -p 64320
38psql -U postgres -h 192.168.66.35 -p 64321
39
40alter system set wal_level='logical';
41alter system set max_replication_slots = 10 ;
42
43create database lhrdb;
44\c lhrdb
45create schema ogg;
46
47docker restart lhrpga lhrpgb
48
49
50
51
52
53
54-- OGGMA
55cat > /ogg213c/ogg_ma/odbc.ini <<"EOF"
56[ODBC Data Sources]
57PGDSN1=DataDirect 13 PostgreSQL Wire Protocol
58PGDSN2=DataDirect 13 PostgreSQL Wire Protocol
59
60[ODBC]
61IANAAppCodePage=106
62InstallDir=/ogg213c/ogg_ma
63
64[PGDSN1]
65Driver=/ogg213c/ogg_ma/lib/GGpsql25.so
66#Driver=/usr/lib64/psqlodbcw.so
67Description=DataDirect 13 PostgreSQL Wire Protocol
68Database=lhrdb
69HostName=172.72.6.20
70PortNumber=5432
71LogonID=postgres
72Password=lhr
73
74[PGDSN2]
75Driver=/ogg213c/ogg_ma/lib/GGpsql25.so
76#Driver=/usr/lib64/psqlodbcw.so
77Description=DataDirect 13 PostgreSQL Wire Protocol
78Database=lhrdb
79HostName=172.72.6.21
80PortNumber=5432
81LogonID=postgres
82Password=lhr
83
84EOF复制
访问:http://192.168.66.35:19000 ,用户名:oggadmin,密码:lhr


创建身份证明

或直接访问:http://192.168.66.35:19001/



创建检查点表

由于我们要配置双主,所以,这里的PG1和PG2都需要配置检查点表,否则只在目标端配置检查点表即可。
数据初始化
首先将PGA和PGB的lhrdb库的数据初始化.
1-- pga建表并插入数据
2export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib
3
4sysbench /usr/share/sysbench/oltp_common.lua --db-driver=pgsql \
5--pgsql-host=172.72.6.20 --pgsql-port=5432 \
6--pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
7--table-size=10000 --tables=10 --threads=80 \
8--events=999999999 --time=60 prepare
9
10-- pgb只是建表,注意:table-size
11sysbench /usr/share/sysbench/oltp_common.lua --db-driver=pgsql \
12--pgsql-host=172.72.6.21 --pgsql-port=5432 \
13--pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
14--table-size=0 --tables=10 --threads=80 \
15--events=999999999 --time=60 prepare复制
当然,我们可以不使用OGG进行数据的初始化,也可以使用数据库本身的工具进行初始化,例如:
1pg_dump -d lhrdb > lhrdb.dmp
2
3psql -U postgres -d lhrdb -h 172.72.6.21 < lhrdb.dmp复制
这里演示从OGG进行数据的初始化。
添加表的TRANDATA 信息

2个库的public下的表都需要添加。
从PGA配置初始提取

参数内容:
1EXTRACT ext0
2SETENV(PGCLIENTENCODING = "UTF8")
3SETENV(ODBCINI="/ogg213c/ogg_ma/odbc.ini")
4SOURCEDB PGDSN1 USERIDALIAS PG1, DOMAIN OGGMA
5EXTFILE ./dirdat/e0 , PURGE
6TABLE public.*;复制

数据已经导出到本地。
将数据导入到PGB


参数:
1REPLICAT rep0
2SETENV(PGCLIENTENCODING = "UTF8" )
3SETENV(ODBCINI="/ogg213c/ogg_ma/odbc.ini")
4TARGETDB PGDSN2 USERIDALIAS PG2, DOMAIN OGGMA
5MAP public.*, TARGET public.*;复制


可以看到,数据都已经抽取到目标端了。

配置复制槽
在配置PostgreSQL实时同步之前,需要先配置复制槽。
1C:\Users\lhrxxt>adminclient
2Oracle GoldenGate Administration Client for Oracle
3Version 21.3.0.0.1 OGGCORE_21.3.0.0.1_PLATFORMS_211007.1817
4
5Copyright (C) 1995, 2021, Oracle and/or its affiliates. All rights reserved.
6
7Windows x64 (optimized) on Oct 7 2021 21:05:36
8Operating system character set identified as GBK.
9
10OGG (not connected) 1> CONNECT http://192.168.66.35:19001 deployment deploy213 as oggadmin password lhr
11
12OGG (http://192.168.66.35:19001 deploy213) 2> dblogin useridalias PG1 DOMAIN OGGMA
13Successfully logged into database.
14
15OGG (http://192.168.66.35:19001 deploy213 as PG1@lhrdb) 3> REGISTER EXTRACT ext1
162021-12-02T14:22:17Z INFO OGG-25355 Successfully created replication slot 'ext1_eaa1c3d574a94c47' for Extract group 'EXT1' in database 'lhrdb'.
17
18OGG (http://192.168.66.35:19001 deploy213 as PG1@lhrdb) 4> dblogin useridalias PG2 DOMAIN OGGMA
19Successfully logged into database.
20
21OGG (http://192.168.66.35:19001 deploy213 as PG2@lhrdb) 6> REGISTER EXTRACT ext2
222021-12-02T14:23:36Z INFO OGG-25355 Successfully created replication slot 'ext2_5521571981698d81' for Extract group 'EXT2' in database 'lhrdb'.
23
24OGG (http://192.168.66.35:19001 deploy213 as PG2@lhrdb) 7> info all
25Program Status Group Type Lag at Chkpt Time Since Chkpt
26
27REPLICAT RUNNING REP0 NONINTEGRATED 00:00:00 00:00:06
28
29OGG (http://192.168.66.35:19001 deploy213 as PG2@lhrdb) 8> CONNECT http://192.168.66.35:19000 deployment deploy213 as oggadmin password lhr
30
31OGG (http://192.168.66.35:19000 deploy213) 9> info all
32Program Status Group Type Lag at Chkpt Time Since Chkpt
33
34ADMINSRVR RUNNING
35DISTSRVR RUNNING
36PMSRVR RUNNING
37RECVSRVR RUNNING复制
若不配置复制槽,会报错:OGG-25374
Oracle GoldenGate Capture for PostgreSQL, EXT1.prm: The replication slot 'ext1_eaa1c3d574a94c47' for group 'EXT1' does not exist in the database 'lhrdb'.
配置PGA到PGB的实时同步
创建extract进程

若是报错:OGG-15409 Alias 'PG1' not found in credential store domain 'OracleGoldenGate'.
可以忽略,或者参考创建身份证明,在域OracleGoldenGate中创建PG1和PG2。

参数:
1extract ext1
2SETENV(PGCLIENTENCODING = "UTF8" )
3SETENV(ODBCINI="/ogg213c/ogg_ma/odbc.ini" )
4SOURCEDB PGDSN1 USERIDALIAS PG1, DOMAIN OGGMA
5exttrail ./dirdat/e1
6IGNOREREPLICATES
7TRANLOGOPTIONS FILTERTABLE ogg.ckpt
8table public.*;复制


创建replicate进程



参数:
1replicat rep1
2SETENV(PGCLIENTENCODING = "UTF8" )
3SETENV(ODBCINI="/ogg213c/ogg_ma/odbc.ini" )
4SETENV(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
5TARGETDB PGDSN2 USERIDALIAS PG2, DOMAIN OGGMA
6map public.*, target public.*;复制

配置B到A的实时同步
创建extract进程


参数:
1extract ext2
2SETENV(PGCLIENTENCODING = "UTF8" )
3SETENV(ODBCINI="/ogg213c/ogg_ma/odbc.ini" )
4SOURCEDB PGDSN2 USERIDALIAS PG2, DOMAIN OGGMA
5exttrail ./dirdat/e2
6IGNOREREPLICATES
7TRANLOGOPTIONS FILTERTABLE ogg.ckpt
8table public.*;复制

创建replicate进程

参数:
1replicat rep2
2SETENV(PGCLIENTENCODING = "UTF8")
3SETENV(ODBCINI="/ogg213c/ogg_ma/odbc.ini")
4SETENV(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
5TARGETDB PGDSN1 USERIDALIAS PG1, DOMAIN OGGMA
6map public.*, target public.*;复制
配置完成后的效果

压测同步并查看检测数据
1export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib
2
3-- 在PGA压测
4sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
5--pgsql-host=172.72.6.20 --pgsql-port=5432 \
6--pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
7--table-size=1000 --tables=10 --threads=20 \
8--events=999999999 --time=60 --report-interval=10 \
9--db-ps-mode=disable --forced-shutdown=1 run
10
11
12
13-- 在PGB压测
14sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
15--pgsql-host=172.72.6.21 --pgsql-port=5432 \
16--pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
17--table-size=1000 --tables=10 --threads=20 \
18--events=999999999 --time=60 --report-interval=10 \
19--db-ps-mode=disable --forced-shutdown=1 run复制
在PGA侧加压
1[root@docker35 ~]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib
2[root@docker35 ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
3> --pgsql-host=172.72.6.20 --pgsql-port=5432 \
4> --pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
5> --table-size=1000 --tables=10 --threads=20 \
6> --events=999999999 --time=60 --report-interval=10 \
7> --db-ps-mode=disable --forced-shutdown=1 run
8sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
9
10Running the test with following options:
11Number of threads: 20
12Report intermediate results every 10 second(s)
13Initializing random number generator from current time
14
15Forcing shutdown in 61 seconds
16
17Initializing worker threads...
18
19Threads started!
20
21[ 10s ] thds: 20 tps: 276.96 qps: 5884.44 (r/w/o: 4146.04/1108.42/629.97) lat (ms,95%): 215.44 err/s: 17.99 reconn/s: 0.00
22[ 20s ] thds: 20 tps: 314.00 qps: 6681.87 (r/w/o: 4709.65/1257.81/714.41) lat (ms,95%): 150.29 err/s: 21.60 reconn/s: 0.00
23[ 30s ] thds: 20 tps: 289.10 qps: 6186.99 (r/w/o: 4362.26/1159.82/664.91) lat (ms,95%): 150.29 err/s: 22.90 reconn/s: 0.00
24[ 40s ] thds: 20 tps: 284.20 qps: 6040.41 (r/w/o: 4256.21/1137.30/646.90) lat (ms,95%): 132.49 err/s: 19.40 reconn/s: 0.00
25[ 50s ] thds: 20 tps: 207.20 qps: 4382.53 (r/w/o: 3091.15/822.69/468.69) lat (ms,95%): 179.94 err/s: 13.60 reconn/s: 0.00
26[ 60s ] thds: 20 tps: 267.65 qps: 5700.71 (r/w/o: 4015.83/1074.59/610.28) lat (ms,95%): 167.44 err/s: 19.20 reconn/s: 0.00
27SQL statistics:
28 queries performed:
29 read: 245868
30 write: 65645
31 other: 37381
32 total: 348894
33 transactions: 16413 (269.81 per sec.)
34 queries: 348894 (5735.37 per sec.)
35 ignored errors: 1149 (18.89 per sec.)
36 reconnects: 0 (0.00 per sec.)
37
38General statistics:
39 total time: 60.8276s
40 total number of events: 16413
41
42Latency (ms):
43 min: 10.27
44 avg: 73.47
45 max: 2213.35
46 95th percentile: 161.51
47 sum: 1205833.27
48
49Threads fairness:
50 events (avg/stddev): 820.6500/22.37
51 execution time (avg/stddev): 60.2917/0.38复制


可以看到数据是完全同步的!
在PGB侧加压
1[root@docker35 ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
2> --pgsql-host=172.72.6.21 --pgsql-port=5432 \
3> --pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
4> --table-size=1000 --tables=10 --threads=20 \
5> --events=999999999 --time=60 --report-interval=10 \
6> --db-ps-mode=disable --forced-shutdown=1 run
7sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
8
9Running the test with following options:
10Number of threads: 20
11Report intermediate results every 10 second(s)
12Initializing random number generator from current time
13
14Forcing shutdown in 61 seconds
15
16Initializing worker threads...
17
18Threads started!
19
20[ 10s ] thds: 20 tps: 235.78 qps: 5027.44 (r/w/o: 3544.39/944.82/538.23) lat (ms,95%): 257.95 err/s: 15.89 reconn/s: 0.00
21[ 20s ] thds: 20 tps: 256.61 qps: 5544.15 (r/w/o: 3914.04/1036.44/593.67) lat (ms,95%): 227.40 err/s: 22.78 reconn/s: 0.00
22[ 30s ] thds: 20 tps: 181.34 qps: 3826.18 (r/w/o: 2694.53/723.94/407.71) lat (ms,95%): 831.46 err/s: 10.91 reconn/s: 0.00
23[ 40s ] thds: 20 tps: 222.26 qps: 4656.12 (r/w/o: 3276.83/882.37/496.92) lat (ms,95%): 240.02 err/s: 11.95 reconn/s: 0.00
24[ 50s ] thds: 20 tps: 196.54 qps: 4139.82 (r/w/o: 2914.00/785.87/439.96) lat (ms,95%): 292.60 err/s: 11.34 reconn/s: 0.00
25[ 60s ] thds: 20 tps: 357.50 qps: 7705.61 (r/w/o: 5437.29/1442.80/825.52) lat (ms,95%): 116.80 err/s: 30.87 reconn/s: 0.00
26SQL statistics:
27 queries performed:
28 read: 217896
29 write: 58206
30 other: 33054
31 total: 309156
32 transactions: 14526 (241.82 per sec.)
33 queries: 309156 (5146.58 per sec.)
34 ignored errors: 1038 (17.28 per sec.)
35 reconnects: 0 (0.00 per sec.)
36
37General statistics:
38 total time: 60.0658s
39 total number of events: 14526
40
41Latency (ms):
42 min: 8.17
43 avg: 82.55
44 max: 3373.88
45 95th percentile: 227.40
46 sum: 1199186.82
47
48Threads fairness:
49 events (avg/stddev): 726.3000/19.53
50 execution time (avg/stddev): 59.9593/0.07复制


查看性能数据
http://192.168.66.35:19004/


其它内容不再截图。
双向同步测试完成,完美!
本文结束。
• 个人博客地址:www.xmmup.com
• 微信公众号:DB宝,作者:小麦苗,作者微信:db_bao
• 作者QQ:646634621,QQ群:230161599、618766405
• 提供Oracle OCP、OCM、高可用(rac+dg+ogg)、MySQL DBA和PostgreSQL DBA培训及其考证事宜
• 版权所有,欢迎分享本文,转载请保留出处• 若有侵权请联系小麦苗删除
长按下图识别二维码,关注小麦苗的微信公众号:DB宝,学习最实用的数据库技术。
