索引生命周期管理错误问题排查

编辑

索引生命周期管理错误问题排查

编辑

ILM 执行生命周期策略时,在为某个步骤执行必要的索引操作时可能会发生错误。发生这种情况时,ILM 会将索引移动到 ERROR 步骤。如果 ILM 无法自动解决错误,则会暂停执行,直到您解决策略、索引或集群的底层问题。

请观看此视频,了解如何排查当前 ILM 运行状况问题,并观看此视频,了解如何排查历史 ILM 问题。

例如,您可能有一个 shrink-index 策略,该策略在索引至少存在五天后将其收缩为四个分片

resp = client.ilm.put_lifecycle(
    name="shrink-index",
    policy={
        "phases": {
            "warm": {
                "min_age": "5d",
                "actions": {
                    "shrink": {
                        "number_of_shards": 4
                    }
                }
            }
        }
    },
)
print(resp)
response = client.ilm.put_lifecycle(
  policy: 'shrink-index',
  body: {
    policy: {
      phases: {
        warm: {
          min_age: '5d',
          actions: {
            shrink: {
              number_of_shards: 4
            }
          }
        }
      }
    }
  }
)
puts response
const response = await client.ilm.putLifecycle({
  name: "shrink-index",
  policy: {
    phases: {
      warm: {
        min_age: "5d",
        actions: {
          shrink: {
            number_of_shards: 4,
          },
        },
      },
    },
  },
});
console.log(response);
PUT _ilm/policy/shrink-index
{
  "policy": {
    "phases": {
      "warm": {
        "min_age": "5d",
        "actions": {
          "shrink": {
            "number_of_shards": 4
          }
        }
      }
    }
  }
}

没有什么可以阻止您将 shrink-index 策略应用于只有两个分片的新索引

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "index.number_of_shards": 2,
        "index.lifecycle.name": "shrink-index"
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      'index.number_of_shards' => 2,
      'index.lifecycle.name' => 'shrink-index'
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    "index.number_of_shards": 2,
    "index.lifecycle.name": "shrink-index",
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "index.number_of_shards": 2,
    "index.lifecycle.name": "shrink-index"
  }
}

五天后,ILM 尝试将 my-index-000001 从两个分片收缩为四个分片。由于收缩操作不能增加分片数量,因此该操作失败,ILM 将 my-index-000001 移动到 ERROR 步骤。

您可以使用 ILM Explain API 来获取有关哪里出错的信息

resp = client.ilm.explain_lifecycle(
    index="my-index-000001",
)
print(resp)
response = client.ilm.explain_lifecycle(
  index: 'my-index-000001'
)
puts response
const response = await client.ilm.explainLifecycle({
  index: "my-index-000001",
});
console.log(response);
GET /my-index-000001/_ilm/explain

它会返回以下信息

{
  "indices" : {
    "my-index-000001" : {
      "index" : "my-index-000001",
      "managed" : true,
      "index_creation_date_millis" : 1541717265865,
      "time_since_index_creation": "5.1d",
      "policy" : "shrink-index",                
      "lifecycle_date_millis" : 1541717265865,
      "age": "5.1d",                            
      "phase" : "warm",                         
      "phase_time_millis" : 1541717272601,
      "action" : "shrink",                      
      "action_time_millis" : 1541717272601,
      "step" : "ERROR",                         
      "step_time_millis" : 1541717272688,
      "failed_step" : "shrink",                 
      "step_info" : {
        "type" : "illegal_argument_exception",  
        "reason" : "the number of target shards [4] must be less that the number of source shards [2]"
      },
      "phase_execution" : {
        "policy" : "shrink-index",
        "phase_definition" : {                  
          "min_age" : "5d",
          "actions" : {
            "shrink" : {
              "number_of_shards" : 4
            }
          }
        },
        "version" : 1,
        "modified_date_in_millis" : 1541717264230
      }
    }
  }
}

用于管理索引的策略:shrink-index

索引存在时间:5.1 天

索引当前所处的阶段:warm

当前操作:shrink

索引当前所处的步骤:ERROR

未能执行的步骤:shrink

错误的类型和该错误的描述。

来自 shrink-index 策略的当前阶段的定义

要解决此问题,您可以更新策略,以便在 5 天后将索引收缩为单个分片

