MongoDB与ES同步

5 ways to synchronize data from MongoDb to ElasticSearch

1.Server同步

jktJRP.jpg

在服务端(Spring Boot或Spring Cloud)对MongoDB进行CRUD操作时,同时对ES进行相同操作。

优点:对两者同时操作,代码层面解决同步问题。

缺点:

  1. 服务端改动较大,可以在common模块中集成对两种数据库的CUD操作
  2. 可靠性一般,任一方CUD操作出现问题时,可能会产生数据不一致问题
  3. 对Server的性能开销较大,得同时操作两种数据库

2.手动同步+增量更新

Transporter可以将数据从MongoDB同步到ES,但重要的是Transporter只同步一次。当工作完成时,Transporter的工作就结束了。无法实现增量同步

Change Stream是MongoDB从3.6开始支持的新特性。可以实现增量同步。

jktyR0.jpg

MongoDB Change Stream初体验

3.ES插件

ES有一个插件叫elasticsearch-river-mongodb,在ES 1.x中被广泛使用,但在ES 2.x被弃用。如果使用ES 1.x,可以使用这个插件。

jkt6zV.jpg

4.JDBC input plugin for logstash

通过添加一个Mongo输入和ES输出插件,我们可以利用logstash存储的缓冲、输入、输出和过滤功能来完成这项工作。

实际上是定时从mongo中获取新数据写入es。如果在mongo中更新或删除数据,es中是不会跟着变化的。大量的冗余数据传输,实时性差,仅适用于少量数据。

JDBC输入插件是一种选择,但它需要JDBC驱动程序的支持。MongoDB没有得到良好支持的免费JDBC驱动程序。

jktsGq.jpg

5.Mongo-ES connector

使用Mongo-connector同步ES

Mongo-connector是一个python包的实时同步服务。它创建了一个从mongodb集群到一个或多个目标系统的管道。它需要mongo在replica-set模式下运行,同步mongo中的数据到目标,然后跟踪Mongo oplog,实时跟踪MongoDB中的操作。它需要一个名为“elastic2_doc_manager”的包来将数据写入ES。

jktrin.jpg

6.Monstache

通过Monstache实时同步MongoDB数据到阿里云ES - 检索分析服务Elasticsearch版 - 阿里云

Monstache使用MongoDB oplog作为事件源。需要确保MongoDB通过部署副本集来配置为生成oplog。

  • MongoDB、阿里云ES及Monstache服务部署在专有网络VPC(Virtual Private Cloud)内,所有数据私网通信,高速且安全。

  • Monstache基于MongoDB的oplog实现实时数据同步及订阅,支持MongoDB与高版本ES之间的数据同步,同时支持MongoDB的变更流和聚合管道功能,并且拥有丰富的特性

  • Monstache不仅支持软删除和硬删除,还支持数据库删除和集合删除,能够确保ES端实时与源端数据保持一致。

jktBIs.jpg

Mongo-ES connector和Monstache都是使用MongoDB oplog作为事件源,基于MongoDB的replica进行同步,因为多加了一个副本集,所以有数据冗余的问题。connector使用python开发,monstache使用Go语言开发。

7.netcore

基于netcore实现mongodb和ElasticSearch之间的数据实时同步的工具(Mongo2Es)

Mongo2Es是用来保持你的mongoDB collections和你的elasticsearch index之间的数据实时同步.它是用mongo oplog来监听你的mongdb数据是否发生变化,无论是增删改查它都会及时反映到你的elasticsearch index上.在使用本工具之前你必须保证你的mongoDB是符合replica结构的,如果不是请先正确设置之后再使用此工具.

img

支持一对一,一对多,多对一和多对多的数据传输方式.

  • 一对一 - 一个mongodb的collection对应一个elasticsearch的index之间的数据同步

  • 一对多 - 一个mongodb的collection对应多个elasticsearch的index之间的数据同步

  • 多对一 - 多个mongodb的collection对应一个elasticsearch的index之间的数据同步

  • 多对多 - 多个mongodb的collection对应多个elasticsearch的index之间的数据同步

这个工具是GitHub上开源的一个工具,地址是:https://github.com/SnailDev/SnailDev.Mongo2Es

使用C#开发的,就是不知道靠不靠谱

8.mongo-sync-elasticsearch

https://github.com/levonmo/mongo-sync-elasticsearch

mongodb数据同步到elasticsearch的中间件,支持全量,增量(新增修改删除),实时同步等多种同步情景。(sync MongoDB to Elasticsearch in realtime) (MongoDB sync to es/Elasticsearch)

Go语言开发,不知道靠不靠谱

综上所述

  1. Server同步的好处是同步方式都是自己定义的,灵活,可控,缺点是得写大量的开发代码
  2. elasticsearch-river-mongodb在ES2.x已经被弃用了,不推荐
  3. JDBC input plugin for logstash需要JDBC支持,不推荐
  4. netcore和mongo-sync-elasticsearch都是个人开源的工具,支持不好,不太推荐

推荐以下:

  1. Monstache,支持好,阿里云比较承认
  2. Mongo-connector
  3. 上述第二条,先手动同步,再增量更新,我自己想出来的,不知道这样靠不靠谱