暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

技术探店: OGG 21C for PG 微服务的同步方式

原创 大表哥 2022-11-10
2715

大家好,今天和大家分享一下OGG for PG的微服务版的同步方式。

上一次和大家分享了OGG 的ORACLE 19c 到 PG 13 的经典同步方式: https://www.modb.pro/db/539544

传统的经典模式是点对点之间的数据同步: 架构图如下:

Image.png

而基于微服务的架构(oggma)是 OGG 12.3 版本开始引进的一种基于Restful 服务接口的同步方式。 OGGMA 这可以部署在独立的机器上并可以通过web 网页进行各种进程的配置和监控。
个人觉得这也是老牌数据库厂商为了迎合主流技术市场的一种技术架构的改进,甚至是妥协。
微服务的架构摒弃了经典模式点对点之前的数据抽取,传输,同步。采取了更为灵活的独立部署的方式实现了集中管控同步平台。

Image.png

OGGMA版本中有几个重要的组件:

Admin SERVER : 管理端的组件,提供web 管理平台,可以提供监控,配置各种抽取,同步进程的终端。
Distribution SERVER: 数据分发服务
Receiver SERVER: 数据接收服务
Performance metric SERVER: 监控服务指标服务

目前MA版本的OGG 是不支持 异构数据库之间的同步的, 我们本次实验采取的是 同构的PG之间的同步方式.

实验环境如下: 我们选用独立部署方式来安装 OGG MA的软件

image.png

OGG MA 下载与安装

软件下载: https://www.oracle.com/middleware/technologies/goldengate-downloads.html#license-lightbox

Image.png

创建OGG MA的 home 路径:

INFRA [oracle@ljzdcmongo004 u01]# mkdir -p /u01/oggma

我们把下载好的压缩包放到独立部署的机器上

INFRA [oracle@ljzdcmongo004 u01]# unzip 213000_ggs_Linux_x64_PostgreSQL_services_shiphome.zip INFRA [oracle@ljzdcmongo004 u01]# cd ggs_Linux_x64_PostgreSQL_services_shiphome/Disk1/ INFRA [oracle@ljzdcmongo004 Disk1]# ls install response runInstaller stage

这里要强调一下,如果是选择第三台机器独立部署的话,必须要预先安装PG的软件,否则会之后的admin serice 会启动不了:
参考 MOS: OGG MA Admin Service Is Abended With Adminsrvr Error While Loading Shared Libraries: Libpq.so.5 CanNot Open Shared Object File No Such File Or Directory (Doc ID 2865559.1)
Posgresql: ggsci: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory (Doc ID 2893164.1)

image.png

INFRA [postgres@ljzdcmongo004 bin]# ./psql --version psql (PostgreSQL) 13.8

安装完PG的软件之后, 我们通过VNC view 进行远程的图形化安装: 软件的安装需要的空间 800MB+ 建议至少安装路径总空间 2GB以上.

Image.png
Image.png
Image.png
Image.png
下一步我们来部署OGG的微服务: 执行 oggca.sh 的脚本 图形化部署

INFRA [oracle@ljzdcmongo004 bin]# cd /u01/oggma/bin INFRA [oracle@ljzdcmongo004 bin]# ls -l | grep oggca -rwxr-x--- 1 oracle oinstall 10362 Dec 16 2020 oggca.sh

我们需要创建部署的路径:

INFRA [oracle@ljzdcmongo004 bin]# mkdir -p /u01/ogg_ms_pg INFRA [oracle@ljzdcmongo004 bin]# mkdir -p /u01/ogg_ms_deploy

Image.png

Image.png

Image.png
Image.png

这个步骤的环境变量配置 至关重要:
必须要配置: LD_LIBRARY_PATH: 中必须包含 pg software 的安装 lib 路径
(否则 后续的服务 adminservice 会启动报错: /u01/oggma/bin/adminsrvr: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory )
必须要配置 : ODBCINI=/u01/oggma/odbc.ini
(否则在图形界面配置数据源的时候会找不到ODBC的安装路径, 连接不到PG的数据库
OGG-00552 Database operation failed: Couldn’t connect to source. ODBC error: SQLSTATE IM002 native database error 0. [DataDirect][ODBC lib] Driver Manager Message file not found. Please check for the value of InstallDir in your odbc.ini.)

Image.png

Image.png

Image.png

