AWS上的Elasticsearch:如何修复未分配的分片?

时间:2017-08-02 13:37:27

标签: amazon-web-services elasticsearch sharding elasticsearch-5

我在AWS Elasticsearch上有一个索引,由于NODE_LEFT而未加密。这是_cat/shards

的输出
rawindex-2017.07.04                     1 p STARTED    
rawindex-2017.07.04                     3 p UNASSIGNED NODE_LEFT
rawindex-2017.07.04                     2 p STARTED    
rawindex-2017.07.04                     4 p STARTED    
rawindex-2017.07.04                     0 p STARTED    

在正常情况下,使用_cluster_settings很容易重新分配这些分片。但是,这些是AWS不允许的确切API。我收到以下消息:

{
    Message: "Your request: '/_settings' is not allowed."
}

根据an answer to a very similar question,我可以使用AWS允许的_index API更改索引的设置。但是,似乎index.routing.allocation.disable_allocation对我正在运行的Elasticsearch 5.x无效。我收到以下错误:

{
    "error": {
        "root_cause": [
            {
                "type": "remote_transport_exception",
                "reason": "[enweggf][x.x.x.x:9300][indices:admin/settings/update]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "unknown setting [index.routing.allocation.disable_allocation] please check that any required plugins are installed, or check the breaking changes documentation for removed settings"
    },
    "status": 400
}

我尝试使用高index.priority优先处理索引恢复,并将index.unassigned.node_left.delayed_timeout设置为1分钟,但我无法重新分配它们。

在AWS托管ES上有没有办法(脏或优雅)?

谢谢!

2 个答案:

答案 0 :(得分:1)

我在AWS Elasticsearch 6.3版中遇到了类似的问题,即2个分片未能分配,并且集群的状态为RED。运行GET _cluster/allocation/explain表明原因是它们超过了默认的最大分配重试次数5。

运行查询GET <my-index-name>/_settings显示了每个索引可以更改的一些设置。请注意,所有查询均采用Kibana格式,如果您使用的是AWS Elasticsearch Service,则开箱即用。以下解决了我的问题:

PUT <my-index-name>/_settings
{
  "index.allocation.max_retries": 6
}

此后立即运行GET _cluster/allocation/explain返回了以下错误:"reason": "unable to find any unassigned shards to explain...",并在一段时间后解决了该问题。

答案 1 :(得分:0)

当其他解决方案失败时,可能会有替代解决方案。如果您在AWS上具有托管Elasticsearch实例,则很有可能“仅”恢复快照。

检查失败的索引。

您可以用于例如:

curl -X GET "https://<es-endpoint>/_cat/shards"

curl -X GET "https://<es-endpoint>/_cluster/allocation/explain"

检查快照。

要查找快照存储库,请执行以下查询:

curl -X GET "https://<es-endpoint>/_snapshot?pretty"

接下来让我们看一下cs-automated存储库中的所有快照:

curl -X GET "https://<es-endpoint>/_snapshot/cs-automated/_all?pretty"

查找一个快照,其中failures: [ ]为空,或者您要还原的索引未处于失败状态。然后删除要还原的索引:

curl -XDELETE 'https://<es-endpoint>/<index-name>'

...并像这样恢复已删除的索引:

curl -XPOST 'https://<es-endpoint>/_snapshot/cs-automated/<snapshot-name>/_restore' -d '{"indices": "<index-name>"}' -H 'Content-Type: application/json'

这里也有一些很好的文档: