ES索引Red、Yellow状态快速恢复

By | 2022年4月22日
目录
[隐藏]

问题背景与现象

如果索引状态为Red,说明该索引有未分配的主分片,索引无法正常读写;如果索引状态为Yellow,说明该索引有未分配的副本分片,索引可以正常读写,但影响高可用性。

影响范围、程度

索引Red状态影响业务正常运行,索引Yellow状态影响服务高可用性。

处理思路简述

Red状态的索引是由于该索引有主分片未能分配导致的,主分片状态为UNASSIGNED;Yellow状态的索引是由于该索引有未能分配的副本分片导致的,副本分片状态为UNASSIGNED。所以,首先查看哪些分片是UNASSIGNED状态,然后查看这些分片未能分配的原因,解决未分配的原因后再次尝试重新分配这些分片。

操作方法

  1. 通过以下命令查看状态为UNASSIGNED的分片。

    curl -XGET “http://127.0.0.1:24100/_cat/shards?h=index,shard,prirep,state,unassigned.reason” | grep “UNASSIGNED”

    该命令返回的最后一列unassigned.reason显示了分片未分配的原因,常见的分片未分配原因如下:

    表1 常见分片未分配原因
    原因 说明
    INDEX_CREATED 由于创建索引的API而未分配
    CLUSTER_RECOVERED 由于集群恢复而未分配
    INDEX_REOPENED 由于索引重新打开而未分配
    DANGLING_INDEX_IMPORTED 由于引入dangling索引而未分配
    NEW_INDEX_RESTORED 由于恢复到新索引而未分配
    EXISTING_INDEX_RESTORED 由于恢复到关闭的索引而未分配
    REPLICA_ADDED 由于显式添加副本而未分配
    ALLOCATION_FAILED 由于分片分配失败而未分配
    NODE_LEFT 由于该分片所在的节点离开集群而未分配
    REROUTE_CANCELLED 由于显式的取消reroute命令而未分配
    REINITIALIZED 由于分片重新初始化而未分配
    REALLOCATED_REPLICA 由于一个更好的副本分片位置被识别到,该副本分片分配取消
  2. 通过unassigned.reason只能明确一个大概的未分配原因,而具体原因可以通过explian命令查看。

    curl -XGET “http://127.0.0.1:24100/_cluster/allocation/explain?pretty” -H ‘Content-Type:application/json’ -d ‘{“index”: “索引名”,”shard”: 分片号,”primary”: 是否为主分片(true/false)}’

  3. 根据explain查看到的未分配原因处理具体问题。常见的未分配原因有:

    (1) 分片分配的延迟机制:当一个实例下线后,该实例上的分片会在设定的一定时间内等待该实例重新上线,若超过设定的时间,则会分配到其他实例上。

    (2) 实例数小于副本数:当实例数小于副本数时,会出现副本分片分配到其对应主分片所在的实例上,而这种情况默认设置是不允许的。

    (3) cluster.routing.allocation.enable参数:cluster.routing.allocation.enable参数设置为all才可以分配所有分片;如果是primaries,则只分配主分片;如果是new_primaries,则只分配新索引的主分片;如果未none,则不分配任何类型的分片。

    (4) cluster.routing.allocation.total_shards_per_node参数:cluster.routing.allocation.total_shards_per_node参数规定了允许分配到每个实例上的总分片数,若要分配的分片会使该实例上的分片总数超出该值,则不允许分配。

    (5) 磁盘空间不足:当某个实例的磁盘使用率超过cluster.routing.allocation.disk.watermark.low参数所设定的值,则不允许分片分配到该实力上。

  4. 尝试重新分配之前分配失败的分片。

    curl -XPOST “http://127.0.0.1:24100/_cluster/reroute?retry_failed=true”

注意:操作步骤中的curl命令为非安全版本的示例。具体请参考:

检查Elasticsearch是否为安全模式:

Manager上查看Elasticsearch的配置ELASTICSEARCH_SECURITY_ENABLE是否为true,是则表示为安全模式。

查询elasticsearch是否禁止低版本的TLS:

Manager上查看Elasticsearch的配置DISABLE_TLS_LOW_PROTOCOL/DISABLE_TLSV1_PROTOCOL是否为true,是则表示禁止低版本TLS(C80SPC300之前版本配置项名称为DISABLE_TLSV1_PROTOCOL)。

安全模式且禁止低版本,执行curl -XGET –tlsv1.2 –negotiate -k -u : “https://127.0.0.1:24100/_cluster/health?pretty”;

安全模式未禁止低版本,curl -XGET os安装的tls版本 –negotiate -k -u : “https://127.0.0.1:24100/_cluster/health?pretty”;

非安全模式,curl -XGET “http://127.0.0.1:24100/_cluster/health?pretty”

修复验证

通过_cat/indices查看索引状态是否恢复为green。

发表评论

您的电子邮箱地址不会被公开。