Image.png

Image.png

Image.png

Image.png

root 执行脚本: /u01/ogg_ms_pg/bin/registerServiceManager.sh

INFRA [root@ljzdcmongo004 ~]# sh /u01/ogg_ms_pg/bin/registerServiceManager.sh Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. ---------------------------------------------------- Oracle GoldenGate Install As Service Script ---------------------------------------------------- OGG_HOME=/u01/oggma OGG_CONF_HOME=/u01/ogg_ms_pg/etc/conf OGG_VAR_HOME=/u01/ogg_ms_pg/var OGG_USER=oracle Running OracleGoldenGateInstall.sh... Created symlink from /etc/systemd/system/multi-user.target.wants/OracleGoldenGate.service to /etc/systemd/system/OracleGoldenGate.service.

Image.png

查看后台 ServiceManage 的进程和监听的端口 7820

INFRA [oracle@ljzdcmongo004 ~]# ps -ef |grep ServiceManage oracle 100378 1 0 15:57 ? 00:00:00 /u01/oggma/bin/ServiceManager --inventory '/u01/ogg_ms_pg/etc/conf' INFRA [oracle@ljzdcmongo004 ~]# netstat -nltp | grep 7820 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:7820 0.0.0.0:* LISTEN 100378/ServiceManag

我们尝试通过web 端 访问一下 7820 这个端口:

Image.png

尝试之前我们设置的账号 admin/admin 登录

Image.png

同步2端 PG 配置

PG 实例端数据库需要安装 extension: test_decoding

Image.png

INFRA [postgres@wqdcsrv3354 contrib]# cd test_decoding/ INFRA [postgres@wqdcsrv3354 test_decoding]# ls expected logical.conf Makefile specs sql test_decoding.c INFRA [postgres@wqdcsrv3354 test_decoding]# make && make install

PG 端需要修改的必要参数:

listen_addresses = '*' wal_level = replica max_replication_slots = 10 max_wal_senders = 10 track_commit_timestamp = on

pg_hba.conf

host all all 0.0.0.0/0 md5

创建PG的源端和目标端创建测试的账号:

关于源端和目标端具体的账号的权限要求可以参考: https://docs.oracle.com/en/middleware/goldengate/core/21.3/gghdb/preparing-database-oracle-goldengate-postgresql.html#GUID-0F08F6AC-06C5-4D9F-9D96-74AA297EEA7D

我们这里授权superuser

postgres=# create user ogg_replicate_user superuser password 'ogg_replicate_user'; CREATE ROLE

在独立部署的机器上创建ODBC文件,并测试连接
编辑文件 /etc/odbc.ini

[ODBC Data Sources] PG_SRC=DataDirect 7.1 PostgreSQL Wire Protocol PG_TGT=DataDirect 7.1 PostgreSQL Wire Protocol [ODBC] IANAAppCodePage=2025 InstallDir=/opt/ogg4pg [PG_SRC] Driver=/u01/oggma/lib/GGpsql25.so Description=DataDirect 7.1 PostgreSQL Wire Protocol Database=postgres HostName=10.67.39.49 PortNumber=2024 LogonID=ogg_replicate_user Password=ogg_replicate_user [PG_TGT] Driver=/u01/oggma/lib/GGpsql25.so Description=DataDirect 7.1 PostgreSQL Wire Protocol Database=postgres HostName=10.67.39.149 PortNumber=2024 LogonID=ogg_replicate_user Password=ogg_replicate_user

客户端用 isql 尝试连接:

INFRA [root@ljzdcmongo004 etc]# +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> select now(); +---------------------------------+ | now | +---------------------------------+ | 2022-11-04 18:36:06.671418+08:00| +---------------------------------+ SQLRowCount returns -1 1 rows fetched

配置抽取和复制服务

我们通过管理服务 7001 端口的网站 创建2个数据源的连接:

Image.png
Image.png
我们在源端创建要同步的表:这个我们要包含主键

postgres=# create table t_order (id int primary key , good_name varchar(200), cdate date); CREATE TABLE

为了方便同步,我们在目标端也创建同样的表:

postgres=# create table t_order (id int primary key , good_name varchar(200), cdate date); CREATE TABLE

我们从web 界面可以查询到表的信息:

Image.png

虽然表存在了主键,我们可以选择性的添加 all_cols 变成 full logging, 否则是 default logging 的设置