resp = client.ilm.put_lifecycle(
    name="shrink-index",
    policy={
        "phases": {
            "warm": {
                "min_age": "5d",
                "actions": {
                    "shrink": {
                        "number_of_shards": 1
                    }
                }
            }
        }
    },
)
print(resp)
response = client.ilm.put_lifecycle(
  policy: 'shrink-index',
  body: {
    policy: {
      phases: {
        warm: {
          min_age: '5d',
          actions: {
            shrink: {
              number_of_shards: 1
            }
          }
        }
      }
    }
  }
)
puts response
const response = await client.ilm.putLifecycle({
  name: "shrink-index",
  policy: {
    phases: {
      warm: {
        min_age: "5d",
        actions: {
          shrink: {
            number_of_shards: 1,
          },
        },
      },
    },
  },
});
console.log(response);
PUT _ilm/policy/shrink-index
{
  "policy": {
    "phases": {
      "warm": {
        "min_age": "5d",
        "actions": {
          "shrink": {
            "number_of_shards": 1
          }
        }
      }
    }
  }
}

重试失败的生命周期策略步骤

编辑

修复导致索引进入 ERROR 步骤的问题后,您可能需要明确告知 ILM 重试该步骤

resp = client.ilm.retry(
    index="my-index-000001",
)
print(resp)
const response = await client.ilm.retry({
  index: "my-index-000001",
});
console.log(response);
POST /my-index-000001/_ilm/retry

ILM 随后尝试重新运行失败的步骤。您可以使用 ILM Explain API 来监视进度。

常见的 ILM 设置问题

编辑

如何计算 min_age

编辑

设置 ILM 策略使用 ILM 自动化滚动更新时,请注意 min_age 可以相对于滚动更新时间或索引创建时间。

如果您使用 ILM 滚动更新,则 min_age 是相对于索引滚动更新的时间计算的。这是因为 滚动更新 API 生成新索引,并将上一个索引的 age 更新为反映滚动更新时间。如果索引尚未滚动更新,则 age 与索引的 creation_date 相同。

您可以使用 index.lifecycle.origination_dateindex.lifecycle.parse_origination_date ILM 设置来覆盖 min_age 的计算方式。

常见的 ILM 错误

编辑

以下是如何解决在 ERROR 步骤中报告的最常见错误。

滚动更新别名的问题是错误的常见原因。考虑使用 数据流而不是使用别名管理滚动更新。

滚动更新别名 [x] 可以指向多个索引,在索引模板 [z] 中找到重复的别名 [x]

编辑

目标滚动更新别名在索引模板的 index.lifecycle.rollover_alias 设置中指定。当您引导初始索引时,您需要一次显式配置此别名。然后,滚动更新操作将管理设置并将别名更新为滚动更新到每个后续索引。

不要在索引模板的别名部分中显式配置相同的别名。

请观看解决 重复别名 问题的视频,了解问题排查示例。

index.lifecycle.rollover_alias [x] 未指向索引 [y]

编辑

索引使用的别名错误,或者该别名不存在。

检查 index.lifecycle.rollover_alias 索引设置。要查看配置了哪些别名,请使用 _cat/aliases

请观看解决 未指向索引 问题的视频,了解问题排查示例。

索引 [y] 的设置 [index.lifecycle.rollover_alias] 为空或未定义

编辑

必须配置 index.lifecycle.rollover_alias 设置,滚动更新操作才能工作。

更新索引设置以设置 index.lifecycle.rollover_alias

请观看解决 为空或未定义 问题的视频,了解问题排查示例。

别名 [x] 具有多个写入索引 [y,z]

编辑

对于特定的别名,只能将一个索引指定为写入索引。

使用 别名 API 将除一个索引之外的所有索引的 is_write_index:false 设置为 false。

请观看解决 多个写入索引 问题的视频,了解问题排查示例。

索引名称 [x] 与模式 ^.*-\d+ 不匹配

编辑

索引名称必须与正则表达式模式 ^.*-\d+ 匹配,滚动更新操作才能工作。最常见的问题是索引名称不包含尾随数字。例如,my-index 不符合模式要求。

将数值追加到索引名称,例如 my-index-000001

请观看解决 不匹配模式 问题的视频,了解问题排查示例。

CircuitBreakingException:[x] 数据过大,[y] 的数据

编辑

这表示集群正在达到资源限制。

在继续设置 ILM 之前,您需要采取措施缓解资源问题。有关详细信息,请参阅断路器错误

高磁盘水位线 [x] 在 [y] 上超出

编辑

这表示集群的磁盘空间不足。当您没有设置索引生命周期管理以从热节点滚动更新到温节点时,可能会发生这种情况。有关详细信息,请参阅修复水位线错误

security_exception:用户 [<user-name>] 的角色 [<role-name>] 未授权执行操作 [<action-name>],此操作由索引权限 [manage_follow_index,manage,all] 授予

编辑

这表示无法执行 ILM 操作,因为 ILM 用于执行操作的用户没有正确的权限。当用户更新 ILM 策略后其权限被删除时,可能会发生这种情况。ILM 操作的运行方式就像是由最后修改策略的用户执行的操作一样。用于创建或修改策略的帐户应具有执行该策略所有操作的权限。