CDC(数据变更捕获)场景应用

文章目录

一、概述

由于mongodb多层嵌套,模糊搜索并不能很好的利用索引,导致查询比较慢,所以采用OpenSearch方案,用kafka+kafka connect同步mongodb副本集到OpenSearch上,搜索用OpenSearch搜索。

为什么不采用es而采用OpenSearch,因为OpenSearch是es的一个分支,而且功能全面且免费,es的很多功能都收费了

架构设计:

二、环境装备

opensearch相关环境,安装过程

kafka相关环境,安装过程

mongodb本地环境

三、实现过程

3.1 mongodb配置副本集

由于是docker环境,只需要在yml文件中添加副本集,重新启动docker即可

yml配置文件如下

yaml 复制代码
version: '2.4'  # 增加这一行,指定一个旧版本格式
services:
  mongodb:
    image: docker.1ms.run/library/mongo:4.2.24
    container_name: mongodb
    # 设置副本集名为rs0,此副本集是进行同步到opensearch的
    command: mongod --replSet rs0 --bind_ip_all
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    volumes:
      - mongodb_data:/data/db

volumes:
  mongodb_data:

1、进入mongo环境,创建副本集

bash 复制代码
sudo docker-compose exec mongodb mongo -u admin -p password --authenticationDatabase admin

2、继续执行副本集初始化命令

bash 复制代码
# rs0同启动命令一致,名称都为rs0
rs.initiate({
  _id: "rs0",
  members: [{
    _id: 0,
    host: "ip:27017"   # 具体ip地址,下面添加连接器的时候要用
  }]
})

3、检查是否成功

bash 复制代码
# 继续运行,出现如下结果表明成功
rs.status()

3.2 安装连接器插件

1、进入 kafka-connect 容器中,安装如下两个组件

bash 复制代码
# 1、安装 Debezium MongoDB Connector
confluent-hub install debezium/debezium-connector-mongodb:latest --no-prompt
# 2、安装 OpenSearch Sink Connector (兼容 OpenSearch)
wget https://github.com/Aiven-Open/opensearch-connector-for-apache-kafka/releases/download/v3.1.1/opensearch-connector-for-apache-kafka-3.1.1.zip
# unzip解压到指定目录(kafka-connect容器插件目录,默认/usr/share/java/,可以查看CONNECT_PLUGIN_PATH对应的路径就是容器插件目录)
cd /usr/share/java/
unzip opensearch-connector-for-kafka-1.0.0.zip
# 删除此版本的冲突的jar包,opensearch连接器中的jar包会和kafka-connect中的冲突,
rm -f /usr/share/java/opensearch-connector/*jackson*.jar 2>/dev/null || true;
rm -f /usr/share/java/opensearch-connector/*log4j*.jar 2>/dev/null || true;

出现如下内容代表成功

2、重启kafka-connect

bash 复制代码
docker-compose restart kafka-connect

3.3 配置启动连接器

1、创建 Debezium MongoDB Source Connector

此连接器会监控指定的数据库(这里是mongodb),在连接中写好副本集

并将变更写入名为{database}.{collection} 的 Kafka Topic

bash 复制代码
curl -X POST http://localhost:8083/connectors \
  -H "Content-Type: application/json" \
  -d '{
    "name": "mongo-source-opensearch",
    "config": {
      "connector.class": "io.debezium.connector.mongodb.MongoDbConnector",
      "tasks.max": "1",
       "mongodb.connection.string": "mongodb://username:password@mongo_ip:27019/database_name??replicaSet=rs0&authSource=database_name",
       "database.include.list": "database_name",
       "snapshot.mode": "initial",
      "capture.mode": "change_streams_update_full",       
      "topic.prefix": "mongo",
      "key.converter": "org.apache.kafka.connect.json.JsonConverter",
      "value.converter": "org.apache.kafka.connect.json.JsonConverter",
      "key.converter.schemas.enable": "false",
      "value.converter.schemas.enable": "false"
    }
  }'


# snapshot.mode:"initial",首次启动时做全量快照
# capture.mode: "change_streams_update_full", # 捕获完整更新文档
# topic.prefix: "mongo", # Kafka Topic 前缀

出现如下内容表示注册成功

2、创建 Opensearch Sink Connector

此连接器会读取上一步生成的 Kafka Topic,并将其内容写入 OpenSearch 的对应索引。

bash 复制代码
curl -X POST http://localhost:8083/connectors/os-sink-v2/config \
  -H "Content-Type: application/json" \
  -d '{
    "connector.class": "io.aiven.kafka.connect.opensearch.OpensearchSinkConnector",
    "connection.url": "http://192.168.101.77:9200",
    "connection.username": "admin",
    "connection.password": "password",
    "topics": "mongo.db_name.user,mongo.db_name.role",
    "type.name": "_doc",
    "key.ignore": "true",
    "schema.ignore": "true",
    "index.auto.create": "true",
    "write.method": "upsert",
    "behavior.on.null.values": "ignore",
    "tasks.max": "1",
    "connection.version.check": "false",
    "connection.ssl.enabled": "false",
    "transforms": "unwrap",
    "transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState",
    "transforms.unwrap.drop.tombstones": "true",
    "transforms.unwrap.add.headers": "op",
    "transforms.unwrap.add.fields": "source.ts_ms,db,table,op",
    "transforms.unwrap.delete.handling.mode": "rewrite"
  }'

出现如下内容表示注册成功

3、验证是否注册成功

访问kafka-connect插件地址

http://localhost:8083/connector-plugins

访问kafka-ui地址,能够看到两个连接器中的topics数据,状态也都是running

访问opensearch-dashboard,能够看到数据已经同步到这上面了

相关推荐
Elasticsearch15 小时前
如何使用 Agent Builder 排查 Kubernetes Pod 重启和 OOMKilled 事件
elasticsearch
Elasticsearch2 天前
通用表达式语言 ( CEL ): CEL 输入如何改进 Elastic Agent 集成中的数据收集
elasticsearch
DemonAvenger2 天前
Kafka性能调优:从参数配置到硬件选择的全方位指南
性能优化·kafka·消息队列
AI全栈实验室3 天前
MongoDB迁移金仓踩了5个坑,最后一个差点回滚
mongodb
海兰3 天前
离线合同结构化提取与检索:LangExtract + 本地DeepSeek + Elasticsearch 9.x
大数据·elasticsearch·django
yumgpkpm4 天前
AI视频生成:Wan 2.2(阿里通义万相)在华为昇腾下的部署?
人工智能·hadoop·elasticsearch·zookeeper·flink·kafka·cloudera
予枫的编程笔记4 天前
【Kafka高级篇】避开Kafka原生重试坑,Java业务端自建DLQ体系,让消息不丢失、不积压
java·kafka·死信队列·消息中间件·消息重试·dlq·java业务开发
倚肆4 天前
在 Windows Docker 中安装 Kafka 并映射 Windows 端口
docker·kafka