ElasticSearch 结构详解


随着互联网的发展,各类数据库以及模型层出不穷,可谓让开发者眼花缭乱不知如何抉择。

对于传统的 OLTP(Online Transaction Processing) 关系型数据库例如 MySQLOracle 等凭借有效的事务性常作于项目基础数据库,而 Redis 此类数据库通过内存的高性能通常用于作为热点数据缓存节点。

在之前的文章中,已经了解了 Elasticsearch 基础概念以及介绍了如何集成使用。那么今天就让我们一起探究其背后的机制,以及在项目中又能为我们解决什么难题?

一、存储机制

Elasticsearch 中,内存缓冲区和事务日志是确保数据可靠写入和实现“近实时”搜索的两个关键机制。

1. 缓冲区

在数据写入上通常可以分为两大类:有序无序

Kafka 的无序为例,数据直接添加至文件末端,数据间只存在先后关系而无其它关联。

而常见的关系型数据库基于索引需要,数据会以一定规则进行存储,常会采用缓存 + 异步写入的方式实现,如 MySQL 中的 Change Buffer

Elasticsearch 中同样也不例外,当执行数据新增时,会先将数据写入到内存缓冲区中,避免即刻的硬盘 IO 耗时操作,同时也能够提高数据吞吐量。

2. 事务日志

事务日志是为了保证数据可靠性和持久性而存在的日志文件,正如上述所提到当数据写入时并不会实时写入磁盘,而是优先写入内存缓冲区后,再由特定间隔将数据刷入硬盘内。

Elasticsearch 中这个刷新的间隔通过 refresh_interval 参数进行管理,每个索引的刷新时间都是独立的,默认刷新时间为 1s

即当用户执行新增时,数据会先行写入内存缓存区中,内存缓冲区中的数据在 1s 内刷新到一个新的 ,并写入磁盘,而这默认 1s 的差额也是 Elasticsearch 被称为近实时搜索引擎一大原因。

3. 倒排索引

Elasticsearch 有一个核心概念即倒排索引,也是其搜索性能优秀的一大原因。

既然有倒排索引那相应也存在正排索引,也是关系型数据库中常见的模式。对于正排索引,即通过唯一标志定位其相应完整的记录。

而倒排索引则反其道而行,存储的记录内容通过分词等途径拆分为单独的词组,而每个词组都匹配一个或多个数据记录。因此,在倒排索引中可以轻易实现匹配当前条件匹配的所有记录。

二、应用场景

1. 集成模式

在实际的开发当中,与常见的 MySQL 的等即写即读不同,Elasticsearch 常采用异步离线写入方式实现集成。

最为常见的即以 MySQL 作为主数据源存储数据,并通过手动写入或 binlog 的模式异步同步数据至 Elasticsearch

基于此模式下,在数据查询模块下,即可利用 Elasticsearch 查询优势最大化提升系统性能。当然,对于实时性要求相对较高的场景,也可采用实时 Elasticsearch 写入的方式。

三、优劣解析

1. 优势特点

回归到正题,Elasticsearch 拥有哪些优势,以及应该何时选择 Elasticsearch?

对于 MySQL 相比大家都并不陌生,其最基础的索引即通过索引建从而搜索定位到相应的数据记录,例如主键索引,而此类索引方式又称之为正向索引,通过唯一查询记录。

Elasticsearch 的优势之外在于支持反向搜索,即通过记录关键字反向查询唯一标识。最为常见的例子即全文搜索,若需要在 MySQL 等常见数据库中实现最简单的方式即通过 like %xxx% 实现模糊搜索,但存在索引失效所带来的性能问题。

Elasticsearch 的反向索引强大之处即可以通过分词器进行拆词为关键字,从而为关键字反向关联数据记录,从而实现快速的全文搜索能力。

2. 缺点不足

Elasticsearch 虽又有不菲的性能,但也并无铁板一块仍存在自身的不足之处。

在搜索查询上 Elasticsearch 能够表现出让人眼前一亮的效果,但在面对频繁的删改时却稍逊一筹。

同时在事务管理上,其并不能像传统的关系型数据一样强大,且其采用最终一致性模型,对于要求高一致性的数据处理或许并非最佳选择。

因此,基于 Elasticsearch 高效搜索的特性其通常应用于全文搜索、日志分析以及大数据集的聚合分析之中,其中较为常见的一大应用即 ELK 日志管理,能够实现日志搜索检索。


文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录