随着互联网的发展,各类数据库以及模型层出不穷,可谓让开发者眼花缭乱不知如何抉择。
对于传统的 OLTP(Online Transaction Processing)
关系型数据库例如 MySQL
、Oracle
等凭借有效的事务性常作于项目基础数据库,而 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
日志管理,能够实现日志搜索检索。