.suofang img { max-width: 100% !important; height: auto !important }

本篇文章记录最近ES做节点替换,从shard迁移过程中被锁定导致无法分配,主shard正常,希望可以帮助其它人
failed to create shard,failed to obtain in-memory shard lock,ShardLockObtainFailedException

一、问题描述

这次遇到的问题比较特殊,尝试过以下几种手段都没有恢复:

  1. _cluster/reroute手动分片shard
  2. 由于是从shard无法分片,所以当时试过将所以的副本改成0,然后再设置成1,想通过重新生成副本来解决,结果也失败

接下来是排查问题的过程:

1、通过“GET _cat/shards/indexname”错误信息如下,从shard无法分配,主shard正常,正常的shard未展示出来:
indexname                3     r      UNASSIGNED
indexname 4 r UNASSIGNED
indexname 1 r UNASSIGNED

之前在运维过程中也遇到过UNASSIGNED这种从shard无法分配的问题,通过"allocate_replica"命令手动分配可以解决,这类问题一般都是因为node节点重启或者失联导致的shard分片异常

2、通过“GET _cluster/allocation/explain”错误信息如下:

"index": "indexname",
"shard": 3,
"primary": false,
"current_state": "unassigned",
"unassigned_info": {
"reason": "ALLOCATION_FAILED",
"at": "2023-11-02T18:43:14.758Z",
"failed_allocation_attempts": 300,
"details": "failed shard on node [4MMOUt8-SMatWGCzX1asAQ]: failed to create shard, failure IOException[failed to obtain in-memory shard lock]; nested: ShardLockObtainFailedException[[indexname][3]: obtaining shard lock timed out after 5000ms]; ",
"last_allocation_status": "no_attempt"
},
"can_allocate": "no",
"allocate_explanation": "cannot allocate because allocation is not permitted to any of the nodes",

大多数情况下shard的allocate相关的问题都可以通过“GET _cluster/allocation/explain”命令获取到有用的关键信息,从返回的内容来分析是索引的第3个shard导致的,在node节点[4MMOUt8-SMatWGCzX1asAQ]被锁定。

二、处理过程

知道问题原因了就有方法解决了,我准备了三套方案,如下:

前置工作

  1. 业务将索引的读写请求切走
  2. 创建一个测试索引验证shard是否都正常
  3. 备份索引数据

方案1:重启索引

--刷新索引
POST indexname/_flush
--关闭索引
POST indexname/_close
---打开索引
POST indexname/_open

在本次处理过程中,使用了方案1重启索引就已经把问题解决了,但是方案一还是的业务配合将读写请求切走,否则索引close会导致应用的请求报错

方案2:重启节点node节点

[4MMOUt8-SMatWGCzX1asAQ]

PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
} PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}

方案2重启锁定shard的节点理论上来说也是可以解决这个问题,但是因为方案一已经解决了问题就没机会做测试

方案3.重建索引

  1. 先还原备份到一个临时索引,验证数据没问题
  2. 删除当前索引,还原创建新索引
方案3是最后的方案了,如果方案1和2都解决不了的话只能通过方案3进行索引重建来解决,通过备份还原的方式来恢复索引其实也是很快的

三、思考总结

其实整个问题处理过程中还有一些其它的细节在文中没有提到,就是集群在默认开启自动shard均衡过程中由于shard多长尝试分片无法成功,达到默认的5次重试之后就会报错,这个时候其实可以尝试将集群的自动分片关闭"cluster.routing.allocation.enable": "none",然后执行"POST /_cluster/reroute?retry_failed=true"来重置计数,最后通过手动分片shard的方式来做迁移也有可能能解决问题。只不过在每次遇到问题的时候需要结合当时的最佳场景去做判断,寻找影响范围最小的方案;

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

.feedbackCon a { border-bottom: 1px dotted rgba(51, 51, 51, 1) }

