同步数据目前看有两种方式

  1. 在mongodb 的操作后加入 对es 的同步,
  2. 读取mongodb的 oplog然后间接同步数据

第一种 目前 有两种思路,1是在代码里面修改逻辑,加入对es的同步,第二种 就是 使用Mongose的插件,比如这个mongoosastic 不过作者已经不维护了,在找人维护,我没具体试过
第二种 查出来,有几个工具 ,
a. mongo-connector 可以将mongo的数据向多种数据库同步,比如 es ,mysql, influxdb等,但是也比较老了,据说还有很多坑
b. mongo-es 国内一个公司出品,只能 mongo向es同步
具体对比可以看看这篇文章

正文开始了,

先看mongo-es的官方文档,除开 es和mongo的连接配置不谈, 主题还是对 task的配置

task主要是每个collection对应的数据如何存储到es
from 配置

  • phase [scan, tail] scan是全量更新,tail是 从设置的时间开始更新
  • time 上述配置的时间
  • id scan时 从哪条id开始

extract

  • db 数据库名称
  • collection
  • project 筛选条件

transform

  • mapping mongo字段和es字段的映射关系
  • parent 指定es的 _parent字段

load

  • index 指定index名称
  • type
  • body 指定es的字段类型 如果是列表 指明为object

第一个坑来了, load里面的body字段, 实际上定义的是es的mapping属性,如果这里配置不好,可能会导致es 搜索不出来数据,

{
    "load":{
        "body":{
            "dynamic": true
        }
    }
}

这里的dynamic 一定要填true, 它实际上定义的是 es里面的文档字段是否可以被索引,如果是false,那么 使用了条件的es查询将查不出来数据
第二呢,mongodb里面的字段 和es的字段一定要一一对应才能同步,这样确实不错,但是懒癌发作,吧这个项目clone 下来,自己改了一波 ,直接同步所有字段
项目发布之后 叫 wy-mongo-es

第三,由于上面的魔改了,导致出现了一些小bug,比如mongodb update字段无法同步的问题, 这边我都在魔改的项目里面修复了

第四,任务全量复制时,指定id 也无法全量同步数据的问题, 仔细研究了一波,伪代码大概是这样的

    db.collection().find({_id: {
        gte: new ObjectID(id)
    }})

如果你的表里面的id 不是objecid,这里会导致无法查询到数据--,这就很尴尬了,我改成直接用string了, 当然也发布到 魔改项目里面了。