记录ElasticSearch分片被锁定导致无法分配处理过程

愛在花開的季節  金牌会员 | 2023-12-9 10:42:11 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 671|帖子 671|积分 2013

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

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

  • _cluster/reroute手动分片shard
  • 由于是从shard无法分片,所以当时试过将所以的副本改成0,然后再设置成1,想通过重新生成副本来解决,结果也失败
接下来是排查问题的过程:
1、通过“GET _cat/shards/indexname”错误信息如下,从shard无法分配,主shard正常,正常的shard未展示出来:
  1. indexname                3     r      UNASSIGNED                                 
  2. indexname                4     r      UNASSIGNED                                 
  3. indexname                1     r      UNASSIGNED                                 
复制代码
之前在运维过程中也遇到过UNASSIGNED这种从shard无法分配的问题,通过"allocate_replica"命令手动分配可以解决,这类问题一般都是因为node节点重启或者失联导致的shard分片异常
2、通过“GET _cluster/allocation/explain”错误信息如下:
  1. "index": "indexname",
  2.   "shard": 3,
  3.   "primary": false,
  4.   "current_state": "unassigned",
  5.   "unassigned_info": {
  6.     "reason": "ALLOCATION_FAILED",
  7.     "at": "2023-11-02T18:43:14.758Z",
  8.     "failed_allocation_attempts": 300,
  9.     "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]; ",
  10.     "last_allocation_status": "no_attempt"
  11.   },
  12.   "can_allocate": "no",
  13.   "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]被锁定。
二、处理过程

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

  • 业务将索引的读写请求切走
  • 创建一个测试索引验证shard是否都正常
  • 备份索引数据
方案1:重启索引
  1. --刷新索引
  2. POST indexname/_flush
  3. --关闭索引
  4. POST indexname/_close
  5. ---打开索引
  6. POST indexname/_open
复制代码
在本次处理过程中,使用了方案1重启索引就已经把问题解决了,但是方案一还是的业务配合将读写请求切走,否则索引close会导致应用的请求报错
方案2:重启节点node节点

[4MMOUt8-SMatWGCzX1asAQ]
  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster.routing.allocation.enable": "none"
  5. }
  6. }
  7. PUT _cluster/settings
  8. {
  9. "persistent": {
  10. "cluster.routing.allocation.enable": "all"
  11. }
  12. }
复制代码
方案2重启锁定shard的节点理论上来说也是可以解决这个问题,但是因为方案一已经解决了问题就没机会做测试
方案3.重建索引


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

其实整个问题处理过程中还有一些其它的细节在文中没有提到,就是集群在默认开启自动shard均衡过程中由于shard多长尝试分片无法成功,达到默认的5次重试之后就会报错,这个时候其实可以尝试将集群的自动分片关闭"cluster.routing.allocation.enable": "none",然后执行"OST /_cluster/reroute?retry_failed=true"来重置计数,最后通过手动分片shard的方式来做迁移也有可能能解决问题。只不过在每次遇到问题的时候需要结合当时的最佳场景去做判断,寻找影响范围最小的方案; 
备注:
    作者:pursuer.chen
    博客:http://www.cnblogs.com/chenmh
本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。
《欢迎交流讨论》

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表