您当前的位置: 首页 > 

顧棟

暂无认证

  • 2浏览

    0关注

    227博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【ES实战】分片无法分配

顧棟 发布时间:2021-11-23 11:24:44 ,浏览量:2

文章目录
    • 分片无法分配的问题思路
      • 一、寻找到无法分配的索引分片
      • 二、查询分片未分配的理由
        • 分片没有被分配的错误类型
      • 三、根据分片未分配的理由可以进行一些处理
      • 四、查询恢复情况

分片无法分配的问题思路 一、寻找到无法分配的索引分片
GET /_cat/shards?v&s=state:desc

结果

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

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

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

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

GET _cluster/allocation/explain
{
  "index": "index",
  "shard": 0,
  "primary": true
}

index:索引名称

shard:分片编号

primary:是否是主分片

也可以直接使用命令

GET /_cluster/allocation/explain

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

分片没有被分配的错误类型
  • INDEX_CREATED 由于 create index api 创建索引导致,索引创建过程中,把索引的全部分片分配完毕需要一个过程,在全部分片分配完毕之前,该索引会处于短暂的 RED 或 YELLOW 状态。因此监控系统如果发现集群 RED,不一定代表出现了故障。

  • CLUSTER_RECOVERED 集群完全重启时,所有分片都被标记为未分配状态,因此在集群完全重启时的启动阶段,reason属于此种类型。

  • INDEX_REOPENED open 一个之前 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

    手工强制分配分片。

三、根据分片未分配的理由可以进行一些处理
  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实例的对应劜,是可以恢复数据的(不保证不丢失数据)。

四、查询恢复情况
GET _cat/recovery/indexName?v
关注
打赏
1663402667
查看更多评论
立即登录/注册

微信扫码登录

0.0393s