ES实战分片无法分配

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES实战分片无法分配相关的知识,希望对你有一定的参考价值。

分片无法分配的问题思路

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

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

结果

索引名称                         分片编号 主副分片 分片状态        文档数量   分片存储大小 分配所在IP           分配所在node名称
index                           shard  prirep state          docs     store      ip                  node

state为unassigned代表未分配的分片。

二、查询分片未分配的理由

可以指定某个分片查询未分配的理由

GET _cluster/allocation/explain

  "index": "nbilling_rebate_sit_topic_index",
  "shard": 0,
  "primary": true

index:索引名称

shard:分片编号

primary:是否是主分片

也可以直接使用命令

GET /_cluster/allocation/explain

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

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

  1. 简单重试
POST /_cluster/reroute?retry_failed=true
  1. 尝试定向分配主分片 可能丢数据
POST /_cluster/reroute

    "commands" : [
        
          "allocate_stale_primary" : 
                "index" : "indexName",
                "shard" : 1,
                "node" : "es-prd-node1",
                "accept_data_loss": true
              
        
    ]

  1. 尝试初始化主分片,必然失去数据
POST /_cluster/reroute

    "commands" : [
        
          "allocate_empty_primary" : 
                "index" : "indexName",
                "shard" : 1,
                "node" : "es-prd-node1",
                "accept_data_loss": true
              
        
    ]

  1. 对于一些副本分片无法重新分配的情况,可以讲副本数修改为比较少的数 比如1,在修改为原来的数量。千万不要讲副本分片数轻易设为0。
PUT myIndex-20210921/_settings

 "number_of_replicas": 1

  1. 一些可以丢数据的场景,直接删除索引重建,也可以快速恢复集群。比如由于副本分片数为0,代表可以丢失数据,在主分片无法恢复的情况下,直接重建此索引。
GET indexName
PUT indexName

 ....

由于集群active Master节点压力过大,或者通信延迟较高,导致元数据信息更新与实际分片信息出现误差时,也会出现分片无法分配的情况,一般表现为节点路径下找不到该索引的相关文件,如果该索引存在副本分片,可以遍历所有ESNode实例的存储路径,应该是可以找到相关文件的,直接拷贝到元数据中指定的Node实例的对应劜,是可以恢复数据的。

以上是关于ES实战分片无法分配的主要内容,如果未能解决你的问题,请参考以下文章

es Unassigned Shards 排查思路

es 基于磁盘的shard分配参数

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

ES 实战索引大分片治理

ES 实战索引大分片治理

记一次线上环境 ES 主分片为分配故障