架构


环境准备
1-- 创建专用网络
2docker network create --subnet=172.72.6.0/24 pg-network
3
4-- PG A
5docker rm -f lhrpga
6docker run -d --name lhrpga -h lhrpga \
7 -p 64320:5432 --net=pg-network --ip 172.72.6.20 \
8 -e POSTGRES_PASSWORD=lhr \
9 -e TZ=Asia/Shanghai \
10 postgres:13.4
11
12
13-- PG B
14docker rm -f lhrpgb
15docker run -d --name lhrpgb -h lhrpgb \
16 -p 64321:5432 --net=pg-network --ip 172.72.6.21 \
17 -e POSTGRES_PASSWORD=lhr \
18 -e TZ=Asia/Shanghai \
19 postgres:13.4
20
21
22-- 安装ogg
23docker rm -f lhroggforpg
24docker run -d --name lhroggforpg -h lhroggforpg \
25 --net=pg-network --ip 172.72.6.25 \
26 -v /sys/fs/cgroup:/sys/fs/cgroup \
27 --privileged=true lhrbest/lhrcentos76:8.5 \
28 /usr/sbin/init
29
30
31docker cp /soft/213000_ggs_Linux_x64_PostgreSQL_64bit.zip lhroggforpg:/soft/
32
33docker exec -it lhroggforpg bash
34
35
36mkdir /ogg
37unzip /soft/213000_ggs_Linux_x64_PostgreSQL_64bit.zip
38tar -xvf ggs_Linux_x64_PostgreSQL_64bit.tar -C /ogg/
39
40
41
42rpm -e postgresql-libs-9.2.24-7.el7_9.x86_64 --nodeps
43yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
44yum install -y postgresql13-libs*
45
46
47cat >> /root/.bashrc <<"EOF"
48export LD_LIBRARY_PATH=/ogg/lib:/usr/pgsql-13/lib/:/usr/lib64:/usr/lib:$LD_LIBRARY_PATH
49export ODBCINI=/ogg/odbc.ini
50export PATH=$PATH:/ogg/
51alias ogg='rlwrap ggsci'
52EOF
53
54source /root/.bashrc
55
56ogg
57create subdirs
58
59
60
61-- ODBC
62cat > /ogg/odbc.ini <<"EOF"
63[ODBC Data Sources]
64LHRPGDSN=DataDirect 13 PostgreSQL Wire Protocol
65
66[ODBC]
67IANAAppCodePage=106
68InstallDir=/ogg
69
70[PGDSN1]
71Driver=/ogg/lib/GGpsql25.so
72#Driver=/usr/lib64/psqlodbcw.so
73Description=DataDirect 13 PostgreSQL Wire Protocol
74Database=lhrdb
75HostName=172.72.6.20
76PortNumber=5432
77LogonID=postgres
78Password=lhr
79
80[PGDSN2]
81Driver=/ogg/lib/GGpsql25.so
82#Driver=/usr/lib64/psqlodbcw.so
83Description=DataDirect 13 PostgreSQL Wire Protocol
84Database=lhrdb
85HostName=172.72.6.21
86PortNumber=5432
87LogonID=postgres
88Password=lhr
89
90EOF
91
92
93
94
95
96
97psql -U postgres -h 192.168.66.35 -p 64321
98psql -U postgres -h 192.168.66.35 -p 64320
99
100
101create database lhrdb;
102\c lhrdb
103create table test(id int primary key);
104create schema ogg;
105
106
107-- 需要重启库
108alter system set wal_level='logical';
109select pg_reload_conf();
110
111
112docker restart lhrpga lhrpgb
113
114
115
116
117-- mgr
118cat > /ogg/dirprm/mgr.prm <<"EOF"
119port 7809
120EOF
121
122start mgr
双主
A->B
1-- 配置extract
2cat > /ogg/dirprm/ext1.prm <<"EOF"
3extract ext1
4SETENV(PGCLIENTENCODING = "UTF8" )
5SETENV(ODBCINI="/ogg/odbc.ini" )
6SOURCEDB PGDSN1, userid postgres, password lhr
7exttrail ./dirdat/e1
8IGNOREREPLICATES
9TRANLOGOPTIONS FILTERTABLE ogg.ckpt
10table public.*;
11EOF
12
13DBLOGIN SOURCEDB PGDSN1 USERID postgres PASSWORD lhr
14REGISTER EXTRACT ext1
15ADD TRANDATA public.*
16ADD TRANDATA ogg.ckpt
17
18add ext ext1, tranlog, begin now
19add exttrail ./dirdat/e1, ext ext1
20
21
22
23
24
25-- 配置replication
26cat > /ogg/dirprm/rep1.prm <<"EOF"
27replicat rep1
28SETENV(PGCLIENTENCODING = "UTF8" )
29SETENV(ODBCINI="/ogg/odbc.ini" )
30SETENV(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
31TARGETDB PGDSN2, userid postgres, password lhr
32map public.*, target public.*;
33EOF
34
35
36
37DBLOGIN SOURCEDB PGDSN2 USERID postgres PASSWORD lhr
38add checkpointtable ogg.ckpt
39
40
41add rep rep1, exttrail ./dirdat/e1, checkpointtable ogg.ckpt
B->A
1-- 配置extract
2cat > /ogg/dirprm/ext2.prm <<"EOF"
3extract ext2
4SETENV(PGCLIENTENCODING = "UTF8" )
5SETENV(ODBCINI="/ogg/odbc.ini" )
6SOURCEDB PGDSN2, userid postgres, password lhr
7exttrail ./dirdat/e2
8IGNOREREPLICATES
9TRANLOGOPTIONS FILTERTABLE ogg.ckpt
10table public.*;
11EOF
12
13DBLOGIN SOURCEDB PGDSN2 USERID postgres PASSWORD lhr
14REGISTER EXTRACT ext2
15ADD TRANDATA public.*
16ADD TRANDATA ogg.ckpt
17
18add ext ext2, tranlog, begin now
19add exttrail ./dirdat/e2, ext ext2
20
21
22
23
24
25-- 配置replication
26cat > /ogg/dirprm/rep2.prm <<"EOF"
27replicat rep2
28SETENV(PGCLIENTENCODING = "UTF8" )
29SETENV(ODBCINI="/ogg/odbc.ini" )
30SETENV(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
31TARGETDB PGDSN1, userid postgres, password lhr
32map public.*, target public.*;
33EOF
34
35
36
37DBLOGIN SOURCEDB PGDSN1 USERID postgres PASSWORD lhr
38add checkpointtable ogg.ckpt
39ADD TRANDATA public.*
40ADD TRANDATA ogg.ckpt
41
42
43add rep rep2, exttrail ./dirdat/e2, checkpointtable ogg.ckpt
测试同步
1insert into test values(1);
2
3select * from test;
重新同步
1stop *
2alter ext1,begin now
3alter ext2,begin now
4alter rep1,begin now
5alter rep2,begin now
6start *
7info all
压测
1sysbench /usr/share/sysbench/oltp_common.lua --db-driver=pgsql \
2--pgsql-host=172.72.6.20 --pgsql-port=5432 \
3--pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
4--table-size=10000 --tables=10 --threads=80 \
5--events=999999999 --time=60 prepare
6
7
8pg_dump -d lhrdb > lhrdb.dmp
9
10psql -U postgres -d lhrdb -h 172.72.6.21 < lhrdb.dmp
11
12
13
14DBLOGIN SOURCEDB PGDSN1 USERID postgres PASSWORD lhr
15DBLOGIN SOURCEDB PGDSN2 USERID postgres PASSWORD lhr
16ADD TRANDATA public.*
17
18
19
20sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
21--pgsql-host=172.72.6.20 --pgsql-port=5432 \
22--pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
23--table-size=10000 --tables=10 --threads=20 \
24--events=999999999 --time=60 --report-interval=10 \
25--db-ps-mode=disable --forced-shutdown=1 run
26
27
28
29sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
30--pgsql-host=172.72.6.21 --pgsql-port=5432 \
31--pgsql-user=postgres --pgsql-password=lhr --pgsql-db=lhrdb \
32--table-size=10000 --tables=10 --threads=20 \
33--events=999999999 --time=60 --report-interval=10 \
34--db-ps-mode=disable --forced-shutdown=1 run
35
36
37
38-- 4个OGG进程正常,说明双向同步没问题
结论
1、OGG for PG可以远程捕获和投递
2、OGG FOR PG可以用于云RDS for PG之间的同步。
3、需要配置的参数:
1wal_level='logical'
2max_replication_slots=10
4、PG数据库需要通过ODBC连接
参考
使用OGG微服务快速双向同步RDS数据库:https://www.xmmup.com/shiyongoggweifuwukuaisushuangxiangtongburdsshujuku.html
otter用于跨云RDS之间配置双主实时同步:https://www.xmmup.com/otteryongyukuayunrdszhijianpeizhishuangzhushishitongbu.html
OGG用于跨云RDS之间配置双主实时同步–OGG远程捕获和投递:https://www.xmmup.com/oggyongyukuayunrdszhijianpeizhishuangzhushishitongbuyuanchengbuhuohetoudi.html
本文结束。

• 个人博客地址:www.xmmup.com
• 微信公众号:DB宝,作者:小麦苗,作者微信:db_bao
• 作者QQ:646634621,QQ群:230161599、618766405
• 提供Oracle OCP、OCM、高可用(rac+dg+ogg)、MySQL DBA和PostgreSQL DBA培训及其考证事宜
• 版权所有,欢迎分享本文,转载请保留出处• 若有侵权请联系小麦苗删除

长按下图识别二维码,关注小麦苗的微信公众号:DB宝,学习最实用的数据库技术。



文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




