MongoDB 副本集搭建与 Monstache 实时同步 Elasticsearch 全流程教程

1. MongoDB 副本集安装

1.1 项目结构

bash 复制代码
monstache-sync/
├── docker-compose.yml
├── init-replica.js
├── mongo-keyfile  

1.1 创建 mongo-keyfile

MongoDB 副本集需要共享认证密钥。创建密钥文件:

bash 复制代码
sudo openssl rand -base64 756 | tr -d '\n' > mongo-keyfile
chmod 600 mongo-keyfile
chown 999:999 mongo-keyfile

1.2 创建 init-replica.js

副本集初始化脚本:

javascript 复制代码
rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongo1:27017" },
    { _id: 1, host: "mongo2:27017" },
    { _id: 2, host: "mongo3:27017" }
  ]
})

1.3 docker-compose.yml

yaml 复制代码
services:
  mongo1:
    image: mongo:latest
    container_name: mongo1
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 123456
    command: ["mongod", "--replSet", "rs0", "--auth", "--keyFile", "/etc/mongo-keyfile"]
    volumes:
      - ./data/mongo1:/data/db
      - ./mongo-keyfile:/etc/mongo-keyfile:ro
    networks:
      - mongo-cluster

  mongo2:
    image: mongo:latest
    container_name: mongo2
    ports:
      - 27018:27017
    command: ["mongod", "--replSet", "rs0", "--auth", "--keyFile", "/etc/mongo-keyfile"]
    volumes:
      - ./data/mongo2:/data/db
      - ./mongo-keyfile:/etc/mongo-keyfile:ro
    networks:
      - mongo-cluster

  mongo3:
    image: mongo:latest
    container_name: mongo3
    ports:
      - 27019:27017
    command: ["mongod", "--replSet", "rs0", "--auth", "--keyFile", "/etc/mongo-keyfile"]
    volumes:
      - ./data/mongo3:/data/db
      - ./mongo-keyfile:/etc/mongo-keyfile:ro
    networks:
      - mongo-cluster

  mongo-init-replica:
    image: mongo:latest
    container_name: mongo-init-replica
    depends_on:
      - mongo1
      - mongo2
      - mongo3
    volumes:
      - ./init-replica.js:/init-replica.js
      - ./mongo-keyfile:/etc/mongo-keyfile:ro
    entrypoint: ["bash", "-c", "sleep 5 && mongosh --host mongo1 --username root --password 123456 --authenticationDatabase admin /init-replica.js"]
    networks:
      - mongo-cluster

networks:
  mongo-cluster:
    driver: bridge

1.4 启动副本集

monstache-sync 目录下运行:

bash 复制代码
docker-compose up -d

5. 验证副本集是否初始化成功

进入 mongo1

bash 复制代码
docker exec -it mongo1 mongosh -u root -p 123456 --authenticationDatabase admin

然后执行:

js 复制代码
rs.status()

2. 配置 Monstache 同步服务

2.1 项目结构

bash 复制代码
monstache-sync/
├── config.toml

2.2 创建config.toml

yaml 复制代码
# 连接 MongoDB (其中mongo1是容器名,可替换为实际的IP,不是同一个网络内)
mongo-url = "mongodb://root:123456@mongo1:27017/admin"

# 连接 Elasticsearch (真实的IP或者容器名,但是容器名确保同一个网络)
elasticsearch-urls = ["http://192.168.167.175:9200"]
# Elasticsearch 用户名
elasticsearch-user = "elastic" 
# Elasticsearch 密码
elasticsearch-password = "someliber"

# 启动时一次性全量读取 MongoDB 数据写入 Elasticsearch(格式为 数据库.集合)
direct-read-namespaces = ["test.records"]
# 实时监听 MongoDB 变更(需要副本集)插入、更新、删除会自动同步到 Elasticsearch
change-stream-namespaces = ["test.records"]

# 写入 Elasticsearch 时仅更新变动字段(节省 IO)
index-as-update = true

# 断点续传设置(推荐开启)
resume = true
resume-name = "default"
resume-strategy = 1

# 批处理优化(适合千万级别数据)
direct-read-concur = 4

# 启用统计信息输出
stats = true
index-stats = false

[[mapping]]
namespace = "test.records"
index = "records_index"  # 设置 ES 中的目标索引名

更多配置参考:https://rwynn.github.io/monstache-site/config

2.3 启动monstache

2.3.1 如果使用的是 Docker 内部 MongoDB 副本集
bash 复制代码
docker run -d   --name monstache   --network monstache-sync_mongo-cluster   -v $(pwd)/config.toml:/config.toml   rwynn/monstache:6.7.22   -f /config.toml

注意:--network 必须是 docker-compose 自动创建的网络名称,可用 docker network ls 查看。

2.3.2 如果 MongoDB 是物理机(非 Docker)
bash 复制代码
docker run -d   --name monstache  -v $(pwd)/config.toml:/config.toml   rwynn/monstache:6.7.22   -f /config.toml

3. 使用 Kibana 验证同步效果

3.1 查询索引信息

Kibana → Dev Tools:

bash 复制代码
# 查看ES全部索引,是否存在records_index索引
GET /_cat/indices
# 查看records_index索引的结构是否跟数据库结构一致。
GET /records_index/_mapping
# 查看records_index索引下的全部文档数,即数据量
GET /records_index/_count
# 查看records_inde索引的前10条数据
GET /records_index/_search

3.2 数据同步验证

插入新数据

Mongo 中插入新记录:

复制代码
db.records.insertOne({ name: "Test", value: 123 })

然后检查 Kibana/records_index/_count是否增加。

修改已有数据

Mongo 中更新字段:

复制代码
db.records.updateOne({ name: "Test" }, { $set: { value: 456 } })

Kibana 中再次 /records_index/_search,确认是否同步更新。

4.总结

本案例实现了:

(1)MongoDB 副本集部署与认证配置

(2)实时监听 MongoDB 的变更

(3)自动同步到 Elasticsearch

(4)支持断点续传、增量更新

(5)可结合 Kibana 做可视化分析

相关推荐
牛奶咖啡132 分钟前
MySQL InnoDB Cluster 高可用集群部署与应用实践(下)
数据库·mysql·innodb cluster·mysql router·mysql路由的安装部署·mysql路由的测试·mgr组复制
凯子坚持 c1 小时前
Docker 深度解析:从虚拟化到新一代应用构建、运行与交付
运维·docker·容器
姚远Oracle ACE2 小时前
解读Oracle AWR报告:Global Cache and Enqueue Services - Workload Characteristics
数据库·oracle
流星白龙2 小时前
【Qt】7.信号和槽_connect函数用法(2)
java·数据库·qt
麦麦麦造4 小时前
小小 Postgres,何以替代 Redis、MongoDB 甚至 ES?
redis·mongodb·elasticsearch·postgresql
Zzz 小生4 小时前
Claude Code学习笔记(四)-助你快速搭建首个Python项目
大数据·数据库·elasticsearch
nongcunqq8 小时前
abap 操作 excel
java·数据库·excel
rain bye bye8 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
斯普信专业组9 小时前
使用Reindex迁移Elasticsearch集群数据详解(下)
大数据·elasticsearch
伊成9 小时前
细说Docker命令
docker·容器·eureka