ES中分配分配问题排查

admin2024-05-15  1

寻找到无法分配的索引分片

GET /_cat/shards?v&s=state:desc

返回格式说明

索引名称分片编号主副分片分片状态文档数量分片存储大小分配所在IP
分配所在node名称 
indexshardprirep

state

unassigned代表未分配的分片

docsstoreipnode

查询分片未分配的理由

GET /_cluster/allocation/explain

命令说明:

这个命令只会展示出一条无法分配索引的分片的信息,包括无法分配的理由。

分片没有被分配的错误类型:

错误类型说明
INDEX_CREATED由于 create index api 创建索引导致,索引创建过程中,把索引的全部分片分配完毕需要一个过程,在全部分片分配完毕之前,该索引会处于短暂的 RED 或 YELLOW 状态。因此监控系统如果发现集群 RED,不一定代表出现了故障。
CLUSTER_RECOVERED集群完全重启时,所有分片都被标记为未分配状态,因此在集群完全重启时的启动阶段,reason属于此种类型。
INDEX_REOPENEDopen 一个之前 close 的索引, reopen 操作会将索引分配重新分配。
DANGLING_INDEX_IMPORTED正在导入一个 dangling index,什么是 dangling index?悬空索引 磁盘中存在,而集群状态中不存在的索引称为 dangling index,例如从别的集群拷贝了一个索引的数据目录到当前集群,Elasticsearch 会将这个索引加载到集群中,因此会涉及到为 dangling index 分配分片的过程。
NEW_INDEX_RESTORED从快照恢复到一个新索引。
EXISTING_INDEX_RESTORED从快照恢复到一个关闭状态的索引。
REPLICA_ADDED增加分片副本。
ALLOCATION_FAILED由于分配失败导致。
NODE_LEFT由于节点离线。
REROUTE_CANCELLED由于显式的cancel reroute命令。
REINITIALIZED由于分片从 started 状态转换到 initializing 状态。
REALLOCATED_REPLICA由于迁移分片副本。
PRIMARY_FAILED初始化副分片时,主分片失效。
FORCED_EMPTY_PRIMARY强制分配一个空的主分片。
MANUAL_ALLOCATION手工强制分配分片。

根据分片未分配的理由可以进行一些处理

简单重试:

POST /_cluster/reroute?retry_failed=true

尝试定向分配分片(可能丢失数据):

POST /_cluster/reroute
{
    "commands" : [
        {
          "allocate_stale_primary" : {
                "index" : "indexName",
                "shard" : 1,
                "node" : "es-prd-node1",
                "accept_data_loss": true
          }    
        }
    ]
}

尝试初始化主分片(必然失去数据)

POST /_cluster/reroute
{
    "commands" : [
        {
          "allocate_empty_primary" : {
                "index" : "indexName",
                "shard" : 1,
                "node" : "es-prd-node1",
                "accept_data_loss": true
          }    
        }
    ]
}

对于一些副本分片无法重新分配的情况,可以讲副本数修改为比较少的数比如1,再修改为原来的数量。

PUT myIndex-20210921/_settings
{
 "number_of_replicas": 1
}

查询恢复情况

GET _cat/recovery/indexName?v
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!