大家好,今天和大家分享一下OGG for PG的微服务版的同步方式。
上一次和大家分享了OGG 的ORACLE 19c 到 PG 13 的经典同步方式: https://www.modb.pro/db/539544
传统的经典模式是点对点之间的数据同步: 架构图如下:
而基于微服务的架构(oggma)是 OGG 12.3 版本开始引进的一种基于Restful 服务接口的同步方式。 OGGMA 这可以部署在独立的机器上并可以通过web 网页进行各种进程的配置和监控。
个人觉得这也是老牌数据库厂商为了迎合主流技术市场的一种技术架构的改进,甚至是妥协。
微服务的架构摒弃了经典模式点对点之前的数据抽取,传输,同步。采取了更为灵活的独立部署的方式实现了集中管控同步平台。
OGGMA版本中有几个重要的组件:
Admin SERVER : 管理端的组件,提供web 管理平台,可以提供监控,配置各种抽取,同步进程的终端。
Distribution SERVER: 数据分发服务
Receiver SERVER: 数据接收服务
Performance metric SERVER: 监控服务指标服务
目前MA版本的OGG 是不支持 异构数据库之间的同步的, 我们本次实验采取的是 同构的PG之间的同步方式.
实验环境如下: 我们选用独立部署方式来安装 OGG MA的软件
OGG MA 下载与安装
软件下载: https://www.oracle.com/middleware/technologies/goldengate-downloads.html#license-lightbox
创建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)
INFRA [postgres@ljzdcmongo004 bin]# ./psql --version
psql (PostgreSQL) 13.8
安装完PG的软件之后, 我们通过VNC view 进行远程的图形化安装: 软件的安装需要的空间 800MB+ 建议至少安装路径总空间 2GB以上.
下一步我们来部署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
这个步骤的环境变量配置 至关重要:
必须要配置: 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.)
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.
查看后台 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 这个端口:
尝试之前我们设置的账号 admin/admin 登录
同步2端 PG 配置
PG 实例端数据库需要安装 extension: test_decoding
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个数据源的连接:
我们在源端创建要同步的表:这个我们要包含主键
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 界面可以查询到表的信息:
虽然表存在了主键,我们可以选择性的添加 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.
我们查看一下同步表的表级别日志打开的状态:
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 抽取服务进程:
我们通过 命令行的方式添加一个 replication 的进程
1)首先我们要创建一张 checkpoint 的表来记录目标端同步的日志点
命令行创建的话 可以用如下的命令:
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 页面 观察一下,我们已经配置好的 抽取和复制的服务:
关于抽取和同步服务,当然也可以通过图形界面的方式实现: 相当于从页面上调用了restful 的服务API, 这个就不演示了。
最后我们来测试一下数据同步:
源端插入数据:
postgres=# insert into t_order select generate_series(1,100000),'Keep Real!',now();
INSERT 0 100000
从web 界面监控目标端:
源端统计:
目标端统计:
最后我们回顾一下安装配置过程中的一些坑:
由于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 🙂 !