背景
近期公司在响应国家软件规范要求,重点项目的数据库采用开源版postgresql(下文简称pg),业务端依然使用oracle。因此为了保证pg到oracle的数据同步问题,经过调研采用Debezium开源项目,实现 pg -> kafka-> oracle 的数据实时同步。
开始介绍重点…
Debuzium简介
Debezium是Apache Kafka Connect的一组源连接器(source端),通过款实现剖析数据库中binlog日志,捕获数据,拷贝到kafka中,实现数据的实时抽取。另外可以通过confluen插件或者自建项目对kafka数据消费,通过解析数据转为为sql,最终实现数据的实时同步。我个人采用后者实现
Debezium的官网简介
https://github.com/debezium/debezium
https://debezium.io/documentation/reference/operations/monitoring.html
业务实现(主要分两大步骤)
一、source端实现方式
source端是pg -> kafka的数据传输。本人采用基于docker安装Debezium,安装步骤如下
- 安装zk
docker run -d --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper
- 安装kafka
docker run -d --name kafka -p 9092:9092 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.60.128:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 --link zookeeper:zookeeper debezium/kafka
- 安装pg
docker run -d --name database -p 5433:5432 -e POSTGRES_PASSWORD=debezium -d debezium/example-postgres
- 安装connect
docker run -d --name connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets -e STATUS_STORAGE_TOPIC=my_connect_statuses --link zookeeper:zookeeper --link kafka:kafka --link database:database debezium/connect
- 使用postman执行API
注册连接器,使用post添加,get查看
POST: http://192.168.60.128:8083/connectors/
{
"name": "paas-connector",
"config": {
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"database.dbname": "postgres",
"database.user": "postgres",
"slot.name": "debezium_slot",
"tasks.max": "1",
"database.server.name": "postgres",
"database.port": "1921",
"include.schema.changes": "true",
"plugin.name": "pgoutput",
"database.serverTimezone": "Asia/Shanghai",
"database.hostname": "10.1.8.28",
"database.password": "vK$LOi$F",
"name": "paas-connector",
"database.history.store.only.monitored.tables.ddl": "true",
"table.include.list": "paas.*"
}
}
- 查询连接器
查看当前inventory-connector连接器信息
192.168.60.128:8083/connectors/inventory-connector
- 查看所有连接器
192.168.60.128:8083/connectors
- 监听kafka的变化,可以查看源端数据的实时动态日志
docker run -it --rm --name watcher --link zookeeper:zookeeper --link kafka:kafka debezium/kafka watch-topic -a -k postgres.inventory.test2
其中postgres.inventory.test2是kafka的topic
postgres是数据库名称,inventory是schema,test2是数据表名称
二、sink端实现方式
实现简要描述:通过本地搭建springboot项目,配置kafka服务,对kafka topic的数据监听,实现数据的实时消费(采用批量消费,解析数据,并采用多线程池方式将数据同步到oracle中),具体代码请参考:
https://github.com/alan-cxh/kafkaDB2oracle