Oracle GoldenGate 调研
# 概述
Oracle GoldenGate 是一款用于实时数据集成和异构数据库复制的产品。它支持组织实现与分析系统的实时数据集成、无停机地迁移和整合到云架构、 从事务系统(内部和云)分流报告功能以实现最高性能、实施主动-主动数据库复制以实 现数据分布和持续可用性。
## 定位
- 零宕机时间数据库升级和迁移。
- 满足用户亚秒级实时数据的需求。
- 可持续的数据高可用性和实时商务智能。
- 异构平台及跨操作系统实时数据同步。

## 组件
- Manager进程: Manager进程运行在源端和目标端上,作用:启动、监控、重启GoldenGate的其他进程,报告错误及事件,分配数据存储空间,发布阈值报告等.
- Extract进程: 运行在数据库源端,负责从源端数据表或者日志中捕获数据。checkpoint机制,信息写入trail文件,实现断点续传.
- Pump进程: 运行在数据库源端,如果源端使用了本地的trail文件,那么Pump进程就会把trail以数据块的形式通过TCP/IP协议发送到目标端,这通常也是推荐的方式。与Pump进程相对应的叫做Server Collector进程,对用户透明,把Extract/Pump投递过来的数据块重新组装成trail文件.
- Trail文件: trail文件存在的目的旨在防止单点故障,将事务信息持久化,并且使用checkpoint机制来记录其读写位置,如果故障发生,则数据可以根据checkpoint记录的位置来重传。trail文件并不总是必须的。人们可以在配置Extract进程的时候通过TCP/IP协议直接把日志的信息投递到目标端(不推荐).
- Replicat进程: 运行在目标端,是数据传递的最后一站,负责读取目标端trail文件中的内容,并将其解析为DML或DDL语句,然后应用到目标源中。checkpoint机制.
- GGSCI: 提供了十分丰富的命令来对GoldenGate进行各种操作,如创建、修改、监控GoldenGate进程等。
## 复制模式
- “一对一”是GoldenGate最简单的一种模式,也是最常用的模式。这种模式的一种典型应用就是用于数据容灾,通常源端数据库为生产端,目标端数据库为容灾端。
- 另外一种应用场景是把源端的OLTP系统产生的交易日志传送到目标端,使用BI数据仓库或者是OLAP

