如何解决升级 Amazon Elasticsearch Service 集群时出现的“之前的快照操作尚未完成”错误?

上次更新时间:2020 年 9 月 10 日

我想升级我的 Amazon Elasticsearch Service (Amazon ES) 集群,但失败了,并收到“之前的快照操作尚未完成”的错误消息。如何解决此问题?

简短描述

升级 Amazon ES 集群时可能会因如下原因失败:

  • 快照已在运行。
  • 正在运行的快照进度停滞。
  • 正在运行的快照有处于红色状态的集群。
  • 快照超时或失败。

有关 Amazon ES 升级失败的更多信息,请参阅排查升级问题

解决方法

快照已在运行

注意:如果您收到“之前的快照操作尚未完成”的错误消息,则表示快照已在运行。

对于加密的域,请使用以下语法检查自动快照是否正在运行:

curl -X GET  'https://es_endpoint/_snapshot/cs-automated-enc/_status'

对于未加密的域,请使用以下语法检查自动快照是否正在运行中:

curl -X GET 'https://es_endpoint/_snapshot/cs-automated/_status'

如果没有正在运行的快照,将显示以下输出:

{  "snapshots" : [ ]}

空括号表示您可以安全地执行升级。如果 Amazon ES 无法检查快照是否正在运行中,则升级可能会失败。

正在运行的快照进度停滞

使用以下命令语法检查每小时快照的开始和结束时间:

curl -X GET  'https://es_endpoint/_cat/snapshots/cs-automated?v&s=id'

然后使用一个 cURL 输出管道将开始时间打印到 awk 命令:

curl -X GET  'https://es_endpoint/_cat/snapshots/cs-automated?v&s=id' |awk -F" " ' { print $4  } '

输出会指示每小时快照发生的时间。例如,以下输出表示输出大约在每小时的第 52 分钟运行:

22:51:11
23:51:18
00:51:19
01:51:14
02:51:16
03:51:18
04:51:16
05:51:11

然后检查 Amazon ES 升级资格。使用快照状态 API 检查快照是否已完成。如果快照已完成,API 将返回一个空集。更改配置后,此数据可能会更改,因此快照不能用于规划计划的作业。

如果快照的当前状态为正在运行中,并且一段时间内没有变化,则快照的进度可能已停滞。这同样适用于中止的快照,可以防止拍摄其他快照。如果集群处于红色状态或存在写块,请清除该状态或写块以解决此问题。

重要提示:除非快照已完成,否则不要运行升级资格检查。

正在运行的快照有处于红色状态的集群

要仅列出注册到您的域的存储库名称,请使用以下语法:

curl -XGET "http://es_endpoint/_cat/repositories?v&h=id"

要列出注册到您的域的存储库名称、类型和其他设置,请使用以下语法:

curl -XGET "http://es_endpoint/_snapshot?pretty"
curl -XGET "https://es_endpoint/_cluster/state/metadata"

检查您是否可以列出每个存储库中的快照,不包括 cs-automatedcs-automated-enc 存储库。如果您有多个存储库,请使用与以下类似的 bash 脚本:

#!/bin/bash
repos=$(curl -s https://es_endpoint/_cat/repositories 2>&1 |grep  -v "cs-automated" | awk '{print $1}')

for i in $repos; do
echo "Snapshots in ... :" $i >>/tmp/snapshot
`curl -s -XGET https://es_endpoint/_cat/snapshots/$i >> /tmp/snapshot`
\echo "done..."
done

重要提示cs-automatedcs-automated-enc 存储库中进度停滞的快照无法手动删除。

要查看 /tmp/snapshot 文件夹中的输出,请使用以下语法:

cat /tmp/snapshot

此命令会返回与以下类似的响应:

Snapshots in ... : snapshot-manual-repo
axa_snapshot-1557497454881 SUCCESS 1557639400 05:36:40 1557639405 05:36:45  4.6s  7 31 0 31
2019-05-15                 SUCCESS 1560503610 09:13:30 1560503622 09:13:42 11.8s  4 16 0 16
epoch_test                 SUCCESS 1569151317 11:21:57 1569151335 11:22:15 18.1s 15 56 0 56

返回的错误消息表示 Amazon Simple Storage (Amazon S3) 存储桶已被删除并被注册为快照存储库:

Snapshots in ... : snapshot-manual-repo
{"error":{"root_cause":[{"type":n","reason":"[snapshot-manual-repo] could not read repository data from index blob"}],"type":"repository_exception","reason":"[snapshot-manual-repo] could not read repository data from index blob","caused_by":{"type":"i_o_exception","reason":"Exception when listing blobs by prefix [index-]","caused_by":{"type":"a_w_s_security_token_service_exception","reason":"a_w_s_security_token_service_exception: User: arn:aws:sts::999999999999:assumed-role/cp-sts-grant-role/swift-us-east-1-prod-666666666666 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::666666666666:policy/my-manual-es-snapshot-creator-policy (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 6b9374fx-11xy-11yz-ff66-918z9bb08193)"}}},"status":500}

验证手动快照存储库是否已从 Amazon S3 存储桶中删除:

aws s3 ls | grep -i "snapshot-manual-repo"

注意:请将 snapshot-manual-repo 替换为您的存储桶的名称。

然后从 Amazon ES 删除该存储库:

curl -XDELETE "https://es_endpoint/_snapshot/snapshot-example-manual-repo"

快照超时或失败

检查是否可以手动拍摄快照。如果出现无法拍摄手动快照错误,请调用 _cat/snapshots API:

curl -XGET/_cat/snapshots/s3_repository

注意:请将 s3_repository 替换为您的 S3 存储桶的名称。

上述语法用于检查当前快照已经运行了多长时间。如果持续时间看起来合理,请等待快照完成,然后重试。

然后,检查集群的运行状况:

curl -XGET "https://es_endpoint/_cluster/health?pretty"

如果集群处于红色状态,请先清除该红色集群。如果集群正在重新分配或初始化分片,则等待该过程完成后再配置任何访问策略。请注意,重新分配分片可能显著制约集群的计算资源。有关排查红色状态集群问题的更多信息,请参阅红色集群状态