1、问题描述

早上醒来发现手机有很多ES状态为red的告警,集群就前几天加了几个每天有十多亿记录的业务,当时估算过磁盘容量,应该是没有问题的,但是现在集群状态突然变成red了,这就有点懵逼了。

2、查找问题原因

没办法,问题出来了,只好查找问题的原因了。

先看看集群的状态

curl -XGET 'http://unknow.com/_cat/health?v&pretty'

epoch      timestamp cluster            status node.total node.data shards  pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1504509540 15:19:00 xxx-es-cluster red xx xx xxxx xxxx 2 0 10 0 - 99.99%

从上可看出,集群状态为red,说明有primary shard丢失了,看后面显示有10个shards是unassign,看来问题就出在这里了。

再看看是哪些索引有问题

curl -XGET 'http://unknow.com/_cat/indices?v&pretty'
发现有几个索引的状态为red,明显是unassign shard导致的。

现在具体看看哪些shard是unassign

curl -XGET 'http://unknow.com/_cat/shards?v&pretty'
找到unassign的shard,再看unassign的原因,这个ES有个比较好的cluster allocation explain api,可以直接查看unassign的原因,通过该api查到:设备上没有空间

查看各结点的存储使用情况

现在只能看各结点的容量使用情况了,再来个api
curl -XGET 'http://unknow.com/_cat/allocation?v&pretty'
这个可以查看每个结点的磁盘使用情况,奇怪的是并没有结点的存储满了,最高的也使用不到70%。

至此,虽然shard unsigned的原因找到了,就是磁盘满导致的,但是深层次的原因还没有找到。

 
Paste_Image.png

3、处理方案

既然原因找到了,那就先恢复吧,恢复很简单,可以参考ES提供的reroute api
因为这里主要是primary shard unassigned,恢复的命令如下:

curl -XPOST 'http://unknow.com/_cluster/reroute?retry_failed=5&pretty' -d '
{
"commands" : [ {
"allocate_stale_primary" : {
"index" : "myindex",
"shard" :0,
"node" : "node-ip",
"accept_data_loss" : true
}
}]
}'

注意:这里用的是allocate_stale_primary,官网描述如下:

Allocate a primary shard to a node that holds a stale copy. Accepts the index and shard for index name and shard number, and node to allocate the shard to. Using this command may lead to data loss for the provided shard id. If a node which has the good copy of the data rejoins the cluster later on, that data will be overwritten with the data of the stale copy that was forcefully allocated with this command. To ensure that these implications are well-understood, this command requires the special field accept_data_loss to be explicitly set to true for it to work.

4、深层原因

问题是解决了,集群状态也恢复成green了,但是最终原因还是没有找到,说不定明天又会收到一堆告警了

先看看ES的日志

跑到master结点上看了下日志,分别看到这种日志

[2017-09-03T02:52:58,609][WARN ][o.e.c.r.a.d.DiskThresholdDecider] [master-node] after allocating, node [szTykZvTTQ-8gskQMAK4UQ] would have more than the allowed 10% free disk threshold (4.7% free), preventing allocation

[2017-09-03T02:53:28,732][WARN ][o.e.c.r.a.DiskThresholdMonitor] [master-node] high disk watermark [90%] exceeded on [szTykZvTTQ-8gskQMAK4UQ][data-node][/data4/search/data/nodes/0] free: 0b[0%], shards will be relocated away from this node

