文章目录
- 一、概述
- 二、环境装备
- 三、实现过程
-
- [3.1 mongodb配置副本集](#3.1 mongodb配置副本集)
- [3.2 安装连接器插件](#3.2 安装连接器插件)
- [3.3 配置启动连接器](#3.3 配置启动连接器)
一、概述
由于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,能够看到数据已经同步到这上面了
