在大数据时代大量数据需要在不同的系统之间流动、整合。通常核心业务系统的数据存储于业务数据库(OLTP)中。而传统数仓的批量数据同步方式是定期从OLTP系统抽取数据。但是随着业务需求的升级,批量同步无论从实时性,还是对在线OLTP系统的抽取压力都无法满足业务部门的要求。因此像Kafka之类的基于高效消息队列的实时数据采集与分析能力也是各大企业必须要建设的能力之一。
目前实时分析的很多场景会涉及到Oracle、MySQL等关系型数据库的实时数据采集工作,同步到Kafka环境之后一般会基于FlinkSQL、Java、Python进行消费程序的开发。由于Oracle数据库的特殊性,通常需要OGG或者Logminer等工具来解析redo日志以实现到Kafka的数据同步。今天我就来介绍下如何通过Oracle GoldenGate技术实现Oracle数据库到Kafka之间的数据实时集成
架构说明
下图是我们将要开发的架构和实时数据流
我们会通过Oracle VM VirtualBox创建一个Linux环境,在虚拟机中完成所有的开发测试内容。本次测试需要安装的服务如下:
- Oracle数据库12c:源端数据库,存储要同步的源表数据
- Oracle GoldenGate 12c:源端OOG,用于抽取源端Oracle数据库的数据变更信息,并以中间日志格式(trail log)进行存储,并以DataPump将其输送到另一个目标端OGG(GoldenGate for Big Data 12c)
- Oracle GoldenGate for Big Data 12c:目标端OGG,接收源端发送的事务变更日志,并将变更内容推送到Kafka消息队列中Apache Zookeeper/Apache Kafka实例:目标端Kafka消息队列,接收目标端OGG推送过来的数据
- 启动Oracle数据库
- Oracle数据库启用归档日志
- 创建ggadmin用户
- 创建ESHOP Schema
- 初始化GoldenGate Classic
- 创建GoldenGate Extract
- 安装并运行Apache Kafka
- 安装GoldenGate for Big Data
- 启动GoldenGate for Big Data Manager
- 创建Data Pump
- 将事务发布到Kafka
- Oracle Enterprise Linux 6.9
- Oracle Database 12c Release 1 Enterprise Edition (12.1.0.2) - including Oracle Big Data SQL-enabled external tables, Oracle Multitenant, Oracle Advanced Analytics, Oracle OLAP, Oracle Partitioning, Oracle Spatial and Graph, and more.
- Cloudera Distribution including Apache Hadoop (CDH5.13.1)
- Cloudera Manager (5.13.1)
- Oracle Big Data Spatial and Graph 2.4
- Oracle Big Data Connectors 4.11
- Oracle SQL Connector for HDFS 3.8.1
- Oracle Loader for Hadoop 3.9.1
- Oracle Data Integrator 12c (12.2.1.3.0)
- Oracle R Advanced Analytics for Hadoop 2.7.1
- Oracle XQuery for Hadoop 4.9.1
- Oracle Data Source for Apache Hadoop 1.2.1
- Oracle Shell for Hadoop Loaders 1.3.1
- 用户:oracle
- 密码:welcome1
- 检查第一项ORCL (Oracle数据库12c),开启服务(空格)
- 按回车确认选择
- 其他服务设置为off
- Oracle home 文件夹 ($ORACLE_HOME) 为 /u01/app/oracle/product/12.1.0.2/dbhome_1
- GoldenGate (classic) 安装目录为 /u01/ogg
- SQL Developer 安装目录为 /u01/sqldeveloper. 可以通过最上端工具栏的SQL Developer图标打开服务
- Oracle database是基于多租户容器数据库multitenant container database (CDB)安装的
- Oracle database监听端口为1521
- root-container的SID为 cdb
- PDB的SID为 orcl
- 所有Oracle数据库用户 (SYS, SYSTEM, etc.)的密码均为welcome1
- 连接PDB数据库的tnsname别名为ORCL (可参照 $ORACLE_HOME/network/admin/tnsnames.ora 文件内容)
- Java home 文件夹 ($JAVA_HOME) 为 /usr/java/latestJDK安装路径为 $JAVA_HOME
sqlplus sys/welcome1 as sysdba
然后依次运行下列命令(建议逐条执行)
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;ALTER DATABASE FORCE LOGGING;ALTER SYSTEM SWITCH LOGFILE;ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE;SHUTDOWN IMMEDIATE;STARTUP MOUNT;ALTER DATABASE ARCHIVELOG;ALTER DATABASE OPEN;
命令执行完毕界面
检查存档日志是否成功启用
ARCHIVE LOG LIST;
可确认日志归档已成功开启
3. 创建ggadmin用户
下面为GoldenGate (classic)创建一个特殊的Oracle管理员用户。
运行如下代码,创建ggadmin用户
ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;
CREATE USER ggadmin IDENTIFIED BY ggadmin;
GRANT CREATE SESSION, CONNECT, RESOURCE, ALTER SYSTEM TO ggadmin;
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE(grantee=>'ggadmin', privilege_type=>'CAPTURE', grant_optional_privileges=>'*');
GRANT SELECT ANY DICTIONARY TO ggadmin;
GRANT UNLIMITED TABLESPACE TO ggadmin;
4. 创建ESHOP Schema
下面需要创建一个新的schema(ESHOP),并且要创建两张表(CUSTOMER_ORDER和CUSTOMER_ORDER_ITEM)用于生成要推送到Kafka中的CDC事件流
使用SQL Plus连接SID为orcl的Oracle PDB
sqlplus sys/welcome1@ORCL as sysdba
运行如下代码
-- 初始化session
ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;
-- 创建表空间
CREATE TABLESPACE eshop_tbs DATAFILE 'eshop_tbs.dat' SIZE 10M AUTOEXTEND ON;
CREATE TEMPORARY TABLESPACE eshop_tbs_temp TEMPFILE 'eshop_tbs_temp.dat' SIZE 5M AUTOEXTEND ON;
-- 创建eshop用户,密码为eshop
CREATE USER ESHOP IDENTIFIED BY eshop DEFAULT TABLESPACE eshop_tbs TEMPORARY TABLESPACE eshop_tbs_temp;
-- 给eshop用户赋权限
GRANT CREATE SESSION TO ESHOP;
GRANT CREATE TABLE TO ESHOP;
GRANT UNLIMITED TABLESPACE TO ESHOP;
GRANT RESOURCE TO ESHOP;
GRANT CONNECT TO ESHOP;
GRANT CREATE VIEW TO ESHOP;
-- 创建 eshop sequences
CREATE SEQUENCE ESHOP.CUSTOMER_ORDER_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
CREATE SEQUENCE ESHOP.CUSTOMER_ORDER_ITEM_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
-- 创建 eshop表
CREATE TABLE ESHOP.CUSTOMER_ORDER (
ID NUMBER(19) PRIMARY KEY,
CODE VARCHAR2(10),
CREATED DATE,
STATUS VARCHAR2(32),
UPDATE_TIME TIMESTAMP
);
CREATE TABLE ESHOP.CUSTOMER_ORDER_ITEM (
ID NUMBER(19) PRIMARY KEY,
ID_CUSTOMER_ORDER NUMBER(19),
DESCRIPTION VARCHAR2(255),
QUANTITY NUMBER(3),
CONSTRAINT FK_CUSTOMER_ORDER FOREIGN KEY (ID_CUSTOMER_ORDER) REFERENCES ESHOP.CUSTOMER_ORDER (ID)
);
5. 初始化GoldenGate Classic
在这一步骤,我们将完成整体架构中如下部分的工作
下面需要在BigDataListe-4.11虚拟机中设置GoldenGate (classic)实例
在Linux shell中运行如下代码
cd /u01/ogg
./ggsci
GoldenGate CLI(命令行界面)会启动
在GoldenGate CLI启动Manager
start mgr
以ggadmin用户登陆数据库
dblogin userid ggadmin password ggadmin
add schematrandata orcl.eshop;
可能会报错,显示用户权限不足
可以通过SQL Developer工具,以SYS用户连接数据库后,为ggadmin用户重新赋予权限
ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;
CREATE USER ggadmin IDENTIFIED BY ggadmin;
GRANT CREATE SESSION, CONNECT, RESOURCE, ALTER SYSTEM TO ggadmin;
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE(grantee=>'ggadmin', privilege_type=>'CAPTURE', grant_optional_privileges=>'*');
GRANT SELECT ANY DICTIONARY TO ggadmin;
GRANT UNLIMITED TABLESPACE TO ggadmin;
grant dba to ggadmin container=all;
grant create session to ggadmin container=all;
权限赋予完毕后,重新启动OGG Classic
./ggsci
dblogin userid ggadmin password ggadmin
add schematrandata orcl.eshop
6. 创建 GoldenGate Extract
在这一步骤,我们将完成整体架构中如下部分的工作
创建一个GoldenGate extract来实时监控Oracle archive redo日志,以捕获与ESHOP表相关的数据库事务,并将此SQL修改记录流写入另一个名为trail log的日志文件中
在GoldenGate CLI中运行如下代码
edit params exteshop
在vi界面输入如下代码内容
EXTRACT exteshop
USERID ggadmin,PASSWORD ggadmin
EXTTRAIL ./dirdat/aa
TABLE orcl.eshop.*;
保存内容并退出vi,返回GoldenGate CLI
保存的内容将存储在/u01/ogg/dirprm/exteshop.prm 文件中。我们也可以在外部编辑它的内容,而不需要再次从GoldenGate CLI运行edit params exteshop命令来进行
接下来需要在Oracle中注册extract process,在GoldenGate CLI运行以下命令
dblogin userid ggadmin password ggadmin
register extract exteshop database container (orcl)
注册成功后,会有如下信息输出
使用弹出的SCN号来完成extract的配置工作。在GoldenGate CLI中输入如下代码
add extract exteshop, integrated tranlog, scn 13512256
add exttrail ./dirdat/aa, extract exteshop
到这一步,我们就可以启动名为exteshop的GoldenGate extract process了
start exteshop
也可以使用以下命令中来检查进程的状态,其中view report exteshop是用来查看extract进程的日志信息
info exteshop
view report exteshop
最后我们可以验证一下extract过程是否正常工作!
首先我们可以在Linux shell运行如下命令,连接到数据库
sqlplus eshop/eshop@ORCL
然后在原表中插入一条模拟数据
INSERT INTO CUSTOMER_ORDER (ID, CODE, CREATED, STATUS, UPDATE_TIME)
VALUES (CUSTOMER_ORDER_SEQ.NEXTVAL, 'AAAA02', SYSDATE, 'DRAFT', SYSTIMESTAMP);
INSERT INTO CUSTOMER_ORDER_ITEM (ID, ID_CUSTOMER_ORDER, DESCRIPTION, QUANTITY)
VALUES (CUSTOMER_ORDER_ITEM_SEQ.NEXTVAL, CUSTOMER_ORDER_SEQ.CURRVAL, 'Toy Story1', 2);
COMMIT;
可确认两条模拟客户数据已插入成功
最后我们退出到GoldenGate CLI界面,执行如下代码
stats exteshop
我们可以看到已经抽取到的日志信息,即往我们的监控表里插入了两条新数据
好了今天就到这里,下期我们再来做后半部分的开发(7~11)
- 启动Oracle数据库
- Oracle数据库启用归档日志
- 创建ggadmin用户
- 创建ESHOP Schema
- 初始化GoldenGate Classic
- 创建GoldenGate Extract
- 安装并运行Apache Kafka
- 安装GoldenGate for Big Data
- 启动GoldenGate for Big Data Manager
- 创建Data Pump
- 将事务发布到Kafka