mameng 2020-05-12
入行 Elastic-Stack 技术栈很久了,为了免于知识匮乏眼光局限,有必要到外面的世界看看,丰富自己的世界观。
图片来自 Pexels
本篇内容从 Elastic 的竞争产品角度分析探讨:
Elasticsearch 当前热度排名很高
本文仅代表个人的观点,不代表社区技术阵营观点,无意口水之争,限于本人的经验知识有限,可能与读者观点认知不一致。
竞争产品
Elasticseach 从做搜索引擎开始,到现在主攻大数据分析领域,逐步进化成了一个全能型的数据产品。
在 Elasticsearch 诸多优秀的功能中,与很多数据产品有越来越多的交叉竞争,有的功能很有特色,有的功能只是附带,了解这些产品特点有助于更好的应用于业务需求。
Elasticsearch 竞争图谱示意图
Lucene
Lucene 是一个搜索的核心库,Elastic 也是在 Lucene 基础之上构建,它们之间的竞争关系是由 Lucene 本身决定的。
在互联网 2.0 时代,考验各互联网公司最简单的技术要求,就是看他们的搜索做的怎么样,那时大家的做法几乎一样,都基于 Lucene 核心库构建一套搜索引擎,剩下的就看各公司的开发者们的水平。
笔者有幸在 2012 年之前,基于 Lucene 做过垂直行业的搜索引擎,遇到很多问题有必要说一下:
Lucene 内部索引构建与查询过程
Elasticsearch 与 Lucene 核心库竞争的优势在于:
Elastic 近年的快速发展,市面上已经很少发现基于 Lucene 构建搜索引擎的项目,几乎清一色选择 Elasticsearch 作为基础数据库服务。
由于其开源特性,广大云厂商也在此基础上定制开发,与自己的云平台深度集成,但也没有独自发展一个分支。本次的竞争中,Elasticsearch 完胜。
Solr
Solr 是第一个基于 Lucene 核心库功能完备的搜索引擎产品,诞生远早于 Elasticsearch。
早期在全文搜索领域,Solr 有非常大的优势,几乎完全压倒 Elastic,在近几年大数据发展时代,Elastic 由于其分布式特性,满足了很多大数据的处理需求。
特别是后面 ELK 这个概念的流行,几乎完全忘记了 Solr 的存在,虽然也推出了 Solr-Coud 分布式产品,但已经基本无优势。
接触过几个数据类公司,全文搜索都基于 Solr 构建,且是单节点模式,偶然出现一些问题,找咨询顾问排查问题,人员难找,后面都迁移到 Elasticsearch 之上。
现在市面上几乎大大小小公司都在使用 Elasticsearch,除了老旧系统有的基于 Solr 的,新系统项目应该全部是 Elasticsearch。
个人认为有以下几个原因:
Solr 产品功能模块内部架构图
本次竞争中,Elasticsearch 完胜。
RDBMS
关系型数据库与 Elasticsarch 相比主要优点是事务隔离机制无可替代,但其局限性很明显。
主要几个方面如下:
若数据无需严格事务机制隔离,个人认为都可以采用 Elasticsearch 替代。若数据既要事务隔离,也要查询性能,可以采用 DB 与 ES 混合实现。
RDBMS 与 ES 各自优势示意图
OpenTSDB
OpenTSDB 内部基于 HBase 实现,属于时间序列数据库,主要针对具有时间特性和需求的数据,进行过数据结构的优化和处理,从而适合存储具有时间特性的数据,如监控数据、温度变化数据等。
小米公司开源监控体系 open-falcon 的就是基于 OpenTSDB 实现。
OpenTSDB 时间序列数据库内部实现
Elastic 产品本身无意时间序列这个领域,随着 ELK 的流行,很多公司采用ELK来构建监控体系,虽然在数值类型上不像时间序列数据库做过特别处理,但由于其便利的使用,以及生态技术栈的优势,我们也接受了这样的事实。
Elasticsearch 构建时间序列很简单,性能也相当不错:
HBase
HBase 是列式数据库的代表,其内部有几个致命设计大大限制了它的应用范围:
关于其各种技术原理就不多说了,说说它的一些使用情况。
公司所属物流速运行业,一个与车辆有关的项目,记录所有车辆行驶轨迹,车载设备会定时上报车子的轨迹信息,后端数据存储基于 HBase,数据量在几十 TB 级以上。
由于业务端需要依据车辆轨迹信息计算它的公里油耗以及相关成本,所以要按查询条件批量查询数据,查询条件有一些非 Rowkey 的字段,如时间范围,车票号,城市编号等,这几乎无法实现,原来暴力的做过,性能问题堪忧。
此项目的问题首先也在于 Rowkey 难设计满足查询条件的需求,其次是二级索引问题,查询的条件很多。
如果用列式数据库仅限于 Rowkey 访问场景,其实采用 Elastic 也可以,只要设计好 _id,与 HBase 可以达到相同的效果。
如果用列式数据库查询还需要引入三方组件,那还不如直接在 Elasticsearch 上构建更直接。
除非对使用列式数据库有非常苛刻的要求,否则 Elasticsearch 更具备通用性,业务需求场景适用性更多。
列式数据库内部数据结构示意图
MongoDB
MongoDB 是文档型数据库的代表,数据模型基于 Bson,而 Elasticsearch 的文档数据模型是 Json,Bson 本质是 Json 的一种扩展,可以相互直接转换,且它们的数据模式都是可以自由扩展的,基本无限制。
MongoDB 本身定位与关系型数据库竞争,支持严格的事务隔离机制,在这个层面实际上与 Elasticsearch 产品定位不一样,但实际工作中,几乎没有公司会将核心业务数据放在 MongoDB 上,关系型数据库依然是第一选择。
若超出这个定位,则 Elasticsearh 相比 MongoDB 有如下优点:
公司刚好有个项目,原来数据层基于 MongoDB 设计构建的,查询问题不少 ,后面成功迁移到 Elasticsearch 平台上,服务器数据量从 15 台降低到 3 台,查询性能还大幅度提升十倍。
详细可阅读笔者另一篇文章《为什么要从MongoDB迁移到Elasticsearch?》抛开数据事务隔离,Elasticsearch 可以完全替代 MongoDB。
ClickHouse
ClickHouse 是一款 MPP 查询分析型数据库,近几年活跃度很高,很多头部公司都引入其中。
我们为什么要引入呢,原因可能跟其他头部公司不太一样,如下:
ClickHouse 与 Elasticsearch 一样,都采用列式存储结构,都支持副本分片。
不同的是 ClickHouse 底层有一些独特的实现,如下:
ClickHouse 在大数据平台中的位置
Druid
Durid 是一个大数据 MPP 查询型数据产品,核心功能 Rollup,所有的需要 Rollup 原始数据必须带有时间序列字段。
Elasticsearch 在 6.3.X 版本之后推出了此功能,此时两者产品形成竞争关系,谁高谁下,看应用场景需求。
Druid 样本数据,必须带有 time 时间字段。
笔者之前负责过公司所有 Elasticsearch 技术栈相关数据项目,当时也有碰到一些实时聚合查询返回部分数据的需求。
但我们的需求不太一样,索引数据属于离线型更新,每天都会全部删除并重新创建索引插入数据。
此时使用 Elastic 的版本是 6.8.X,仅支持离线型数据 Rollup,所以此功能没用上,Elastic 在 7.2.X 版本之后才推出实时 Rollup 功能。
Druid 更加专注,产品设计围绕 Rollup 展开,Elastic 只是附带。
Druid 支持多种外接数据,直接可以对接 Kafka 数据流,也可以直接对接平台自身内部数据;而 Elastic 仅支持内部索引数据,外部数据需要借助三方工具导入到索引里。
Druid 在数据 Rollup 之后,会丢弃原始数据;Elastic 在原有索引基础之后,生成新的 Rollup 之后的索引数据。
Druid 与 Elastic 的技术架构非常类似,都支持节点职责分离,都支持横向扩展。
Druid 与 Elastic 在数据模型上都支持倒排索引,基于此的搜索与过滤。
Druid 产品技术架构体系示意图
关于 Rollup 这个大数据分析领域,若有大规模的 Rollup 的场景需求,个人更倾向于 Druid。
结语
总结:
注:内容来源于笔者实际工作中运用多种技术栈实现场景需求,得出的一些实战经验与总结思考,提供后来者借鉴参考。
本文围绕 Elastic 的竞争产品对比仅限概要性分析,粒度较粗,深度有限,之后会有更加专业深入竞争产品分析文章,敬请期待。
作者:李猛(ynuosoft)
简介:Elastic-stack 产品深度用户,ES 认证工程师,2012 年接触 Elasticsearch,对 Elastic-Stack 开发、架构、运维等方面有深入体验,实践过多种 Elasticsearch 项目,最暴力的大数据分析应用,最复杂的业务系统应用;业余为企业提供 Elastic-Stack 咨询培训以及调优实施。
编辑:陶家龙
另外一部分,则需要先做聚类、分类处理,将聚合出的分类结果存入ES集群的聚类索引中。数据处理层的聚合结果存入ES中的指定索引,同时将每个聚合主题相关的数据存入每个document下面的某个field下。