## mysql to kafka installation
- 源端
- 软件:ggs_Linux_x64_MySQL_64bit.tar
- 配置环境变量
```json
export MYSQL_HOME=<MySQL bin location>
export GGS_HOME=/home/ec2-user/l3/gg
export LD_LIBRARY_PATH=$GG_HOME:/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/lib/amd64/server
export PATH=$PATH:$GGS_HOME
```
- ggsci
- create subdirs
- EDIT PARAMS MGR
```json
PORT 7801
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS /home/hadoop/l3/gg/dirdat/*,usecheckpoints, minkeepdays 3
```
- START mgr
- INFO MANAGER/INFO ALL
- EDIT PARAM ext_name
```json
extract ext_l
setenv (MYSQL_HOME="/usr/libexec/mysql55")
tranlogoptions altlogdest /var/lib/mysql/mysql.index
DBOPTIONS HOST localhost, CONNECTIONPORT 3306
SOURCEDB test,USERID root, PASSWORD 123456
RMTHOST 192.15.2.10, MGRPORT 7801
gettruncates
GETUPDATEBEFORES
NOCOMPRESSDELETES
NOCOMPRESSUPDATES
RMTTRAIL ./dirdat/l3
TABLE test.t_test;
```
- ADD EXTRACT ext_l, TRANLOG, BEGIN NOW
- ADD RMTTRAIL ./dirdat/l3 EXTRACT ext_l, MEGABYTES 5
- start extract ext_l
- info extract ext_l, detail
- view report ext_l
- edit param pump_l (可选)
```json
rmthost 192.15.2.10,mgrport 7801
rmttrail /usr/local/ogg/ogg/dirdat/WC
passthru
gettruncates
table test.t_test;
```
- start pump_l
- 查看日志:GoldenGate安装目录下: ggserr.log
- 目标端
- 软件: OGG_BigData_Linux_x64_12.3.2.1.0.tar,kafka_2.12-0.10.2.1
- 配置环境变量
```json
export MYSQL_HOME=<MySQL bin location>
export GGS_HOME=/home/ec2-user/l3/gg
export LD_LIBRARY_PATH=$GG_HOME:/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/lib/amd64/server
export PATH=$PATH:$GGS_HOME
```
- kafka创建topic:bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic t_test
- 查看topic: bin/kafka-topics.sh --list --zookeeper localhost:2181
- 消费topic: bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic t_test --from-beginning
- ggsci
- create subdirs
- EDIT PARAMS MGR
```json
PORT 7801
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS /home/hadoop/l3/gg/dirdat/*,usecheckpoints, minkeepdays 3
```
- START mgr
- INFO MANAGER/INFO ALL
- EDIT PARAM rep_name
```json
REPLICAT rep_l
TARGETDB LIBFILE libggjava.so SET property=dirprm/kafka.props
REPORTCOUNT EVERY 1 MINUTES, RATE
GROUPTRANSOPS 10000
MAP test.t_test, TARGET test.t_test;
```
- add replicat rep_l, exttrail ./dirdat/l3
- start replicat rep_l
- info rep_l/info all
- 查看日志:GoldenGate安装目录下: ggserr.log
- vim dirprm/kafka.props
```json
gg.handlerlist=kafkahandler
gg.handler.kafkahandler.type=kafka
gg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties
gg.handler.kafkahandler.topicMappingTemplate=t_order_action
gg.handler.kafkahandler.keyMappingTemplate=${currentTimestamp}
gg.handler.kafkahandler.format=delimitedtext
gg.handler.kafkahandler.format.fieldDelimiter=|
gg.handler.kafkahandler.SchemaTopicName=tpcSchemaTopic
gg.handler.kafkahandler.BlockingSend=false
gg.handler.kafkahandler.includeTokens=false
gg.handler.kafkahandler.mode=op
goldengate.userexit.timestamp=utc
goldengate.userexit.writers=javawriter
javawriter.stats.display=TRUE
javawriter.stats.full=TRUE
gg.log=log4j
gg.log.level=INFO
gg.report.time=30sec
gg.classpath=dirprm/:/home/hadoop/kafka_2.12-0.10.2.1/libs/*
javawriter.bootoptions=-Xmx512m -Xms32m -Djava.class.path=ggjava/ggjava.jar
```
- vim dirprm/custom_kafka_producer.properties
```json
bootstrap.servers=localhost:9092
acks=1
compression.type=gzip
reconnect.backoff.ms=1000
value.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
key.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
batch.size=102400
linger.ms=10000
```
- edit param ./GLOBALS
- start replicat ext_l
Oracle GoldenGate 是一款用于实时数据集成和异构数据库复制的产品。它支持组织实现与分析系统的实时数据集成、无停机地迁移和整合到云架构、 从事务系统(内部和云)分流报告功能以实现最高性能、实施主动-主动数据库复制以实 现数据分布和持续可用性。
## 定位
- 零宕机时间数据库升级和迁移。
- 满足用户亚秒级实时数据的需求。
- 可持续的数据高可用性和实时商务智能。
- 异构平台及跨操作系统实时数据同步。
- 对源系统和目标系统是非侵入式的。
## 架构
和传统的逻辑复制一样,GoldenGate实现原理是通过抽取源端的redo log 或者archive log,然后通过TCP/IP投递到目标端,最后解析还原应用到目标端,使目标端实现同源端数据同步。
## 组件
- Manager进程: Manager进程运行在源端和目标端上,作用:启动、监控、重启GoldenGate的其他进程,报告错误及事件,分配数据存储空间,发布阈值报告等.
- Extract进程: 运行在数据库源端,负责从源端数据表或者日志中捕获数据。checkpoint机制,信息写入trail文件,实现断点续传.
- Pump进程: 运行在数据库源端,如果源端使用了本地的trail文件,那么Pump进程就会把trail以数据块的形式通过TCP/IP协议发送到目标端,这通常也是推荐的方式。与Pump进程相对应的叫做Server Collector进程,对用户透明,把Extract/Pump投递过来的数据块重新组装成trail文件.
- Trail文件: trail文件存在的目的旨在防止单点故障,将事务信息持久化,并且使用checkpoint机制来记录其读写位置,如果故障发生,则数据可以根据checkpoint记录的位置来重传。trail文件并不总是必须的。人们可以在配置Extract进程的时候通过TCP/IP协议直接把日志的信息投递到目标端(不推荐).
- Replicat进程: 运行在目标端,是数据传递的最后一站,负责读取目标端trail文件中的内容,并将其解析为DML或DDL语句,然后应用到目标源中。checkpoint机制.
- GGSCI: 提供了十分丰富的命令来对GoldenGate进行各种操作,如创建、修改、监控GoldenGate进程等。
## 复制模式
- “一对一”是GoldenGate最简单的一种模式,也是最常用的模式。这种模式的一种典型应用就是用于数据容灾,通常源端数据库为生产端,目标端数据库为容灾端。
- 另外一种应用场景是把源端的OLTP系统产生的交易日志传送到目标端,使用BI数据仓库或者是OLAP
## mysql to kafka installation
- 源端
- 软件:ggs_Linux_x64_MySQL_64bit.tar
- 配置环境变量
```json
export MYSQL_HOME=<MySQL bin location>
export GGS_HOME=/home/ec2-user/l3/gg
export LD_LIBRARY_PATH=$GG_HOME:/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/lib/amd64/server
export PATH=$PATH:$GGS_HOME
```
- ggsci
- create subdirs
- EDIT PARAMS MGR
```json
PORT 7801
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS /home/hadoop/l3/gg/dirdat/*,usecheckpoints, minkeepdays 3
```
- START mgr
- INFO MANAGER/INFO ALL
- EDIT PARAM ext_name
```json
extract ext_l
setenv (MYSQL_HOME="/usr/libexec/mysql55")
tranlogoptions altlogdest /var/lib/mysql/mysql.index
DBOPTIONS HOST localhost, CONNECTIONPORT 3306
SOURCEDB test,USERID root, PASSWORD 123456
RMTHOST 192.15.2.10, MGRPORT 7801
gettruncates
GETUPDATEBEFORES
NOCOMPRESSDELETES
NOCOMPRESSUPDATES
RMTTRAIL ./dirdat/l3
TABLE test.t_test;
```
- ADD EXTRACT ext_l, TRANLOG, BEGIN NOW
- ADD RMTTRAIL ./dirdat/l3 EXTRACT ext_l, MEGABYTES 5
- start extract ext_l
- info extract ext_l, detail
- view report ext_l
- edit param pump_l (可选)
```json
rmthost 192.15.2.10,mgrport 7801
rmttrail /usr/local/ogg/ogg/dirdat/WC
passthru
gettruncates
table test.t_test;
```
- start pump_l
- 查看日志:GoldenGate安装目录下: ggserr.log
- 目标端
- 软件: OGG_BigData_Linux_x64_12.3.2.1.0.tar,kafka_2.12-0.10.2.1
- 配置环境变量
```json
export MYSQL_HOME=<MySQL bin location>
export GGS_HOME=/home/ec2-user/l3/gg
export LD_LIBRARY_PATH=$GG_HOME:/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/lib/amd64/server
export PATH=$PATH:$GGS_HOME
```
- kafka创建topic:bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic t_test
- 查看topic: bin/kafka-topics.sh --list --zookeeper localhost:2181
- 消费topic: bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic t_test --from-beginning
- ggsci
- create subdirs
- EDIT PARAMS MGR
```json
PORT 7801
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS /home/hadoop/l3/gg/dirdat/*,usecheckpoints, minkeepdays 3
```
- START mgr
- INFO MANAGER/INFO ALL
- EDIT PARAM rep_name
```json
REPLICAT rep_l
TARGETDB LIBFILE libggjava.so SET property=dirprm/kafka.props
REPORTCOUNT EVERY 1 MINUTES, RATE
GROUPTRANSOPS 10000
MAP test.t_test, TARGET test.t_test;
```
- add replicat rep_l, exttrail ./dirdat/l3
- start replicat rep_l
- info rep_l/info all
- 查看日志:GoldenGate安装目录下: ggserr.log
- vim dirprm/kafka.props
```json
gg.handlerlist=kafkahandler
gg.handler.kafkahandler.type=kafka
gg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties
gg.handler.kafkahandler.topicMappingTemplate=t_order_action
gg.handler.kafkahandler.keyMappingTemplate=${currentTimestamp}
gg.handler.kafkahandler.format=delimitedtext
gg.handler.kafkahandler.format.fieldDelimiter=|
gg.handler.kafkahandler.SchemaTopicName=tpcSchemaTopic
gg.handler.kafkahandler.BlockingSend=false
gg.handler.kafkahandler.includeTokens=false
gg.handler.kafkahandler.mode=op
goldengate.userexit.timestamp=utc
goldengate.userexit.writers=javawriter
javawriter.stats.display=TRUE
javawriter.stats.full=TRUE
gg.log=log4j
gg.log.level=INFO
gg.report.time=30sec
gg.classpath=dirprm/:/home/hadoop/kafka_2.12-0.10.2.1/libs/*
javawriter.bootoptions=-Xmx512m -Xms32m -Djava.class.path=ggjava/ggjava.jar
```
- vim dirprm/custom_kafka_producer.properties
```json
bootstrap.servers=localhost:9092
acks=1
compression.type=gzip
reconnect.backoff.ms=1000
value.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
key.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
batch.size=102400
linger.ms=10000
```
- edit param ./GLOBALS
- start replicat ext_l