弃用MongoDB使用ES后的好处有哪些

发布时间:2021-09-29 10:43:40 作者:柒染
来源:亿速云 阅读:172

弃用MongoDB使用ES后的好处有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

序言

弃用MongoDB使用ES后的好处有哪些

图示:MongoDB与Elasticsearch热度排名

围绕两个话题展开:

为什么要从MongoDB迁移到Elasticsearch?

如何从MongoDB迁移到Elasticsearch?

现状背景

MongoDB本身定位与关系型数据库竞争,但工作中几乎没有见到哪个项目会将核心业务系统的数据放在上面,依然选择传统的关系型数据库。

1、项目背景

公司所在物流速运行业,业务系统复杂且庞大,用户操作者很多,每日有大量业务数据产生,同时业务数据会有很多次流转状态变化,为了便于记录追踪分析,系统操作日志记录项目应运而生,考虑到原有的日均数据量,操作日志数据基于MongoDB存储。

操作日志记录系统需要记录两种数据,如下说明:

1)变更主数据,什么人在什么时间在系统哪个模块做了什么操作,数据编号是什么,操作跟踪编号是什么。

{   "dataId": 1,    "traceId": "abc",           "moduleCode": "crm_01",              "operateTime": "2019-11-11 12:12:12",    "operationId": 100,   "operationName": "张三",   "departmentId": 1000,   "departmentName": "客户部",   "operationContent": "拜访客户。。。" }

2)变更从数据,实际变更数据的变化前后,此类数据条数很多,一行数据多个字段变更就记录多条。

[   {     "dataId": 1,     "traceId": "abc",     "moduleCode": "crm_01",     "operateTime": "2019-11-11 12:12:12",     "operationId": 100,     "operationName": "张三",     "departmentId": 1000,     "departmentName": "客户部",     "operationContent": "拜访客户",          "beforeValue": "20",     "afterValue": "30",     "columnName": "customerType"   },   {     "dataId": 1,     "traceId": "abc",     "moduleCode": "crm_01",     "operateTime": "2019-11-11 12:12:12",     "operationId": 100,     "operationName": "张三",     "departmentId": 1000,     "departmentName": "客户部",     "operationContent": "拜访客户",          "beforeValue": "2019-11-02",     "afterValue": "2019-11-10",     "columnName": "lastVisitDate"   } ]

2、项目架构

项目架构描述如下:

弃用MongoDB使用ES后的好处有哪些

图示:操作日志记录业务流程说明

3、MongoDB架构

集群架构说明:

弃用MongoDB使用ES后的好处有哪些

问题说明

MongoDB的信徒们可能怀疑我们没有使用好,或者我们的运维能力欠缺,或者认为我们有Elasticsearch的高手在。不是这样的,弃用MongoDB选择Elasticsearch其实并非技术偏见问题,而是我们的实际场景需求,原因如下:

1、搜索查询

2、技术栈成熟度

3、文档格式相同

MongoDB与Elasticsearch都属于文档型数据库  ,Bson类同与Json,_objectid与_id原理一样,所以主数据与从数据迁移到Elasticsearch平台,数据模型几乎无需变化。

迁移方案

异构数据系统迁移,主要围绕这两大块内容展开:

1、Elastic容量评估

原有MongoDB集群采用了15台服务器,其中9台是数据服务器,迁移到Elastic集群需要多少台服务器?我们采取简单推算办法,如假设生产环境上某个MongoDB集合的数据有10亿条数据,  我们先在测试环境上从MongoDB到ES上同步100万条数据,假设这100万条数据占用磁盘10G,那生产上环境上需要1个T磁盘空间,然后根据业务预期增加量扩展一定冗余。根据初步评估,Elastic集群设置3台服务器,  配置8c/16g内存/2T机械磁盘。服务器数量一下从15台缩减到3台,且配置也降低不少。

2、Elastic索引规则

