Skip to content
📖0 阅读·🤍0 点赞

Elasticsearch分片的基本策略

  • 一个索引包含一个或多个分片,在 7.0 之前默认五个主分片,每个主分片一个副本;在 7.0 之后默认一个主分片。副本可以在索引创建之后修改数量,但是主分片的数量一旦确定不可修改,只能创建索引
  • 每个分片都是一个 Lucene 实例,有完整的创建索引和处理请求的能力
  • ES 会自动再 nodes 上做分片均衡 shard reblance
  • 一个doc不可能同时存在于多个主分片中,但是当每个主分片的副本数量不为一时,可以同时存在于多个副本中。
  • 主分片和其副本分片不能同时存在于同一个节点上。
  • 完全相同的副本不能同时存在于同一个节点上。

小白通俗易懂版本

这些规则都是为了确保图书馆(ES集群)里的书(数据)安全(不丢失)、好找(查询快)、能承受书架坏掉(节点故障)。

好的,我们来用图书馆的比喻,把这些分片策略规则解释得清清楚楚、明明白白!

想象一个巨大的图书馆(Elasticsearch 集群):

  1. 索引 = 一套丛书:

    • 比如《哈利波特》全集(1-7册)就是一个索引。
    • 在 ES 7.0 之前,默认这套书会被拆成 5 个独立的盒子(主分片) 来存放(比如盒子1放书1-2,盒子2放书3,等等)。同时,为了防止盒子丢失,默认会给每个盒子做一个 一模一样的备份盒子(副本分片)
    • 在 ES 7.0 之后,默认这套书就放在 1 个大盒子(主分片) 里,并且默认做 1 个备份盒子(副本分片)
    • 关键点: 这套书分成几个盒子装(主分片数量),在图书馆建好这个丛书区(创建索引)时就定死了!以后不能再把1个盒子拆成2个,或者把2个盒子合成1个(主分片数量不可变)。但是,你可以随时决定做 几个 备份盒子(副本数量可以改)。
  2. 分片 = 一个装书的盒子:

    • 每个盒子(分片),不管是装原版书的(主分片)还是装备份书的(副本分片),都是一个 完整、独立的小图书馆(Lucene 实例)。它自己能查找书、放新书进去、整理书(处理请求)。
  3. 分片均衡 = 管理员搬盒子:

    • 图书馆(集群)里有很多书架(节点)。管理员(ES)很聪明,他会观察哪个书架太挤了(节点负载高),哪个书架太空了。他会自动把一些盒子(分片)从挤的书架搬到空的书架上,让所有书架上的书盒数量尽量平均(shard rebalance)。这样找书效率高,不会都挤在一个地方。
  4. 一本书只能在一个主盒子里:

    • 《哈利波特与魔法石》这本书(一个文档),它只能放在 一个 装原版书的盒子(主分片)里。比如,它确定放在“盒子1”里。
    • 但是! 如果管理员做了备份(副本),比如做了2个备份盒子。那么,《魔法石》这本书会出现在:
      • 原版盒子1(主分片)
      • 备份盒子1副本A(副本分片)
      • 备份盒子1副本B(副本分片)
    • 所以,它同时存在于 一个主分片多个副本分片 中。副本分片是主分片的完整拷贝。
  5. 主盒子和它的备份盒子不能放同一个书架:

    • 想象一下:如果装原版《魔法石》的盒子1(主分片)和它的备份盒子1副本A(副本分片)都放在同一个书架(节点)上。
    • 风险: 如果这个书架塌了或者着火了(节点宕机)!完蛋!不仅原版书没了,备份书也没了!这本书就彻底丢失了!
    • 设计原因: 为了防止一个书架(节点)故障导致数据完全丢失。ES 强制要求,原版盒子(主分片)和它的任何一个备份盒子(副本分片)必须放在 不同的 书架上(不同的节点)。这样,即使一个书架坏了,另一个书架上还有备份,书(数据)不会丢。
  6. 完全相同的备份盒子不能放同一个书架:

    • 继续上面的例子,假设我们做了两个备份:盒子1副本A 和 盒子1副本B。它们俩都是盒子1(主分片)的 完全相同的备份
    • 风险: 如果把盒子1副本A 和 盒子1副本B 都放在同一个书架(节点)上。如果这个书架塌了(节点宕机)!虽然原版盒子1可能还在别的书架上没事,但 两个备份全没了!这个主分片就只剩下一个副本(或者如果主分片也在坏节点上就更糟),冗余度大大降低,风险变高。
    • 设计原因: 为了提高数据的 可用性安全性。把相同的备份分散到不同的书架上(节点),确保即使坏掉一个书架,其他书架上还有备份可用。如果所有备份都挤在一个书架上,那就失去了做多个备份的意义。这就像你不会把家里所有现金都藏在同一个地方一样。

总结一下设计思想:

  • 主分片不可变: 决定了数据最初如何分割存储(分多少盒子装),一旦分割方式定好,大规模改动成本太高(想象要把所有书倒出来重新分盒再放回去),所以不让改。
  • 副本数量可变: 备份数量可以根据需要(安全性要求、读性能要求)灵活调整,相对容易(多做或少做几个备份盒子就行)。
  • 分片独立且均衡: 每个盒子都能独立工作(小图书馆),管理员(ES)自动把盒子分散放(均衡),提高整体效率和资源利用率。
  • 主副分离: 核心思想是 避免单点故障。不让原版和它的备份共存亡(规则5)。
  • 副本分散: 核心思想是 提高冗余度。不让所有的鸡蛋(相同的备份)放在同一个篮子(节点)里(规则6)。这样,即使坏掉一个篮子(节点),还有其他篮子里的鸡蛋(备份)可用。

记住图书馆的比喻:

  • 索引 = 一套书(如《哈利波特全集》)
  • 主分片 = 装原版书的盒子
  • 副本分片 = 装备份书的盒子
  • 节点 = 图书馆的书架
  • ES 集群 = 整个图书馆
  • 文档 = 一本书(如《魔法石》)