Note:For tables that have a primary key or unique index, the ALLCOLS option is required in order to set FULL logging for the table, otherwise DEFAULT logging is set.

Image.png

我们查看一下同步表的表级别日志打开的状态:

OGG (http://localhost:7820 ms4pg) 4> DBLOGIN USERIDALIAS source_admin DOMAIN OGG_MA Successfully logged into database. OGG (http://localhost:7820 ms4pg as source_admin@postgres) 5> INFO TRANDATA public.t_order 2022-11-09T02:43:31Z INFO OGG-08100 Logging of supplemental log data is enabled for table public.t_order with REPLICA IDENTITY set to DEFAULT Logging of supplemental transaction log data is enabled for table public.t_order. Columns supplementally logged for table public.t_order:

我们通过 命令行的方式添加一个 extract 的进程:

1)注册 extract 服务

OGG (http://localhost:7820 ms4pg as source_admin@postgres) 6> connect http://localhost:7820 as admin password admin Using default deployment 'ms4pg' OGG (http://localhost:7820 ms4pg) 7> DBLOGIN USERIDALIAS source_admin DOMAIN OGG_MA Successfully logged into database. OGG (http://localhost:7820 ms4pg as source_admin@postgres) 9> REGISTER EXTRACT extpgsrc 2022-11-09T03:03:16Z INFO OGG-25355 Successfully created replication slot 'extpgsrc_d4563fa459600277' for Extract group 'EXTPGSRC' in database 'postgres'.

我们可以看到测试 extract 服务,实际上是在 源端数据库上 创建了一个复制槽:extpgsrc_d4563fa459600277

postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots; slot_name | slot_type | active ---------------------------+-----------+-------- extpgsrc_d4563fa459600277 | logical | f (1 row)

2)编辑extract 服务的参数文件

OGG (http://localhost:7820 ms4pg as source_admin@postgres) 10> EDIT PARAMS extpgsrc EXTRACT extpgsrc SOURCEDB postgres USERIDALIAS source_admin, DOMAIN OGG_MA EXTTRAIL ep GETTRUNCATES TABLE public.t_order;

3)添加 extrcat 服务:

OGG (http://localhost:7820 ms4pg as source_admin@postgres) 11> ADD EXTRACT extpgsrc, TRANLOG, BEGIN NOW 2022-11-09T03:13:05Z INFO OGG-08100 Extract added. OGG (http://localhost:7820 ms4pg as source_admin@postgres) 12> ADD EXTTRAIL ep, EXTRACT extpgsrc 2022-11-09T03:13:22Z INFO OGG-08100 EXTTRAIL added.

4)启动进程

OGG (http://localhost:7820 ms4pg as source_admin@postgres) 13> start extpgsrc 2022-11-09T03:13:32Z INFO OGG-00975 Extract group EXTPGSRC starting. 2022-11-09T03:13:32Z INFO OGG-15426 Extract group EXTPGSRC started. OGG (http://localhost:7820 ms4pg as source_admin@postgres) 36> info extpgsrc Extract EXTPGSRC Last Started 2022-11-09 11:56 Status RUNNING Checkpoint Lag 00:43:32 (updated 00:00:10 ago) Process ID 120306 VAM Read Checkpoint 2022-11-09 11:13:05.237105 Replication Slot extpgsrc_d4563fa459600277 is active with PID 129713 in database postgres Slot Restart LSN 0/15D32C0 Slot Flush LSN 0/15D32C0 Current Log Position 0/15D33E0 Encryption Profile LocalWallet No Replicat groups found, but some coordinated threads may have been excluded.

我们查看源端的 复制槽已经被激活:

2022-11-09 11:51:26.629 CST [129713] STATEMENT: START_REPLICATION SLOT "extpgsrc_d4563fa459600277" LOGICAL 0/15D3288 ("include-timestamp", "include-xids") postgres=# select * from pg_replication_slots ; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wa l_size ---------------------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+-------- ------- extpgsrc_d4563fa459600277 | test_decoding | logical | 13581 | postgres | f | t | 129713 | | 488 | 0/15D32C0 | 0/15D32C0 | reserved | (1 row)

我们也可以从图形界面上,观察到我们创建的 extract 抽取服务进程:

Image.png

我们通过 命令行的方式添加一个 replication 的进程

1)首先我们要创建一张 checkpoint 的表来记录目标端同步的日志点

