Elasticsearch用得好,下班下得早!
入行 Elastic-Stack 技术栈很久了,为了免于知识匮乏眼光局限,有必要到外面的世界看看,丰富自己的世界观。
图片来自 Pexels
本篇内容从 Elastic 的竞争产品角度分析探讨:
哪些应用场景下使用 Elasticsearch 最佳?
哪些应用场景下不使用 Elasticsearch 最好?
Elasticsearch 当前热度排名很高
竞争产品
在 Elasticsearch 诸多优秀的功能中,与很多数据产品有越来越多的交叉竞争,有的功能很有特色,有的功能只是附带,了解这些产品特点有助于更好的应用于业务需求。
Lucene
项目基于 Lucene 包装,业务代码与核心库一起构建发布,代码耦合度很高,每次有数据字段变更,都需要重新编译打包发布,这个过程非常的繁琐,且相当危险。
程序重新发布,需要关闭原有的程序,涉及到进程切换问题。
索引数据定期全量重新生成,也涉及到新旧索引切换,索引实时刷新等问题,都需要设计一套复杂的程序机制保障
每个独立业务线需求,都需要单独构建一个 Lucene 索引进程,业务线多了之后,管理是个麻烦的事情
当单个 Lucene 索引数据超过单实例限制之后,需要做分布式,这个原有 Lucene 是没有办法的,所以常规的做法也是按照某特定分类,拆分成多个索引进程,客户端查询时带上特定分类,后端根据特定分类路由到具体的索引。
Lucene 库本身的掌控难度,对于功力尚浅的开发工程师,需要考虑的因素实在太多了,稍微不慎,就会出现很大的程序问题。
完美封装了 Lucene 核心库,设计了友好的 Restful-API,开发者无需过多关注底层机制,直接开箱即用。
分片与副本机制,直接解决了集群下性能与高可用问题。
Solr
ES 比 Solr 更加友好简洁,门槛更低。
ES 比 Solr 产品功能特点更加丰富,分片机制,数据分析能力。
ES 生态发展,Elastic-stack 整个技术栈相当全,与各种数据系统都很容易集成。
ES 社区发展更加活跃,Solr 几乎没有专门的技术分析大会。
RDBMS
关系型数据库查询性能,数据量超过百万级千万级之后下降厉害,本质是索引的算法效率不行,B+ 树算法不如倒排索引算法高效。
关系型数据库索引最左原则限制,查询条件字段不能任意组合,否则索引失效,相反 Elasticserach 可以任意组合,此场景在数据表关联查询时特别明显,Elasticsearch 可以采用大宽表解决,而关系型数据库不能。
关系型数据库分库分表之后多条件查询,难于实现,Elasticsearch 天然分布式设计,多个索引多个分片皆可联合查询。
关系型数据库聚合性能低下,数据量稍微多点,查询列基数多一点性能下降很快,Elasticsearch 在聚合上采用的是列式存储,效率极高。
关系型数据库侧重均衡性,Elasticsearch 侧重专一查询速度。
若数据无需严格事务机制隔离,个人认为都可以采用 Elasticsearch 替代。若数据既要事务隔离,也要查询性能,可以采用 DB 与 ES 混合实现。
OpenTSDB
小米公司开源监控体系 open-falcon 的就是基于 OpenTSDB 实现。
索引创建规则,可以按年、按月、按周、按星期、按天、按小时等都创建索引,非常便利。
数据填充方面,定制一个时间字段做区分排序,其余的字段无需。
数据查询方面,除了按实际序列查询外,还可以有更多的搜索条件。
HBase
访问 HBase 数据只能基于 Rowkey,Rowkey 设计的好坏直接决定了HBase使用优劣。
本身不支持二级索引,若要实现,则需要引入第三方。
如果用列式数据库查询还需要引入三方组件,那还不如直接在 Elasticsearch 上构建更直接。
除非对使用列式数据库有非常苛刻的要求,否则 Elasticsearch 更具备通用性,业务需求场景适用性更多。
MongoDB
文档查询性能,倒排索引/KDB-Tree 比 B+Tree 厉害。
数据的聚合分析能力,ES 本身提供了列式数据 doc_value,比 MongoDB 的行式要快不少。
集群分片副本机制,ES 架构设计更胜一筹。
ES 特色功能比 MongoDB 提供的更多,适用的场景范围更宽泛。
文档数据样例,ObjectId 由 MongoDB 内置自动生成。
ClickHouse
笔者长期从事大数据工作,经常会碰到数据聚合的实时查询需求,早期我们会选择一款关系型数据库来做做聚合查询,如 MySQL/PostgreSQL,稍微不注意就很容易出现性能瓶颈。
后面引入 Elasticsearch 产品,其基于列式设计以及分片架构,性能各方面确实明显优于单节点的关系型数据库。
Elasticsearch 局限性也很明显,一是数据量超过千万或者亿级时,若聚合的列数太多,性能也到达瓶颈;二是不支持深度二次聚合,导致一些复杂的聚合需求,需要人工编写代码在外部实现,这又增加很多开发工作量。
后面引入了 ClickHouse,替代 Elasticserach 做深度聚合需求,性能表现不错,在数据量千万级亿级表现很好,且资源消耗相比之前降低不少,同样的服务器资源可以承担更多的业务需求。
MergeTree 合并树表引擎,提供了数据分区、一级索引、二级索引。
Vector Engine 向量引擎,数据不仅仅按列存储,同时还按向量(列的一部分)进行处理,这样可以更加高效地使用 CPU。
Druid
Druid 样本数据,必须带有 time 时间字段。
Druid 更加专注,产品设计围绕 Rollup 展开,Elastic 只是附带。
Druid 支持多种外接数据,直接可以对接 Kafka 数据流,也可以直接对接平台自身内部数据;而 Elastic 仅支持内部索引数据,外部数据需要借助三方工具导入到索引里。
Druid 在数据 Rollup 之后,会丢弃原始数据;Elastic 在原有索引基础之后,生成新的 Rollup 之后的索引数据。
Druid 与 Elastic 的技术架构非常类似,都支持节点职责分离,都支持横向扩展。
Druid 与 Elastic 在数据模型上都支持倒排索引,基于此的搜索与过滤。
结语
Elasticsearch 产品功能全面,适用范围广,性能也不错,综合应用是首选。
Elasticsearch 在搜索查询领域,几乎完胜所有竞争产品,在笔者的技术栈看来,关系型数据库解决数据事务问题,Elasticsearch 几乎解决一切搜索查询问题。
Elasticsearch 在数据分析领域,产品能力偏弱一些,简单通用的场景需求可以大规模使用,但在特定业务场景领域,还是要选择更加专业的数据产品,如前文中提到的复杂聚合、大规模 Rollup、大规模的 Key-Value。
Elasticsearch 越来越不像一个搜索引擎,更像是一个全能型的数据产品,几乎所有行业都在使用,业界非常受欢迎。
Elasticsearch 用得好,下班下得早。
本文围绕 Elastic 的竞争产品对比仅限概要性分析,粒度较粗,深度有限,之后会有更加专业深入竞争产品分析文章,敬请期待。
作者:李猛(ynuosoft)
简介:Elastic-stack 产品深度用户,ES 认证工程师,2012 年接触 Elasticsearch,对 Elastic-Stack 开发、架构、运维等方面有深入体验,实践过多种 Elasticsearch 项目,最暴力的大数据分析应用,最复杂的业务系统应用;业余为企业提供 Elastic-Stack 咨询培训以及调优实施。
编辑:陶家龙
出处:转载自微信公众号 DBAplus 社群(ID:dbaplus)
精彩文章推荐: