对比关系型数据库

MySQL ES
Database (数据库) Index (索引)
Table (表) Type (类型)
Row (行) Document (文档)
Column (列) Fields (字段)

下图举例为:一个拥有三个节点,有一个索引,该索引有2个主分片,每个主分片有2个副本分片的集群。
ES集群.png

索引(index)

索引-分片.png
从逻辑上看,索引是一些具有相似结构的文档集合。
索引实际上是指向一个或者多个物理 分片逻辑命名空间 。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

分片(shard)

将索引划分成多分,是索引的物理实现,每一份就是一个分片。
每个分片又是一个 Lucene引擎,具有全部的搜索能力。
分片组成.png
一个分片是一个底层的工作单元,仅保存了全部数据中的一部分,同时一个分片也是一个 Lucene 的实例,也就是一个分片就是一个完整的搜索引擎。

Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。
一个 Lucene 索引 在 ES 被称为 分片。 一个 ES 索引是 分片 的集合。
当 ES 在索引中搜索的时候,它发送查询到每一个属于索引的分片(Lucene 索引),然后合并每个分片的结果到一个全局的结果集。

一个分片可以是 分片或者 副本 分片。

主分片(Primary Shard)

  • 可执行文档的读、写操作
  • 用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
  • 索引内任意一个文档都归属于一个主分片
  • 主分片的数目决定着索引能够保存的最大数据量(理论最大能够存储 Integer.MAX_VALUE - 128)
  • 创建索引时默认为 1,也可指定数量,但后续不可修改数量,涉及路由算法
  • 7.0 默认为1

副本分片(Replicas shard)

  • 可执行读文档操作
  • 一个主分片的复制。应用于 故障转移 和 提高搜索性能。
  • 在对应主分片失败的情况下,提供了高可用。这也是 主分片 不与 副分片 在同一节点运行的原因。
  • 扩展 搜索量/吞吐量,因为搜索可以在所有 副本 上进行。
  • 创建索引时默认为 1,后续可修改数量,
  • 增加副本数,还可以在一定成都的上提高服务的可用性(读取的吞吐)
  • 7.0 默认为0

注意:同一个分片的主分片、副本分片不会分配在同一个节点

单节点不存在情况.png

上图中,如果节点1挂了,R0无法起到替换 P1 的作用,所以同一个分片的主副分片不会放在一个节点,上图主要是做解释作用,真正情况节点1只有 P1, R0属于未分配的分配,此时集群状态是 yellow

副本分片.png

上图中,节点1 挂了,节点2的 R0里提升成 主节点,起到了高可用的作用。

路由计算

当一个索引具有多个分片时,我怎么才能知道我操作的文档,具体在哪个分片上呢?
路由算法就是解决这个问题的!

路由算法.png

算法公式:

shard = hash(_routing) % number_of_primary_shards

得出的结果就是 [0, number_of_primary_shards-1] 之间的数

  • Hash 算法确保文档均匀分散到分片中
  • 默认的 _routing 值是文档 id
  • 可以自定制定 routing数值,例如用相同国家的商品,都分配到指定的 shard
  • 设置 Index Settings 后, Primary数 不能随意更改的根本原因。

  • routing是一个可变值,默认是文档 _id,也可以设置成一个自定义值

  • number_of_primary_shards 主分数,这也说明为什么在创建索引时要确认主分片数量,而且还不能更改。因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了

类型(type)

索引的类型,是逻辑上的 分类/分区。通常会为具有一组共同字段的文档定义一个类型。
索引 关联上 数据,中间不应该增加概念。

  • 5.X 支持多种 type
  • 6.X 只能支持一种 type
  • 7.X 默认不再支持自定义 type。(默认类型:_doc)

文档(document)

索引里的一条数据。
可以是任意的 JSON 格式。
将文档写入 ES 的过程叫做 索引(Indexing)

域(field)

相当于是数据表的字段,对文档数据根据不同属性进行分类标识。

节点(node)

一个运行中的 ES 实例,包含着分片。
节点是一个 ElasticSearch 的实例

  • 本质上就是一个 Java进程
  • 一台机器上可以运行多个 ElasticSearch 进程,但是生产环境一般建议一台机器上只运行一个 ElasticSearch 实例
  • 每一个节点都有名字,通过配置文件配置,或者启动的时候 -E node.name=node1 指定
  • 每一个节点在启动之后,会分配一个 UID,保存在 data 目录下

节点能力:

  • 我们可以发送请求到集群中的任一节点。
  • 每个节点都有能力处理任意请求。
  • 每个节点都知道集群中任一文档位置,所以可以直接将请求转发到需要的节点上。
  • 接收请求的节点叫做 协调节点 (coordinating node)
  • 当发送请求的时候, 为了扩展负载,更好的做法是轮询集群中所有的节点。

集群节点特征:

  • 所有节点共同承担数据和负载的压力
  • 当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据
  • 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。

主节点特征:

  • 负责管理集群范围内的所有变更,例如索引、节点的变动(新增、删除)。
  • 不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈
  • 任何节点都可以成为主节点

作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。

Master-eligible nodes 和 Master Node

  • 每个节点启动后,默认就是一个 Master eligible 节点
    • 可以设置 node.master: false 禁止
  • Master-eligible节点可以参加选主流程,成为 Master 节点
  • 当第一个节点启动时候,它会将自己选举成 Master 节点
  • 每个节点上都保存了集群的状态,只有 Master 节点才能修改集群的状态信息
    • 集群状态(Cluster State),维护了一个集群中,必要的信息
      • 所有的节点信息
      • 所有的索引和其相关的 Mapping 与 Setting 信息
      • 分片的路由信息
    • 任意节点都能修改,会导致数据的不一致性

Data Node & Corrdinating Node

  • Data Node 数据节点
    • 可以保存数据的节点,负责保存分片数据。在数据扩展上起到了至关重要的作用
  • Coordinating Node 协调节点
    • 负责接受 Client 的请求,将请求分发到合适的节点,最终把结果汇集到一起
    • 每个节点默认都起到了 Coordinating Node 的职责

集群(cluster)

一个 或 多个 拥有相同 cluster.name 的节点。
image.png

集群状态:

  • Green: 健康状态,所有主副分片都可用
  • Yellow:亚健康,所有主分片可用,部分副本分片不可用
  • Red:不健康状态,部分主分片不可用

上图只有一个节点,197个副本分片unassigned没有分配到,在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。

倒排索引(Inverted Index

使全文检索快速的结构。

  1. {
  2. "id": 1001,
  3. "content": "I love ShangHai"
  4. },
  5. {
  6. "id": 1002,
  7. "content": "I hava a plan"
  8. }

正排索引(forward index):

id content
1001 I love ShangHai
1002 I hava a plan

字段类型是 Text 需要分词 的倒排索引(inverted index):

Term 1001 1002
i
love
shanghai
hava
plan

字段类型是 KeyWord 不分词的倒排索引:

Term 1001 1002
I love ShangHai
I hava a plan

搜索: I love

Term 1001 1002
i
love
Total 2 1

分析

分析(analysis)是文档被发送并加入倒排索引之前,ElasticSearch 让每个被分析字段经过一系列得处理步骤
写入的分析
搜索的分析

相关性

搜索的关键词与倒排索引内容的类似程度