系统操作日志是时序性数据,写完整后基本上无需再次修改。操作日志记录查询主要是当月的居多,后续的历史性数据查询频率很低,根据评估,核心数据索引按月创建生成,  业务查询时候必须带上操作时间范围,后端根据时间反推需要查询哪些索引,Elastic-Api支持多索引匹配查询,完美利用Elastic的特性解决跨多个月份的查询合并。对于非核心数据索引,按年创建索引生成足以。

弃用MongoDB使用ES后的好处有哪些

图示:Elastic操作日志索引创建规则

3、核心实现逻辑设计

Elasticsearch不是关系型数据库,不具备事务的机制。操作日志系统的数据来源都是Kafka,消费数据是有顺序机制的,有2种场景特别注意,如下:

Elasticsearch索引数据更新是近实时的刷新机制,数据提交后不能马上通过Search-Api查询到,主记录的数据如何更新到从记录呢?而且业务部门不规范的使用,多条主记录的dataId和tracId可能一样。

由于主数据与从数据关联字段是dataId和traceId。如果主数据与从数据在同时达到操作日志系统,基于update_by_query 命令肯定失效不  准确, 主从数据也可能是多对多的关联关系,dataId 和traceId不能唯一决定一条记录。

Elasticsearch其实也是一个NoSQL数据库, 可以做key-value缓存。这时新建一个Elastic索引作为中间缓存,  原则是主数据与从数据谁先到缓存谁,索引的 _id=(dataId+traceId) , 通过这个中间索引可以找到主数据记录的Id或者从记录Id,  索引数据模型多如下,detailId为从索引的_id的数组记录。

{   "dataId": 1,   "traceId": "abc",   "moduleCode": "crm_01",   "operationId": 100,   "operationName": "张三",   "departmentId": 1000,   "departmentName": "客户部",   "operationContent": "拜访客户",   "detailId": [     1,     2,     3,     4,     5,     6   ] }

前面我们讲过主记录和从记录都是一个Kafka的分区上,我们拉一批数据的时候,操作ES用的用到的核心API:

#批量获取从索引的记录 _mget  #批量插入 bulk #批量删除中间临时索引 _delete_by_query

迁移过程

1、数据迁移

选择DataX作为数据同步工具由以下几个因素:

弃用MongoDB使用ES后的好处有哪些

图示:DataX同步数据示意图

2、迁移索引设置

临时修改索引的一些设置,当数据同步完之后再修改回来,如下:

"index.number_of_replicas": 0,  "index.refresh_interval": "30s",  "index.translog.flush_threshold_size": "1024M"  "index.translog.durability": "async",  "index.translog.sync_interval": "5s"

3、应用迁移

操作日志项目采用Springboot构建,增加了自定义配置项,如下:

#应用写入mongodb标识 writeflag.mongodb: true #应用写入elasticsearch标识 writeflag.elasticsearch: true

项目改造说明:

弃用MongoDB使用ES后的好处有哪些

图示:应用平衡迁移

结语

1、迁移效果

弃用MongoDB使用ElasticSearch作为存储数据库,服务器从原来的15台MongoDB,变成了3台ElasticSearch,每月为公司节约了一大笔费用。同时查询性能提高了10倍以上,而且更好的支持了各种查询,得到了业务部门的使用者,运维团队和领导的一致赞赏。

2、经验总结

整个项目前后历经几个月,多位同事参与,设计、研发,数据迁移、测试、数据验证、压测等各个环节。技术方案不是一步到位,中间也踩了很多坑,最终上线了。ES的技术优秀特点很多,灵活的使用,才能发挥最大的威力。

关于弃用MongoDB使用ES后的好处有哪些问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. GitHub:我们是这样弃用jQuery的
  2. IOS 8弃用api

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mongodb elasticsearch

上一篇:如何编写.NET事件监听机制的局限与扩展

下一篇:有用的PHP代码片段总结

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》