节点不足,无法分配所有分片副本

编辑

节点不足,无法分配所有分片副本编辑

在不同节点上分布数据副本(索引分片副本)可以并行化处理请求,从而加快搜索查询速度。这可以通过将副本分片的数量增加到最大值(节点总数减一)来实现,这也有助于防止硬件故障。如果索引具有首选层,Elasticsearch 将仅将该索引的数据副本放置在目标层中的节点上。

如果遇到节点不足以分配所有分片副本的警告,您可以通过向集群(或层,如果正在使用层)添加更多节点,或通过减少 index.number_of_replicas 索引设置来影响此行为。

为了解决这个问题,请按照以下步骤操作

分配副本分片的一种方法是添加可用区。这将增加 Elasticsearch 集群中的数据节点数量,以便可以分配副本分片。这可以通过编辑您的部署来完成。但首先,您需要了解索引的目标分配层。使用 Kibana 执行此操作。

使用 Kibana

  1. 登录到 Elastic Cloud 控制台
  2. Elasticsearch Service 面板上,单击您的部署名称。

    如果您的部署名称被禁用,则您的 Kibana 实例可能不正常,在这种情况下,请联系 Elastic 支持。如果您的部署不包含 Kibana,您只需 先启用它

  3. 打开部署的侧边导航菜单(位于左上角 Elastic 徽标下方),然后转到 开发工具 > 控制台

    Kibana Console

要检查索引的目标分配层,请使用 获取索引设置 API 检索 index.routing.allocation.include._tier_preference 设置的配置值

response = client.indices.get_settings(
  index: 'my-index-000001',
  name: 'index.routing.allocation.include._tier_preference',
  flat_settings: true
)
puts response
GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings

响应将如下所示

{
  "my-index-000001": {
    "settings": {
      "index.routing.allocation.include._tier_preference": "data_warm,data_hot" 
    }
  }
}

表示允许分配此索引的数据层节点角色的逗号分隔列表,列表中的第一个是优先级较高的角色,即索引的目标层。例如,在本例中,层偏好是 data_warm,data_hot,因此索引的目标是 warm 层,并且 Elasticsearch 集群中需要更多具有 data_warm 角色的节点。

现在您已经知道了该层,您希望增加该层中的节点数量,以便可以分配副本。为此,您可以增加每个区域的大小以增加您已经在使用的可用区中的节点数量,或者增加可用区的数量。通过单击屏幕左上角的三个水平条并选择 管理此部署 返回到部署的登录页面。在该页面上,单击 管理 按钮,然后选择 编辑部署。请注意,您必须登录到 https://cloud.elastic.co/ 才能执行此操作。在 Elasticsearch 部分中,找到无法分配副本分片的层。

Kibana Console
  • 选项 1:增加每个区域的大小

    • 查看 每个区域的大小 下拉菜单中的值。您在此处选择的每 64 GB RAM 会在每个区域中创建一个节点。如果您当前选择的是 64 GB RAM 或更少,则每个区域中都有一个节点。如果您选择 128 GB RAM,则每个区域将获得 2 个节点。如果您选择 192 GB RAM,则每个区域将获得 3 个节点,依此类推。如果该值小于最大可能值,则可以选择该层的更高值以添加更多节点。
  • 选项 2:增加可用区的数量

    • 找到 可用区 选择。如果它小于 3,则可以选择该层的更多可用区。

如果无法增加每个区域的大小或可用区的数量,则可以减少索引数据副本的数量。我们将通过检查 index.number_of_replicas 索引设置并减少配置值来实现这一点。

  1. 如上所述访问 Kibana。
  2. 检查 index.number_of_replicas 索引设置。

    response = client.indices.get_settings(
      index: 'my-index-000001',
      name: 'index.number_of_replicas'
    )
    puts response
    GET /my-index-000001/_settings/index.number_of_replicas

    响应将如下所示

    {
      "my-index-000001" : {
        "settings" : {
          "index" : {
            "number_of_replicas" : "2" 
          }
        }
      }
    }

    表示索引所需的副本分片数量的当前配置值

  3. 使用 _cat/nodes API 查找目标层中的节点数量

    response = client.cat.nodes(
      h: 'node.role'
    )
    puts response
    GET /_cat/nodes?h=node.role

    响应将如下所示,每个节点包含一行

    himrst
    mv
    himrst

    您可以计算包含代表目标层的字母的行数,以了解您有多少个节点。有关详细信息,请参阅 查询参数。上面的示例有两行包含 h,因此热层中有两个节点。

  4. 减少 此索引所需的副本分片总数的值。由于副本分片不能与主分片位于同一节点上以实现 高可用性,因此新值需要小于或等于上面找到的节点数量减一。由于上面的示例在热层中找到了 2 个节点,因此 index.number_of_replicas 的最大值为 1。

    response = client.indices.put_settings(
      index: 'my-index-000001',
      body: {
        index: {
          number_of_replicas: 1
        }
      }
    )
    puts response
    PUT /my-index-000001/_settings
    {
      "index" : {
        "number_of_replicas" : 1 
      }
    }

    index.number_of_replicas 索引配置的新值从之前的 2 减少到 1。它可以设置为低至 0,但对于 可搜索快照索引 以外的索引,将其配置为 0 可能会导致节点重启期间出现临时可用性损失,或者在数据损坏的情况下导致永久性数据丢失。