[2017-09-03T02:54:58,659][WARN ][o.e.c.a.s.ShardStateAction] [master-node] [myindex][0] received shard failed for shard id [[myindex][0]], allocation id [xff7GrobTBuf6w3XplxR7Q], primary term [0], message [shard failure, reason [merge failed]], failure [NotSerializableExceptionWrapper[merge_exception: java.io.IOException: 设备上没有空间]; nested: IOException[设备上没有空间];

从上可以很清楚的看出,索引的shard做merge的时候,磁盘没有空间了,导致merge failed,最终导致shard failure,表现就是 shard unssigned

为啥会磁盘满?

按理说ES集群会自动做均衡的,不应该会出现某个盘满的情况,关于ES集群的Cluster Level Shard AllocationDisk-Based Shard Allocation,大家可以自己看一下。
虽然ES集群有这些balance和rebalance的策略,但是都是基于shard的,shard是ES最基本单位,一个shard只能分配到一个磁盘上,那是不是shard的大小不均造成的呢?通过查看集群shard的api可以看到每个shard的存储大小:
curl -XGET 'http://unknow.com/_cat/allocation?v&pretty'
对结果进行排序后发现,还真的有一些索引的shard会很大,最大的已经达到了100多G,我的天啊,怎么会变这么大,之前都差不多只有10G,后面查看业务的数据量,原来是业务增长导致的。
这个其实还不至于使磁盘满,因为我当天的索引为了加快索引速度,都是设置的0副本,在第二天凌晨的时候会把它设置成1副本,由于结点的每个盘还不到300G(坑爹的机器配置),集群在复制那种100多G的分片的时候很容易就导致某个磁盘满了。

5、最终解决

增加shard数

道理很简单,增加shard后,使每个shard的大小减少到10G左右,由于ES集群是基于shard来进行balance和rebalance的,且shard不能再分,因此减小shard的大小可以减小磁盘满的概率。

先把大的分片移到剩余空间大的结点,再增加副本数

如果集群总的剩余空间很足,只是极个别的盘满了,可以把大的shard迁移到磁盘大、剩余空间多的结点上,这样来规避磁盘满的风险。

6、总结

通过这一折腾,了解了shard的allocation,同时随着集群的数据的增长,可以避免后面踩更大的坑。另外,集群的运营和监控也很重要。

磁盘空间引起ES集群shard unassigned的处理过程的更多相关文章

  1. Elasticsearch 节点磁盘使用率过高,导致ES集群索引无副本

    目录 一.问题 二.问题的原因 三.问题解决的办法 1. 扩大磁盘 2. 删除部分历史索引 3. 更改es设置 四.扩展 一.问题 最近在查看线上的 es,发现最近2天的索引没有副本,集群的状态也是为 ...

  2. ES集群

    1. ElasticSerach集群安装  修改配置文件elasticserach.yml [elk@localhost config]$ vi elasticsearch.yml # ------- ...

  3. ES 集群上,业务单点如何优化升级?

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! ES 基础 ES 集群 ES 集群上业务优化 一.ES 基础 ...

  4. 本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效)

    本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效) 随着业务量的增加,本地的ES集群服务器性能和磁盘空间有点不够使用,项目组考虑使用腾讯云服务器,以下是我测试的使用_reindex ...

  5. 教你在Kubernetes中快速部署ES集群

    摘要:ES集群是进行大数据存储和分析,快速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中快速部署ES集群的样例:对ES集群的监控运维工具进行了介绍,并提供了部分问题定位经验,最 ...

  6. es集群数据库~运维相关

    一 数据同步方案  1 ES-JDBC  不能实现删除同步操作.MYSQL如果删除,ES不会删除  2 logstash-input-jdbc  能实现insert update,但是仍然不能实现删除 ...

  7. elasticsearch系列八:ES 集群管理(集群规划、集群搭建、集群管理)

    一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...

  8. elasticsearch(es) 集群恢复触发配置(Local Gateway参数)

    elasticsearch(es) 集群恢复触发配置(Local Gateway) 当你集群重启时,几个配置项影响你的分片恢复的表现. 首先,我们需要明白如果什么也没配置将会发生什么. 想象一下假设你 ...

  9. Elasticsearch-6.7.0系列(二)ES集群安装与验证

    准备3台centos7机器/虚拟机,每台都安装上elasticsearch6.7.0 ,安装过程参考我的另一篇博客<Elasticsearch-6.7.0系列(一)9200端口 .tar.gz版 ...

随机推荐

  1. 基于通用二进制方式安装MySQL-5.7.24(比源码安装MySQL快许多)及破密码

    确保系统中有依赖的libaio软件 yum -y install libaio 使用wget命令下载mysql-5.7.24软件包 wget http://mirrors.sohu.com/mysql ...

  2. December 21st, Week 51st Saturday, 2019

    May the odds be ever in your favor. 愿好运永远眷顾你. From The Hunger Games. May we all have good luck, and ...

  3. Linux下给mysql创建用户并分配权限

    // fe_group 用户名// fe 数据库名// 123456 密码 1.新建用户 //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> ...

  4. 怎么修改Anaconda 中 jupyter notebook 文件的保存位置

    安装完 anaconda ,在jupyter notebook 中创建的文件的默认保存位置为C:\User\电脑名 修改保存位置 1.打开 anaconda prompt 2.输入 jupyter n ...

  5. python爬虫(二) urlparse和urlsplit函数

    urlparse和urlsplit函数: urlparse: url='http://www.baidu.com/s?wd=python&username=abc#1' result=pars ...

  6. [转]Java——Servlet的配置和测试

    本文转自:http://blog.csdn.net/makefish/article/details/6904807 本文以一个实例介绍如何用Java开发Servlet. 主要内容有: 配置和验证To ...

  7. 使用taglib指令在jsp页面导入要使用的jstl标签库

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  8. UniGUI之ServerModule常用设置(07)

    主要有两个设置,它是一个单独的, 这意味着它只在每个应用程序中创建一次. 它主要用于配置各种服务器设置.不能将组件放在ServerModule上. 如前所述, ServerModule 是一个单一的, ...

  9. 01 MATLAB基本概念

    基本概念 整数类型 相同整数类型相乘还是整数 整数与浮点数相乘是这种整数类型 不同整数类型不能相乘,除非强制类型转换 整数与整数相乘: >> x = uint32(120); >&g ...

  10. 你知道HTTP协议的ETag是干什么的吗?

    前言 在HTTP1.1规范中,新增了一个HTTP头信息:ETag.对于普通开发者来说,可能平时真的不会接触到该HTTP头.平时接触不到或者说用得少,不代表这个请求头不重要.ETag使用得当,是可以减少 ...