ElasticSeatch 入门

介绍 ElasticSeatch 的架构特点和使用场景

什么是 ES

ES(ElasticSearch)是目前最受欢迎的企业级 搜索引擎。它基于 Lucene 开发,依赖 JVM 运行。是一个实时的、分布式的搜索分析引擎。

官方文档:Elasticsearch Guide

ES 的主要功能包括:

除此之外,ES 结合 Elastic 的其他产品,组成 Elastic Stack(简称 ELK),被广泛应用于大数据近实时分析领域,包括:日志分析、指标监控、信息安全等。

ES 的基本概念

ES 是一个分布式的搜索引擎,可以对比 Kafka 或者数据库集群去理解它。

Near Realtime (NRT)

近实时。数据提交到 ES 后,几乎立刻就可以被搜索到(延迟约 1 s)。

Cluster 集群

ES 是集群部署的。一个集群包含多个 ES 服务节点,整体对外提供服务。集群通过唯一的名称进行标识,具有相同集群名称的 ES 服务节点会自动组合成一个集群。集群名称可以在配置文件中指定。

Node 节点

节点是 ES 服务实例,用来存储集群的数据。ES 的数据分布在集群中的所有节点上。因此 ES 具有良好的伸缩性。节点也有自己的名称,默认在启动时会以一个随机的 UUID 字符串前七位字符作为名称。一个节点也被 ES 当作一个集群。

Role 角色

节点的分工,下面列出一些主要的角色:

Index 索引

这个是最容易混淆的概念,不要把 ES 的索引理解为数据库的索引。如果对比数据库的话,ES 的索引相当于数据库中的表。ES 的索引用来存放一组业务数据(文档)。索引有唯一的名称,通过名称操作索引。一个集群可以包含任意多个索引。索引是一个逻辑概念,可以类比为 Kafka 的 Topic。

Type 类型(已废弃)

ES 7.0 之前的版本支持类型语法,可以自定义类型,此时的类型可以类比为数据库的表,而此时的索引类比为数据库。但这个数据结构比较混乱,数据库中表之间是相互独立的,两个表如果包含相同的字段,是互不影响的。但在 ES 中,如果不同类型包含相同名称的字段,底层使用相同的 Lucene 字段支持,因此在概念上难以理解。并且类型的存在,允许 ES 的索引中存放不同性质(没有共同字段,业务含义不同等)的文档,这会影响 Lucene 压缩文档的能力,因此 ES 官方在 7.0 版本之后去掉了类型的支持。

去掉类型后,不同类型的数据推荐存放在不同的索引中。此时索引类比为数据库的表。

Document 文档

文档是 ES 保存的基础单元,是 JSON 结构的数据。文档类似于数据库表中的一行。文档中包含任意数量的字段,类比于数据库表的列。文档被添加到索引中,之后就可以通过 ES 检索到文档相关的信息。

Shard 分片

存放被索引的文档数据。逻辑上是文档添加到索引中,但从物理角度看,文档实际上保存在分片中。分片保存在节点中,分为 主分片(Primary shard)副本分片(Replica shard)。主分片支持读写。副本分片只支持读操作。为了支持高可用,主分片和对应的副本分片不能同时存在于同一个节点中,相同的副本也不能同时存在于同一个节点中。如果我们把索引类比为 Kafka 的主题,那么分片就类似于 Kafka 的分区(Partition)。

每个分片都是一个 Lucene 实例。

Mapping 映射

类似于数据库的表结构。映射定义了索引中文档字段的相关属性。索引的映射可以由 ES 根据文档字段自动推断所得,也可以手动创建。映射创建好之后,字段类型和分词器等属性是不可修改的。

ES 中的文档字段类型包括 文本类型基本数据类型keyword日期对象聚合数据类型结构化类型空间数据类型 等,具体可以查看 ES 的官方文档。

下图展示了 ES 集群的整体架构:

其中,索引 Index 包含三个主分片,分别是 P0, P1, P2,每个主分片各自有两个副本分片,这些分片均匀分布在三个节点上组成一个集群,统一对外提供服务。

Lucene 和 ES 是什么关系呢?

对比 MySQL 的结构,Lucene 相当于 ES 的存储引擎,负责处理具体数据的存储和检索。

ES 和 Lucene 的整体结构如下图所示:

参考:ES原理知识点补充和整体结构