基于Debezium 实时同步Mongodb 数据

1.1 Debezium 介绍

Debezium 是一个分布式的平台 ,注册source connector 用于源集群和kafka进行连接, 捕获原集群数据库中的更改记录,并将更改记录进行解析成相应的格式,以消息的形式保存到kafka中,

也可以注册sink connector 用于kafka 与 目的集群进行连接,消费kafka中的数据记录,并解析成数据库中能插入的sql语句。

下图为Debezium的整个架构,Debezium以插件的形式,部署在 Kafka Connect 上,Kafka Connect 有两个核心的概念:Source 和 Sink,Source 负责导入数据到 Kafka,Sink 负责从 Kafka 导出数据,它们都被称为是 Connector。

基于Debezium 实时同步Mongodb 数据_第1张图片

1.2 Source Connector for MongoDB 介绍

1.MongoDB Source  Connector(源集群连接器),当第一次连接到源端集群时,它会先查看并记录当前oplog,然后执行对数据库执行一次快照,当所有数据都被复制后,连接器从它之前oplog记录的位置开始以数据流的方式记录数据库相应的更改,保存到kafka中,

2.MongoDB Source  Connector会记录插入,更新,删除操作,同时也会保持oplog中相同操作是幂等的,不会重复记录。

3.当MongoDB Source Connector突然停止时,它会记录好处理的最后一个oplog的位置,以便在重新启动时它从当前位置开始继续之前的数据变更记录。当停止服务太久,记录的oplog在MongoDB源集群找不到时,会重新执行一次快照,来保持继续服务。

4.当源集群切换主节点时,MongoDB Source Connector会立即停止记录数据库变更,并尝试连接到新的主节点开始继续记录数据库变更。

1.3 Sink Connector for MongoDB 介绍

1.MongoDB Kafka Sink Connector 是 独立于Debezium 的 第三方 MongoDB Kafka Connector 插件,是mongo 官方开发的connector 插件,支持消费 Debezium 保存的消息。

2.需要将MongoDB Kafka Sink Connector插件拷贝 到 Debezium 的connect 文件夹中才能使用。

3.MongoDB Kafka Sink Connector 从Kafka中消费之前记录Mongo变更的记录,将其解析保存到目的MongoDB中。

 2.测试验证

2.1创建同步所需的账户

 # 源Mongo集群同步账号,需要local库可读权限 use admin db.createUser({user:"test",pwd:"123456",roles:[{role:"read",db:"local"}]})

# 目的Mongo集群同步账号,需要同步数据库的可读可写权限 use admin db.createUser({user:"test",pwd:"123456",roles:[{role:"read",db:"ycsb"},{role:"readWrite",db:"ycsb"}]})

2.2部署zookeeper

docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:1.6

2.3部署Kafka

docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:1.6

2.4部署Debezium Connector

将本地mongo sink connector 插件 挂载到容器里面,这个从mongo-connector里面找插件吧

docker run -it --rm --name connect -p 8083:8083 -v /root/debezium-connector-mongodb:/kafka/connect/debezium-connector-mongodb -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 --add-host mongodb:10.4.14.33 debezium/connect:1.6

2.5注册Source connector

source connector 配置 source.json 如下

{ "name": "src-mongodb-connector", "config": { "connector.class": "io.debezium.connector.mongodb.MongoDbConnector", "tasks.max": "16", "mongodb.hosts": "rs0/10.4.14.33:30280", "mongodb.name": "srcMongodb", "mongodb.user": "test", "mongodb.password": "123456", "poll.interval.ms":"50", "max.queue.size":"40960", "max.batch.size":"10240", "max.queue.size.in.bytes":"40960000", "max.poll.interval.ms":"600000", "database.include.list":"ycsb", "collection.include.list":"ycsb.usertable" } }

curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" http://localhost:8083/connectors/ -d @source.json

2.6注册 Sink connector

sink connector 配置sink.json 如下

{ "name" : "dest-mongo-sink", "config" : { "topics" : "srcMongodb.ycsb.usertable", "max.batch.size" : "10000", "connection.uri" : "mongodb://test:[email protected]:28000/admin", "connector.class" : "com.mongodb.kafka.connect.MongoSinkConnector", "change.data.capture.handler" : "com.mongodb.kafka.connect.sink.cdc.debezium.mongodb.MongoDbHandler", "key.converter" : "org.apache.kafka.connect.json.JsonConverter", "key.converter.schemas.enable" : "true", "value.converter" : "org.apache.kafka.connect.json.JsonConverter", "value.converter.schemas.enable" : "true", "database" : "ycsb", "collection" : "usertable", "max.poll.interval.ms":"600000", "tasks.max":"16" } }

curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" http://localhost:8083/connectors/ -d @sink.json

这样连接好源端和目的端mongo集群,就能实时同步了,但也是一定条件下,比如我测试的机器单张表只能实时2k/s的ops

3.参考资料

1.Tutorial :: Debezium Documentation

2. https://docs.mongodb.com/kafka-connector/current/kafka-sink-properties/

你可能感兴趣的:(mongodb,kafka,Debezium,实时同步)