故障前提

ElasticSearch 版本:5.2

集群节点数:5

索引主分片数:5

索引分片副本数:1

线上环境ES存储的数据量很大,当天由于存储故障,导致一时间 5个节点的 ES 集群,同时有两个节点离线,一个节点磁盘只读(机房小哥不会处理,无奈只有清空数据重新安装系统),一个节点重启后,ES集群报个别索引分片分配异常,ES索引出于保证数据一致性的考虑,并没有把重启节点上的副本分片提升为主分片,所以该索引处于个别主分片丢失 不可写入 状态(索引分片 red)。



由于此图是后来取消副本数为0后,截的图,所以此处并没有副本分片。

处理方案

在网上找了找类似的处理方案,分为以下几个。

  1. 利用 _reroute API 进行分片路由。

    pass: 分片都启不来,按照网上的操作执行失败。

  2. 利用 _reindex API 进行现有数据重新复制到新索引,然后把旧索引删除,新索引建立别名为老索引名称。

    优点:因为如图分片 0 出于只读状态,所以数据是可以访问的,所以利用_reindex可以把副本分片的数据进行复制迁移到新索引,最大保证数据的安全性。

    缺点:因为涉及的数据量比较大,而且_reindex效率很低,220G 的索引数据,大概要3-4天的时间才能写入完毕。线上环境等不了这么久。

    也找了许多提升_reindex效率的方法,设置新索引的副本数为 0,禁用刷新 等等。提升效果都很小。

  3. 线上环境能够接受该索引部分数据的丢失,但求尽快恢复服务。

找了下官方文档,找到了如下方法。

  1. [root@***es4 ~]# curl 'http://localhost:9201/s2*******r201908/_shard_stores?pretty'
  2. {
  3. "indices" : {
  4. "s2********201908" : {
  5. "shards" : {
  6. "0" : {
  7. "stores" : [
  8. {
  9. "kgEDY2A4TBKK6lFzqsurnQ" : {
  10. "name" : "es3",
  11. "ephemeral_id" : "72HkjNj5S-qyl6gmVkbWeg",
  12. "transport_address" : "10.2.97.130:9300",
  13. "attributes" : { }
  14. },
  15. "allocation_id" : "B4G1nHTgQieomyy-KME1ug",
  16. "allocation" : "unused"
  17. },
  18. {
  19. "d3WYyXhBQvqYbZieXzfCNw" : {
  20. "name" : "es5",
  21. "ephemeral_id" : "deBE6DjyRJ-kXdj0XU7FzQ",
  22. "transport_address" : "10.2.101.116:9300",
  23. "attributes" : { }
  24. },
  25. "allocation_id" : "svMhSywPSROQa7MnbvKB-g",
  26. "allocation" : "unused",
  27. "store_exception" : {
  28. "type" : "corrupt_index_exception",
  29. "reason" : "failed engine (reason: [corrupt file (source: [index])]) (resource=preexisting_corruption)",
  30. "caused_by" : {
  31. "type" : "i_o_exception",
  32. "reason" : "failed engine (reason: [corrupt file (source: [index])])",
  33. "caused_by" : {
  34. "type" : "corrupt_index_exception",
  35. "reason" : "checksum failed (hardware problem?) : expected=24fb23d3 actual=66004bad (resource=BufferedChecksumIndexInput(MMapIndexInput(path=\"/var/lib/elasticsearch/nodes/0/indices/oC_7CtFfS2-pa3OoBDAlDA/0/index/_1fjsf.cfs\") [slice=_1fjsf_Lucene50_0.pos]))"
  36. }
  37. }
  38. }
  39. }
  40. ]
  41. }
  42. }
  43. }
  44. }
  45. }

利用 _shard_stores 接口,查看故障索引的分片异常原因。

(es5 节点上,我调用接口设置了副本数从1 变为 0,所以该只读索引还保存有原有分片 0 的副本分片节点信息,可忽略)

我们看到该索引的 0 主分片(故障主分片)以前是存在于 es3 节点上的。ES 由于数据安全性保证,在两个节点都有离线的情况下,锁住了 0 主分片的写入,导致索引也出于只读状态。


  1. [root@*******es4 ~]# curl -XPOST 'http://localhost:9201/_cluster/reroute?master_timeout=5m&pretty' -d '
  2. {
  3. "commands": [
  4. {
  5. "allocate_stale_primary": {
  6. "index": "s2-********201908",
  7. "shard": 0,
  8. "node": "es3",
  9. "accept_data_loss": true
  10. }
  11. }
  12. ]
  13. }'

我们可以手动调用集群的 reroute 接口,在接受部分数据丢失的情况下,我们可以把 es3 节点上的原有副本,强制提升为索引的主分片。

官方文档 说明。

此外,/_cluster/reroute 接口还能够接受手动分配一个空的主分片到已有索引分配之中。谨慎使用

  1. [root@*******es4 ~]# curl -XPOST 'http://localhost:9201/_cluster/reroute?master_timeout=5m&pretty' -d '
  2. {
  3. "commands": [
  4. {
  5. "allocate_empty_primary": {
  6. "index": "s2-********201908",
  7. "shard": 0,
  8. "node": "es3",
  9. "accept_data_loss": true
  10. }
  11. }
  12. ]
  13. }'