Image.png

命令行创建的话 可以用如下的命令:

ADD CHECKPOINTTABLE

2)创建复制进程的参数文件

OGG (http://localhost:7820 ms4pg as source_admin@postgres) 37> EDIT PARAMS reppg REPLICAT reppg SETENV(PGCLIENTENCODING = "UTF8" ) SETENV(ODBCINI="/u01/oggma/odbc.ini" ) TARGETDB PG_TGT USERIDALIAS target_admin, DOMAIN OGG_MA BATCHSQL GETTRUNCATES MAP public.t_order, TARGET public.t_order;

3)添加复制服务 reppg

OGG (http://localhost:7820 ms4pg as source_admin@postgres) 43> ADD REPLICAT reppg, PARALLEL, EXTTRAIL ep, CHECKPOINTTABLE public.checkpoint_pg 2022-11-09T06:36:57Z INFO OGG-08100 Parallel Replicat added.

4)启动复制服务 reppg

OGG (http://localhost:7820 ms4pg as source_admin@postgres) 48> start reppg 2022-11-09T06:39:22Z INFO OGG-00975 Replicat group REPPG starting. 2022-11-09T06:39:22Z INFO OGG-15445 Replicat group REPPG started. OGG (http://localhost:7820 ms4pg as source_admin@postgres) 52> info reppg No Extract groups exist. Replicat REPPG Last Started 2022-11-09 14:41 Status RUNNING Parallel Checkpoint Lag 00:00:00 (updated 00:00:04 ago) Process ID 6190 Log Read Checkpoint File ep000000001 2022-11-09 11:56:38.483844 RBA 1461 Encryption Profile LocalWallet

我们通过web 页面 观察一下,我们已经配置好的 抽取和复制的服务:

Image.png

关于抽取和同步服务,当然也可以通过图形界面的方式实现: 相当于从页面上调用了restful 的服务API, 这个就不演示了。

image.png
image.png

最后我们来测试一下数据同步:

源端插入数据:

postgres=# insert into t_order select generate_series(1,100000),'Keep Real!',now(); INSERT 0 100000

从web 界面监控目标端:

源端统计:

Image.png

目标端统计:

Image.png

最后我们回顾一下安装配置过程中的一些坑:

由于PG原生就支持发布订阅式的逻辑复制,所以网上关于OGG for PG 的资料很少, OGG 21C for PG的 微服务版本完整安装基本上就没有。

1)安装一定要参考官网文档,而且目前只能参考官方文档: https://docs.oracle.com/en/middleware/goldengate/core/21.3/gghdb/using-oracle-goldengate-postgresql.html
2)如果选择第三台机器独立部署的话,一定要记得先安装 pg 的软件库, 在执行 oggca.sh 的脚本, 否则admin service 会启动报错,
/u01/oggma/bin/adminsrvr: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory
3)在运行oggca.sh 的脚本的时候, 一定要配置 环境变量如下:
必须要配置: LD_LIBRARY_PATH: 中必须包含 pg software 的安装 lib 路径
(否则 后续的服务 adminservice 会启动报错: /u01/oggma/bin/adminsrvr: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory )
必须要配置 : ODBCINI=/u01/oggma/odbc.ini
(否则在图形界面配置数据源的时候会找不到ODBC的安装路径, 连接不到PG的数据库
OGG-00552 Database operation failed: Couldn’t connect to source. ODBC error: SQLSTATE IM002 native database error 0. [DataDirect][ODBC lib] Driver Manager Message file not found. Please check for the value of InstallDir in your odbc.ini.)

4)如果不幸,你没有设置 ODBCINI 和 LD_LIBRARY_PATH 环境变量的话,那么执行再次运行 oggca.sh 先卸载再重装。 目前测试只有卸载后再重装,才可以生效。
5)源端解析PG的WAL的原理是利用了 extension test_decoding, 感兴趣的话,也可以自己在写代码实现日志的抽取和同步。
6)老牌厂商的图形化的监控还是很nice的, 但是配置抽取和同步上的步骤略显复杂,不如命令行配置直接写参数文件那么直观。
7)PG原生就支持发布订阅式的逻辑复制, 所以实际上用OGG做PG->PG的同步 成本是很不理想的。 本文属于技术探店的文章。

Have a fun 🙂 !

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论