磁盘空间引起ES集群shard unassigned的处理过程

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,同时随着集群的数据的增长,可以避免后面踩更大的坑。另外,集群的运营和监控也很重要。

文章可以转载, 但必须以超链接形式标明文章原始出处和作者信息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容