这种更残暴,直接把分片数据清空,强制拉上线。 但是这也不失为一种处理方法。

最终,该索引恢复正常。

记一次线上环境 ES 主分片为分配故障的更多相关文章

  1. 记一次线上环境的内存溢出(java.lang.OutOfMemoryError)

    事故背景 今天客户说风控项目有个别用户查询不到数据不是报错就是一直卡在那里,我就去那个接口看了下. 一看项目日志今天的都几个g了,平常也就几百兆吧,很明显出了问题. 请求接口后使用命令tail -f ...

  2. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  3. 解Bug之路-记一次线上请求偶尔变慢的排查

    解Bug之路-记一次线上请求偶尔变慢的排查 前言 最近解决了个比较棘手的问题,由于排查过程挺有意思,于是就以此为素材写出了本篇文章. Bug现场 这是一个偶发的性能问题.在每天几百万比交易请求中,平均 ...

  4. 使用Fabric一键批量部署上线/线上环境监控

    本文讲述如何使用fabric进行批量部署上线的功能 这个功能对于小应用,可以避免开发部署上线的平台,或者使用linux expect开发不优雅的代码. 前提条件: 1.运行fabric脚本的机器和其他 ...

  5. CAS (15) — CAS 线上环境 Ehcache Replication 的非稳定重现错误 java.util.ConcurrentModificationException

    CAS (15) - CAS 线上环境 Ehcache Replication 的非稳定重现错误 摘要 线上环境在 EhCache Replication 过程中出现 java.util.Concur ...

  6. 【微信小程序】---线上环境搭建

    一.前言 通常我们在本地电脑上开发微信小程序,调用和访问小程序会有很多问题.特别是在配有自己后端的情况下,我们通过真机访问我们的小程序会出现不可访问的问题 二.线上环境搭建 在这里我们主要以腾讯云给大 ...

  7. robot framework 测试/预发/线上环境快捷切换

    通常情况下布署的三套环境:测试.预发及线上环境.调试或者辅助验证测试时,切环境改变量甚是麻烦.这些变量包括但不限于:一些url信息,数据库信息,预置用户信息等. 切换环境方法一:使用变量文件,通过判断 ...

  8. 线上环境HBASE-1.2.0出现oldWALs无法自动回收情况;

    正常情况下,hmaster会定期清理oldWALs文件夹,一般该文件大小也就几百兆,但是我们线上 环境出现了该文件没有自动回收情况,如图: 该目录占用hdfs空间多达7.6T,浪费空间: 后来经过多番 ...

  9. vue本地和线上环境(域名)配置

    vue本身为运行脚手架项目自家搭载了一个nodejs后台环境,本地可通过proxyTable来处理跨域问题,但是上线(或生产环境)之后改域名真是一件麻烦的事情,所以进行一些配置. config/ind ...

随机推荐

  1. Xshell和Xftp - 下载安装

    简介 Xshell 实际工作运用:连接Linux Xftp 实际工作运用:传输文件到Linux系统 下载安装 三连后评论区留言私发,此贴长期有效!!!

  2. Elasticsearch6.8.6版本 在head插件中 对数据的增删改操作

    一.访问ES方法:http://IP:PORT/ 一.创建索引:head插件创建索引的实例:在"索引"-"新建索引"中创建索引名称,默认了分片与副本情况: 直接 ...

  3. WireShark高级用法

    报文注释 分组注释 尽量使用英文注释 时间显示 显示实际时间 抓包过滤器 按照规则抓取报文 显示过滤器 按照规则显示报文 自动生成过滤条件:做为过滤器应用 着色规则 默认 可自定义着色规则 追踪数据流 ...

  4. 『GoLang』反射

    方法和类型的反射 反射是应用程序检查其所拥有的结构,尤其是类型的一种能.每种语言的反射模型都不同,并且有些语言根本不支持反射.Go语言实现了反射,反射机制就是在运行时动态调用对象的方法和属性,即可从运 ...

  5. 解除你学习Python自动化测试框架的所有疑惑,开启学习直通车

    学习框架第一步 前言 很多同学学完Python基础后出现迷茫......有同感的小伙伴,点赞关注........ 学习完Python还要学习什么? 什么是自动化测试框架? 如何搭建自动化测试框架? 甚 ...

  6. Django整理(四) - URL配置

    1. URL配置 一.需求 1. 需求:在浏览器访问URL地址 http://127.0.0.1:8000/users/index 时,显示hello django信息 2. 实现 i. 需要编写一个 ...

  7. 10.7 URI

    URI:   Uniform Resource Identifier  统一资源标识符 URL:  Uniform Resource Locator    统一资源定位符 URN: Uniform R ...

  8. 从零入门 Serverless | 架构的演进

    作者 | 许晓斌 阿里云高级技术专家 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复 入门 ,即可获取 Serverless ...

  9. 『Mivik的萌新赛 & Chino的比赛 2020』T2 题解 Galgame

    如果这是我最后一篇题解,请每年为我上坟. Galgame 题目传送门 Decription as_lky 搞到了很多 Galgame(真的很多!).一款 Galgame 可以被描述为很多场景(Scen ...

  10. 题解 CF241E Flights

    题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的 \(\texttt{DAG}\) ,给每条边设定边权为 \(1\) 或者 \(2\) ,使得 \(1\to n\) 的每条路径长度 ...