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,能够看到数据已经同步到这上面了

相关推荐
Msshu1231 小时前
Type-C PD快充协议 PD快充诱骗协议芯片 PD/QC/FCP/SCP/AFC电压诱骗芯片
mongodb·zookeeper·eureka·kafka·consul
Elasticsearch1 小时前
使用 LangGraph . js 和 Elasticsearch 构建一个金融 AI 搜索工作流
elasticsearch
武子康2 小时前
大数据-175 Elasticsearch Term 精确查询与 Bool 组合实战:range/regexp/fuzzy 全示例
大数据·后端·elasticsearch
失伟2 小时前
kafka教程(新手使用单机版)
分布式·kafka
java_logo3 小时前
Apache Kafka Docker 容器化部署指南
运维·docker·云原生·容器·kafka·kubernetes·apache
写bug的小屁孩4 小时前
5.Kafka-HW重要特性与场景分析
分布式·中间件·kafka
悟悟悟!4 小时前
git使用笔记:git日常工作流和命名规范
笔记·git·elasticsearch
漏洞文库-Web安全4 小时前
CTFHub 信息泄露通关笔记9:Git泄露 Index - 指南
笔记·git·安全·web安全·elasticsearch·网络安全·ctf
写bug的小屁孩4 小时前
3.Kafka-数据存储流程
分布式·中间件·kafka