没有足够的节点来分配所有分片副本

edit

没有足够的节点来分配所有分片副本

edit

在不同节点上分发数据副本(索引分片副本)可以并行处理请求,从而加快搜索查询的速度。这可以通过增加副本分片的数量来实现,最多可以增加到最大值(节点总数减一),这也起到了保护硬件故障的作用。如果索引有首选层级,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 设置的配置值:

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,每个区域将创建一个节点。如果您当前选择的RAM为64 GB或更少,则每个区域有一个节点。如果您选择128 GB RAM,则每个区域将获得2个节点。如果您选择192 GB RAM,则每个区域将获得3个节点,依此类推。如果该值小于最大可能值,您可以选择该层级的更高值以添加更多节点。
  • 选项 2:增加可用区的数量

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

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

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

    GET /my-index-000001/_settings/index.number_of_replicas

    响应将会是这样的:

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

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

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

    GET /_cat/nodes?h=node.role

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

    himrst
    mv
    himrst

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

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

    PUT /my-index-000001/_settings
    {
      "index" : {
        "number_of_replicas" : 1 
      }
    }

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