记录ElasticSearch分片被锁定导致无法分配处理过程的更多相关文章

  1. Elasticsearch 分片集群原理、搭建、与SpringBoot整合

    单机es可以用,没毛病,但是有一点我们需要去注意,就是高可用是需要关注的,一般我们可以把es搭建成集群,2台以上就能成为es集群了.集群不仅可以实现高可用,也能实现海量数据存储的横向扩展. 新的阅读体 ...

  2. 超详细从零记录Hadoop2.7.3完全分布式集群部署过程

    超详细从零记录Ubuntu16.04.1 3台服务器上Hadoop2.7.3完全分布式集群部署过程.包含,Ubuntu服务器创建.远程工具连接配置.Ubuntu服务器配置.Hadoop文件配置.Had ...

  3. 【控制分片分配】控制Elasticsearch分片和副本的分配

    ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本.通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题.不能运 ...

  4. Elasticsearch分片&副本分配

    集群索引中可能由多个分片构成,并且每个分片可以拥有多个副本,将一个单独的索引分为多个分片,可以处理不能在单一服务器上运行的 大型索引. 由于每个分片有多个副本,通过副本分配到多个服务器,可以提高查询的 ...

  5. Elasticsearch分片优化

    原文地址:https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index 大多数ElasticSearch用户在创建索引 ...

  6. Elasticsearch分片、副本与路由(shard replica routing)

    本文讲述,如何理解Elasticsearch的分片.副本和路由策略. 1.预备知识 1)分片(shard) Elasticsearch集群允许系统存储的数据量超过单机容量,实现这一目标引入分片策略sh ...

  7. 事故记录:php-cgi进程过多导致系统资源耗尽

    事故现象:机房一台服务器运行一段时间后,突然发现系统资源即将被耗尽! 1)top命令查看一下系统的cpu ram swap的使用情况 由上图分析,可以看出1--共有602个进程,但其中有601个进程休 ...

  8. Elasticsearch 分片路由原理指定分片存储查询

    Elasticsearch 项目中使用到Es的父子结构.在数据填充之后,查看每个节点的数据分布情况,发现有的节点数据多,有的节点少的情况,在未使用Es父级结构之前,每个节点的数据分布还算平均,如下图: ...

  9. 【分片无法挂载】Elasticsearch分片和副本无法挂载(分片移位)

    部署说明 硬件 服务器两台: 机器A:64G内存 机器B:32G内存 分片 共12个节点 2个查询节点,10个存储节点 8个主分片 1个复制分片(每个分片都有一个副本分布在不同的节点上面) 每台机器都 ...

  10. 有关elasticsearch分片策略的总结

    最近在优化部分业务的搜索吞吐率,结合之前优化过写请求的经验,想和大家讨论下我对es分片在不同场景下的分配策略的思路   原先普通索引我的分片策略是: 主分片=节点数,副本=1,这样可以保证业务数据一定 ...

随机推荐

  1. EC600U-4G模组,连接阿里云测试服务器和物联网平台

    原博主视频:https://www.bilibili.com/video/BV1yT4y1P7Gw?share_source=copy_web 连接阿里云服务器 !!需要公网ip(服务器)才能远程,不 ...

  2. PostgreSQL 10 文档: 系统表

    第 51 章 系统目录 目录 51.1. 概述 51.2. pg_aggregate 51.3. pg_am 51.4. pg_amop 51.5. pg_amproc 51.6. pg_attrde ...

  3. 深入Scikit-learn:掌握Python最强大的机器学习库

    本篇博客详细介绍了Python机器学习库Scikit-learn的使用方法和主要特性.内容涵盖了如何安装和配置Scikit-learn,Scikit-learn的主要特性,如何进行数据预处理,如何使用 ...

  4. python命令行解析模块argparse

    argparse是Python标准库中推荐的命令行解析模块 code01: tmp.py import argparse parser = argparse.ArgumentParser(descri ...

  5. Nginx深入:nginx功能模块、目录结构及配置文件详解

    Nginx功能模块说明 1.Nginx 核心功能模块(Core functionality) Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的核心层(Main层)和事件(Event ...

  6. .Net AsyncLocal介绍

    AsyncLocal的基本概念 AsyncLocal是一个在异步环境中存储和传递状态的类型.它允许你在线程或任务之间共享数据,而不会受到异步上下文切换的影响. 每一个异步的AsyncLocal的数据都 ...

  7. [kubernetes]二进制部署k8s集群-基于containerd

    0. 前言 k8s从1.24版本开始不再直接支持docker,但可以自行调整相关配置,实现1.24版本后的k8s还能调用docker.其实docker自身也是调用containerd,与其k8s通过d ...

  8. Python 潮流周刊#17:Excel 终于支持 Python 了、Meta 重磅开源新项目、Mojo 新得 1 亿美元融资

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中两则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...

  9. 【Java监控】使用SkyWalking监控Java服务

    你的Java服务是如何监控的呢? 1.Null:监控?什么监控?我一个写代码的服务挂了跟我有什么关系? 2.命令行:服务挂了?内存泄漏?jstat jmap jcmd,还好不是我写的 3.撸代码:Ja ...

  10. LeetCode 周赛上分之旅 #43 计算机科学本质上是数学吗?

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...