刚接触ES的小伙伴可能会有这样的疑问: 哪些场景下该使用ES?今天我们主要从市面上一些主流的产品对比分析, 看下那些场景下使用ES, 哪些场景下不适ES.
主要竞品如下:
Solr是第一个基于Lucene核心库功能完备的搜索引擎产品,诞生较早于Elasticsearch。在早期的全文搜索领域,Solr拥有巨大的优势,几乎完全超过了Elasticsearch。然而,在近几年的大数据发展时代,由于Elasticsearch具备分布式特性,满足了许多大数据处理需求。
特别是随着ELK概念的流行,人们几乎完全忽略了Solr的存在。尽管Solr推出了Solr Cloud分布式产品,但已经基本失去了优势。我曾接触过几家数据类公司,他们的全文搜索都是基于Solr构建的,而且通常使用单节点模式。然而,当出现一些问题时,很难找到咨询顾问来排查问题。因此,后来他们都迁移到了Elasticsearch上。
现在几乎所有大小公司都在使用Elasticsearch,除了一些老旧系统仍然使用Solr外,新的项目都应该使用Elasticsearch。我个人认为有以下几个原因:
关系型数据库与 Elasticsarch 相比主要优点是事务隔离机制无可替代,但其局限性很明显。主要体现在以下几个方面:
OpenTSDB 内部基于 HBase 实现,属于时间序列数据库,主要针对具有时间特性和需求的数据,进行过数据结构的优化和处理,从而适合存储具有时间特性的数据,如监控数据、温度变化数据等。
小米公司开源监控体系 open-falcon 的就是基于 OpenTSDB 实现。
OpenTSDB 时间序列数据库内部实现
Elastic 产品本身无意时间序列这个领域,随着 ELK 的流行,很多公司采用ELK来构建监控体系,虽然在数值类型上不像时间序列数据库做过特别处理,但由于其便利的使用,以及生态技术栈的优势,我们也接受了这样的事实。
HBase 是列式数据库的代表,其内部有几个致命设计大大限制了它的应用范围:
列式数据库内部数据结构示意图
MongoDB 是文档型数据库的代表,数据模型基于 BSON,而 Elasticsearch 的文档数据模型是 JSON。BSON 本质上是 JSON 的一种扩展,两者可以相互直接转换。另外,它们的数据模式都可以自由扩展,并且没有基本限制。
尽管 MongoDB 在技术上与关系型数据库有竞争关系,并支持严格的事务隔离机制,但在实际工作中,很少有公司会将核心业务数据存储在 MongoDB 中。相对而言,关系型数据库仍然是首选。
若超出这个定位,则 Elasticsearh 相比 MongoDB 有如下优点:
公司刚好有个项目,原来数据层基于 MongoDB 设计构建的,查询问题不少 ,后面成功迁移到 Elasticsearch 平台上,服务器数据量从 15 台降低到 3 台,查询性能还大幅度提升十倍.
Durid 是一个大数据 MPP 查询型数据产品,核心功能 Rollup,所有的需要 Rollup 原始数据必须带有时间序列字段。
Elasticsearch 在 6.3.X 版本之后推出了此功能,此时两者产品形成竞争关系,谁高谁下,看应用场景需求。
Druid 样本数据,必须带有 time 时间字段。
笔者之前负责过公司所有 Elasticsearch 技术栈相关数据项目,当时也有碰到一些实时聚合查询返回部分数据的需求。
但我们的需求不太一样,索引数据属于离线型更新,每天都会全部删除并重新创建索引插入数据。
Druid 产品技术架构体系示意图
关于 Rollup 这个大数据分析领域,若有大规模的 Rollup 的场景需求,个人更倾向于 Druid。