es实战-分片分配失败解决方案

简介: 分片无法分配情况的一些解决办法

分片分配失败的原因

  1. 线上集群突然断电或者使用了kill -9 pid进行集群关闭
  2. 磁盘信道损坏
  3. 使用了错误的配置(小问题,排查副本/分片路由等配置即可)

排查解决方案

1. 查看未分配的原因

GET /_cluster/allocation/explain
GET _cat/indices?v&health=red
GET /_cat/shards?v&h=n,index,shard,prirep,state,sto,sc,unassigned.reason,unassigned.details
ALLOCATION_FAILED:由于分片分配失败而未分配。
CLUSTER_RECOVERED:由于集群恢复而未分配。
DANGLING_INDEX_IMPORTED:由于导入了悬空索引导致未分配。
EXISTING_INDEX_RESTORED:由于恢复为已关闭的索引导致未分配。
INDEX_CREATED:由于API创建索引而未分配。
INDEX_REOPENED:由于打开已关闭索引而未分配。
NEW_INDEX_RESTORED:由于恢复到新索引而未分配。
NODE_LEFT:由于托管的节点离开集群而未分配。
REALLOCATED_REPLICA:确定了更好的副本位置,并导致现有副本分配被取消。
REINITIALIZED:当分片从开始移动回初始化,导致未分配。
REPLICA_ADDED:由于显式添加副本而未分配。
REROUTE_CANCELLED:由于显式取消重新路由命令而未分配。

2. 尝试重新分配失败的分片

POST /_cluster/reroute?retry_failed=true

默认索引的尝试次数为5,可以将此参数调大尝试reroute,也许有奇效:

PUT /indexname/_settings
{
  "index": {
    "allocation": {
      "max_retries": 20
    }
  }
}

3. 重新关开索引尝试或者重启集群

POST /index/_close(_open)

4. 将副本分片提升为主分片

如果确定了主分片已经损坏,可以尝试将副本分片提升为主(会丢部分数据):

POST /_cluster/reroute?pretty
{
  "commands": [
    {
      "allocate_stale_primary": {
        "index": "indexname",//索引名
        "shard": 3,//操作的分片id
        "node": "node1",//此分片副本位于的节点
        "accept_data_loss": true//提示数据可能会丢失
      }
    }
  ]
}

此方案存在一个问题是需要提前知道此分片的副本位于哪个节点用以指定,可以通过如果api获取副本分片位置:

GET _shard_stores?pretty
GET indexname/_shard_stores?pretty

判断当前es进程使用的数据目录:通过pid和yml配置的目录去匹配,如data

ll /proc/pid/fd |grep data

如果索引损坏导致api失效,则需要人工去数据目录进行查找副本分片位置,目录结构如下:

data/nodes/0/indices/Z60wvPOWSP6Qbk79i757Vg/0

数据目录下为节点号 -> 索引文件夹 -> 索引ID -> 分片号

5. 将此分片置为空分片

如果此分片的主副都已经损坏,则可将此分片置为空以保留索引其他分片数据:

{
  "commands": [
    {
      "allocate_empty_primary": {
        "index": "indexname",//索引名
        "shard": 3,//操作的分片id
        "node": "node1",//空分片要分配的节点
        "accept_data_loss": true//提示数据可能会丢失
      }
    }
  ]
}

如果集群存在大量索引分片无法恢复,则可以使用脚本将全部分片置空,可以基于下面的脚本修改:

#!/bin/bash
master=$(curl -s 'http://localhost:9200/_cat/master?v' | grep -v ' ip ' | awk '{print $1}')
for index in $(curl  -s 'http://localhost:9200/_cat/shards' | grep UNASSIGNED | awk '{print $1}' | sort | uniq); do
    for shard in $(curl  -s 'http://localhost:9200/_cat/shards' | grep UNASSIGNED | grep $index | awk '{print $2}' | sort | uniq); do
        echo  $index $shard
        curl -XPOST -H 'Content-Type: application/json'  'http://localhost:9200/_cluster/reroute' -d '{
            "commands" : [ {
                  "allocate_empty_primary" : {
                      "index" : "'$index'",
                      "shard" : "'$shard'",
                      "node" : "'$master'",
                  "accept_data_loss" : true
                  }
                }
            ]
        }'
        sleep 1
    done
done
相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
监控 Java 索引
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
|
安全 Linux 网络安全
组网神器WireGuard安装与配置教程(超详细)
组网神器WireGuard安装与配置教程(超详细)
42978 2
|
Kubernetes 监控 Cloud Native
|
12月前
|
机器学习/深度学习 人工智能 编解码
阿里开源AI视频生成大模型 Wan2.1:14B性能超越Sora、Luma等模型,一键生成复杂运动视频
Wan2.1是阿里云开源的一款AI视频生成大模型,支持文生视频和图生视频任务,具备强大的视觉生成能力,性能超越Sora、Luma等国内外模型。
3964 2
阿里开源AI视频生成大模型 Wan2.1:14B性能超越Sora、Luma等模型,一键生成复杂运动视频
|
存储 监控 Linux
在 CentOS 7 中进行磁盘分区和挂载的具体操作步骤,如何使用 `fdisk` 创建分区、格式化分区、创建挂载点以及临时和永久挂载分区的方法。
本文介绍了在 CentOS 7 中进行磁盘分区和挂载的具体操作步骤。通过一个实际案例,详细说明了如何使用 `fdisk` 创建分区、格式化分区、创建挂载点以及临时和永久挂载分区的方法。此外,还分享了一些实践经验,帮助读者更好地管理和优化服务器磁盘空间。
2291 4
|
监控 API 数据库
Elasticsearch 磁盘使用率超过警戒水位线,怎么办?
Elasticsearch 磁盘使用率超过警戒水位线,怎么办?
|
缓存 自然语言处理 Java
Elasticsearch 断路器报错了,怎么办?
Elasticsearch 断路器报错了,怎么办?
|
存储 监控 NoSQL
【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南
【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南
438 0
|
IDE Java 编译器
lombok编译遇到“找不到符号的问题”
【9月更文挑战第18天】当使用 Lombok 遇到 “找不到符号” 的问题时,可能是由于 Lombok 未正确安装、编译器不支持、IDE 配置不当或项目构建工具配置错误。解决方法包括确认 Lombok 安装、编译器支持,配置 IDE 和检查构建工具配置。通过这些步骤通常可解决问题,若问题仍存在,建议检查项目配置和依赖,或查看日志获取更多信息。
6145 2
|
存储 NoSQL JavaScript
mongodb时间处理,时区处理
mongodb时间处理,时区处理
4142 2

热门文章

最新文章