场景:菜鸡一枚,我有一个使用 es 的场景,是一个检索系统,检索的要求比较高,关系型数据库无法满足。数据源是外部的 xml 文件,数据量第一次 400w 左右,后续每天会几千的数据增量更新,增量数据也是来源 xml 文件。
我的想法有两个: 方式一,分两个阶段:目前是打算先将文件解析到数据库(已经实现解析到数据库,主表 400w ,关联表 1000w,400w,700w 不等),只同步关键索引字段,检索时拿到主键再通过主键查询从数据库组装数据做详情展示。通过定时任务 update_time 或者触发方式直接调用 es 的 api 将数据同步到 es 目前存在的问题: 1.数据不在一个表里,还需要做一些联表查询,数据处理,再同步到 es ,方便做检索,打算只做一个嵌套索引。系统会做一些更新操作也希望能同步到 es 2.数据一致性保难保证?
方式二,解析文件的时候,直接将数据双写,一边写 mysql ,一边组装后调 es api 写到 es 想到可能存在的问题: 1.如果解析过程其中一个发生异常,是不是得手动处理脏数据 2.这种方式是不是得引入消息 mq ?先写到 mq ,再消费 mq 处理数据后写到 es (我这个数据量这样有必要吗) 3.一次到位好像更方便,系统操作有更新还需要将更新同步到 es
@findlisa 我也做过类似的需求,我是先写库,然后再通过脚本,全量和增量写入 ES ,最终数据以数据库为准,数据库有插入或者更新或者删除,就在操作库成功之后再同样操作 ES 。实时性要求不高的话,就慢慢调 ES 接口往 ES 里刷就行,没有运维团队的话,额外引入的中间件越多,自己维护的越麻烦,系统写的也越复杂。