上次更新日期:2021 年 4 月 2 日
我希望使用索引状态管理 (ISM) 功能将我在 Amazon Elasticsearch Service (Amazon ES) 集群上的索引翻转。但我的索引翻转失败,我还收到了一个错误。为什么会出现这种情况,我该怎样解决呢?
简短描述如果您收到 Failed to rollover index(未能翻转索引)错误,则表明您的翻转操作可能由于以下原因之一而失败:
翻转目标不存在。 缺少翻转别名。 索引名称与索引模式不匹配。 翻转别名指向了索引模板中的一个重复别名。要解决此问题,请使用 explain API 确定错误的原因,并检查您的 ISM 策略。有关如何在 ISM 策略中设置翻转操作的更多信息,请参阅如何使用索引状态管理 (ISM) 功能管理 Amazon Elasticsearch Service 中的存储空间不足问题。
解决方法 使用 explain API要确定 Failed to rollover index(未能翻转索引)错误的根本原因,请使用 explain API:
GET _opendistro/_ism/explain/logs-000001?pretty
下面是 explain API 的一个示例输出:
{
"logs-000001" : {
"index.opendistro.index_state_management.policy_id" : "rollover-workflow",
"index" : "logs-000001",
"index_uuid" : "JUWl2CSES2mWYXqpJJ8qlA",
"policy_id" : "rollover-workflow",
"policy_seq_no" : 2,
"policy_primary_term" : 1,
"rolled_over" : false,
"state" : {
"name" : "open",
"start_time" : 1614738037066
},
"action" : {
"name" : "rollover",
"start_time" : 1614739372091,
"index" : 0,
"failed" : true,
"consumed_retries" : 0,
"last_retry_time" : 0
},
"retry_info" : {
"failed" : false,
"consumed_retries" : 0
},
"info" : {
"cause" : "rollover target does not exist",
"message" : "Failed to rollover index "
}
}
}
此示例输出表明,目标翻转别名 (rolling-indices) 不存在,因此未能翻转索引。
翻转目标不存在如果 explain API 返回的原因是 rollover target does not exist(翻转目标 不存在),请检查是否使用翻转别名引导了索引:
GET _cat/aliases
此输出将列出集群中的所有当前别名以及它们的关联索引。如果 ISM 表明您的翻转目标不存在,则意味着缺少转换别名和失败的索引关联。
要解决索引关联失败问题,请为索引附加翻转别名:
POST /_aliases
{
"actions" :
}
附加翻转别名之后,在 Amazon ES 中对托管的索引重试翻转操作:
POST _opendistro/_ism/retry/logs-000001
有关更多信息,请参阅 Open Distro for Elasticsearch 网站上的 Retry failed index(重试失败的索引)。
当重试失败的索引时,您可能会收到 Attempting to retry(正在尝试重试)状态消息。如果 Amazon ES 正在尝试重试,请等待下一个 ISM 周期运行。ISM 周期每 30 到 48 分钟运行一次。如果翻转操作成功,您将收到如下消息:Successfully rolled over index(已成功翻转索引)。
缺少翻转别名如果 explain API 输出确定的翻转失败原因是缺少翻转别名,请检查失败的索引的设置:
GET <failed-index-name>/_settings
如果您发现缺少 index.opendistro.index_state_management.rollover_alias 设置,请手动将此设置添加到索引中:
PUT /<failed-index-name>/_settings
{
"index.opendistro.index_state_management.rollover_alias":"<rollover-alias>"
}
使用 retry failed index API,对失败的索引重试翻转操作。当重试翻转操作时,请更新您的策略模板:
PUT _template/<template-name>
确保使用现有策略模板中的那些设置,以便将您的翻转别名应用于新创建的索引。例如:
PUT _template/<existing-template>
{
"index_patterns": ,
"settings": {
"index.opendistro.index_state_management.policy_id": "<policy_id>",
"index.opendistro.index_state_management.rollover_alias":"<rollover-alias>"
}
}
索引名称与索引模式不匹配
如果 ISM 策略表明由于索引名称与索引模式不匹配而导致翻转操作失败,请检查失败的索引的索引名称。为了成功进行翻转,索引名称应当与如下正则表达式模式匹配:
`^.*-\\d+$`
此正则表达式模式要求索引名称必须包含文本,然后是连字符 (-) 以及一个或多个数字。如果索引名称不遵循此模式,而且您的第一个索引中写入了数据,请考虑将具有正确名称的数据重新索引到新索引中。例如:
POST _reindex
{
"source": {
"index": "<failed-index>"
},
"dest": {
"index": "my-new-index-000001"
}
}
当 reindex data API 正在运行时,请从失败的索引中分离翻转别名。随后,将翻转别名添加到新索引中,以使数据源能够继续将传入的数据写入到新索引中。
例如:
POST /_aliases
{
"actions" :
}
使用如下 API 调用,手动将 ISM 策略附加到新索引:
POST _opendistro/_ism/add/my-new-index-* { "policy_id": "<policy_id>" }
更新现有的模板,以反映新的索引模式名称:
PUT _template/<existing temaplate>
注意:您的 ISM 策略和翻转别名必须反映使用相同的索引模式创建的连续索引。
翻转别名指向了索引模板中的一个重复别名如果 explain API 表明由于翻转别名指向了一个重复的别名而导致索引翻转失败,请检查您的索引模板设置:
GET _template/<template-name>
检查您的模板是否包含额外的 aliases(别名)部分(另一个别名指向了同一个索引):
"index_patterns": ,
"settings": {
"index.opendistro.index_state_management.policy_id": "rollover-policy",
"index.opendistro.index_state_management.rollover_alias": "rollover-alias"
},
"aliases": {
"another_alias": {
"is_write_index": true
}
}
另一个别名的存在确认了您的翻转操作失败的原因,因为多个别名会导致翻转失败。要解决这一失败,请更新模板设置,但不要指定任何别名:
PUT _template/<template-name>
随后,对失败的索引执行 retry API:
POST _opendistro/_ism/retry/my-index-000001
重要提示:如果别名指向了多个索引,请确保只为一个索引启用了写访问权限。rollover API 会自动为翻转别名指向的索引启用写访问权限。因此,在 ISM 中执行翻转操作时,您无需为 is_write_index 设置指定任何别名。