ES 搜索引擎的分片数、副本数分配算法

名词定义

分片

一个 分片 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分。 在分片内部机制中,我们将详细介绍分片是如何工作的,而现在我们只需知道一个分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。

一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。

副本分片

一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

副本分片的主要目的就是为了故障转移,如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片的角色。在索引写入时,副本分片做着与主分片相同的工作。新文档首先被索引进主分片然后再同步到其它所有的副本分片。增加副本数并不会增加索引容量。

在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。

ES集群核心参数

  • ES集群的服务器个数,
  • ES集群的总CPU核心个数,
  • ES集群的总内存
  • 预估要存入ES总数据量(数据+索引)

通俗理解

  • 分片数(number_of_shards)就是主分片个数
  • 副本数(number_of_replicas) 可以理解成主分片的拷贝个数
  • 如果主分片数是5,则每个副本都有5个分片
  • 因此ES集群总的分片数 = 分片数 * (副本数 + 1)

副本数分配算法:

 副本数 <=  ES集群的服务器个数 - 1 

副本除了提升查询效率,主要目的为了容灾,数据冗余存储,保证数据安全,因此,副本数应跟据ES集群中的数据库数量(N-1)进行配置,如果ES集群中有3台服务器,则副本数设置为2,减 1 因为主分片本身也算一份。副本数设置为2,数据实际上有3份,分散到3台服务器中。

 预估要存入ES总数据量 * (副本数+1)  <= ES集群的总内存 / 2 

存入ES搜索引擎 的数据可以预估,比如预估存入的数据有 100G,则实际上会占用的内存为  100G * (副本数+1)  加 1 因为计入了主分片,数量里超限了也可以存入,只要磁盘够大,但是计算时就可能用到了磁盘,磁盘的IO性能会让整个ES集群性能大副下降。

ES集群的总内存只取了一半,因为考虚 ES 的 java. 程序本身占用的内存,数据聚合运算消耗的内存,如果实际项目中大量复杂运算,占用的内存需要更多。

分片数分配算法:

 分片数 * (副本数 + 1) <= ES集群的总CPU核心个数 

分片内的检索运算聚合需要 CPU, 为了充分发挥多核CPU的性能,且又避免CPU频繁调度,因此,ES集群内总的分片数应小于等于总的CPU核心个数。

以上是个人理解,因水平有限,难免有不妥之处,不可全信,欢迎交流切磋,欢迎指正。

本文原始网址:https://www.liu12.com/article...,转载请保留出处

作者:刘一二原文地址:https://segmentfault.com/a/1190000042197307

%s 个评论

要回复文章请先登录注册