同步数据目前看有两种方式
- 在mongodb 的操作后加入 对es 的同步,
- 读取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了, 当然也发布到 魔改项目里面了。