Elasticsearch基础知识——集群、节点、索引、分片

本文主要介绍 Elasticsearch 的集群、节点、索引、分片和段相关基础知识。

集群

一个集群是由一个或多个节点组成的集合,集群上的节点将会存储数据,并提供跨节点的索引和搜索功能。
集群通过一个唯一的名称作为标识,节点通过设置集群名称就可以加入相应的集群,当然这需要节点所在的网络能够发现集群。所以要注意在同一个网络中,不同环境、服务的集群的名称不能重复。

节点

一个节点就是一个 Elasticsearch 服务(实例),可以实现存储数据,索引并且搜索的功能。和集群一样,每个节点都有一个唯一的名称作为身份标识,如果没有设置名称,默认使用 UUID 作为名称。如果想更好的管理集群,最好给每个节点都定义上有意义的名称,在集群中区分出各个节点。
节点通过设置集群名称,在同一网络中发现具有相同集群名称的节点,组成集群。默认的集群名称为 elasticsearch 。如果在同一网络中只有一个节点,则这个节点成为一个单节点集群,换句话说就是每个节点都是功能齐全的服务。

索引

一般意义上的索引是一种基于文档(数据)生成、建立的,用于快速定位指定文档的工具。
一般索引

而 Elasticsearch 对索引的定义有所不同,也是在初学 Elasticsearch 容易糊涂一点,以下为 5.x 及以下版本的 Elasticsearch 和 MySQL 相关概念的对应关系。

  • MySQL => Databases => Tables => Columns/Rows
  • Elasticsearch => Indices => Types => Documents with Properties

Elasticsearch 中的索引对应 MySQL 中的 Database ,也就说 Elasticsearch 中的索引更像是一种数据存储集合,即用于存储文档。
Elasticsearch 中的数据根据业务以索引为单位进行划分,Type 就像 MySQL 中的 Table 一样,用于区分同一业务中不同的数据集合,如下图:
ES索引概念图
当然上图并不是指 Elasticsearch 中就真的这么存储数据,而是大概的表现方式。
不过在 6.x 版本后,就废弃了 Type ,因为设计者发现 Elasticsearch 这种与关系型数据类比的设计方式有缺陷。在关系型数据库中,每个数据表都是相互独立的,即在不同表中相同的数据域是互不关联的。而 Elasticsearch 底层所用的 Lucene 并没有关系型数据中的这种特性,在 Elasticsearch 同一个索引中,不同映射类型但是名称相同的数据域在 Lucene 中是同一个数据域,即作为同一类数据存放在一起。具体参考:Removal of mapping types

Elasticsearch 6.x 版本废弃掉 Type 后,建议的是每个类型(业务)的数据单独放在一个索引中,这样其实回归到一般意义上的索引定义,索引定位文档。如下图:
废弃 Type 后的索引
上图也是一种大概的表现方式,不代表 Elasticsearch 以这种方式处理文档。
当然,还是可以认为索引存储文档,但是建议摒弃掉之前那种与关系数据库类比的思想,理解成索引指向文档,索引与文档存储在同一空间。

如果 Elasticsearch 还是使用 5.x 或以下版本,建议每个索引只设置一个类型,做到一个索引存储一种数据。

分片

如果一个索引具有很大的数据量,它的数据量可能会超出单个节点的容量限制(硬盘容量),而且单个节点数据量过大,执行性能也会随之下降,每个搜索请求的执行效率都会降低。
为了解决上述问题, Elasticsearch 提出了分片的概念,索引将划分成多份,称为分片。当创建索引时,可以很简单的指定想要的分片数量。每个分片都是功能齐全的,独立的“索引”,驻留在集群的各个节点中。
Elasticsearch 集群结构

Elasticsearch 中的分片其实就是 Lucene 索引。

分片的作用

分片有两个主要的用处:

  • 水平划分数据
  • 多个分片分发工作,并行执行,从而提高性能,吞吐量

分片分为主分片和副本分片。副本分片主要功能如下:

  • 高可用性:副本分片作为数据备份,当某个主分片发生故障时,副本分片能够成为新的主分片,保证服务的可用性。
  • 提高性能:副本分片本身也是一个功能齐全的独立的分片(所以才能够随时取代故障的主分片),当有查询请求时,既可以在主分片中完成查询,也可以在副本分片中完成查询,当然数据添加、更新的操作只能在主分片中完成。

副本分片与主分片需要分配在不同的节点上,一是为了更好的均衡负载,不同节点上二是节点发生故障时,主分片和副本分片一起故障,没法保证高可用性。所以 Elasticsearch 集群最好要有 2 个节点或以上。

一个索引默认有 5 个主分片,每个主分片默认有 1 个副本分片,即创建一个索引默认会有 10 个分片。

分片的分布

前面提到,分片的其中一个作用在于实现负载均衡,当然这个前提在于分片合理分布在各个节点中。如果分片分布的不合理,就算节点数量足够,也会陷入“一核有难,九核围观”的困境。
分片在节点上分布不均匀的情况可能发生在新添加节点,或是有节点经历短暂故障后重启。
针对上面提到的问题,其实不需要过分在意,因为 Elasticsearch 本身就有管理、平衡分片的机制,当然可以改变相关参数从而改变管理、平衡节点的策略。具体可以参考:Cluster Level Shard Allocation

如果真的出现分片严重分布不均时,可以尝试限制索引在每个节点的分片数,具体参考:Total Shards Per Node

除此之外还可以尝试强制移动分片,具体参考:Cluster Reroute 。注意在移动前要确保有没有限制索引在每个节点的分片数,有的话要查看清楚分片移动的目标节点是否已经达到分片上限,如果已经达到上限,将分片移动将会失败。而且要确保移动后分片的分布均衡,不然还是会触发再平衡机制,消耗资源。

转载于:https://my.oschina.net/bingzhong/blog/2049844

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值