「重点解密」谁再问elasticsearch集群Red怎么办?把这篇笔记给他

 admin   2022-08-22 06:32   117 人阅读  0 条评论

简介
应该你经验过这些Red.
呢。呢。等等
那ES的Red是神么意义吗?
这里说的red,是指es集群的状态,总共有三种,green.red.yellow呢。详细含意
镇静剖析
从上图可知,集群red是由于有主分片不行用,这类情形一样平常为由于节点宕机呢。


有什么影响吗?
最少一位主分片(和他的所有正本)都在缺失中呢。这记号着你在缺一点点据寻找只能返回部-分数据,而分配到这个分片上的写入乞求会返回一位十分呢。
这个时候咋们能够推行相关的下令举行状态搜查呢。
集群节点是否都存在.检察集群状态呢。
curl -uelastic:pwd -XGET "http://ip:9200/_cluster/health?pretty"


active_shards 是涵盖了一切索引的一切分片的汇总值,这个内里包罗正分内片呢。
relocating_shards 展现现在现在从一位节点迁往其余节点的分片的数目呢。平时来说应该是 0,可是在 Elasticsearch 觉察集群不太平衡时,该值会上升呢。好比说增添了一位新节点,或者者下线了一位节点呢。
initializing_shards 展现的是刚刚建立的分片的个数呢。好比,当你刚建立第一位索引,分片都市暂时的处于 initializing 状态,分片不该该长时刻停留在 initializing 状态呢。你还应该在节点刚重启的时刻看到 initializing 分片当分片从磁盘上加载后,你们会从 initializing 状态最先呢。因此这一样平常为暂时状态呢。
unassigned_shards 是以前在集群状态中存在的分片,可是现实在集群里又找不着呢。常罕见的到的体现在正本上呢。好比,我有两个es节点,索引设置分片数目为 10, 3 正本,那么在集群上,由于灾备准则,主分片和其对应正本不行以同时在一位节点上,es无法找出其余节点来寄存第三个正本的分片,因此就会有 10 个未分配正分内片呢。如果你的集群是 red 状态,也会长时刻保有未分配分片(由于缺少主分片)呢。


unassigned_shards本因1


上面说了一种组成 unassigned_shards的本因,即是正本过多,节点太少,es无法完结分片呢。
闻一知十!由于索引的正本是能够消息修正的,那么,如果在修正时光配的正本数大于节点数目,那么一定会有分片是这个状态呢。
这类情形的处置办法有两种 1.是消息调治一下正本数目呢。 2.新参与一位节点来平衡呢。
unassigned另有其余本因吗?
现在集群爆红,可是一切节点都还在,有点诡异,从集群状态看,总共是两个分片有疑,一位现在初始化,一位是unassigned呢。一定了缺点范围后,咋们再来从索引层面.分片层面深入的剖析详细本因把呢。


索引层面剖析
再推行
curl -uelastic:pwd -XGET "http://ip:9200/_cluster/health?pretty&level=indices"
没错,仍然这个api,可是值得注重的是level=indices,想必读者以前心发神会呢。这个api返回的是一位样式化后的json,如果对比长,引荐输入到一位文本内里看呢。
从返回的信息中,咋们能够看到,01-04索引现在状态为red,他有两个分片,0个正本,有一位分片现在初始化,从这个数据能够看出,受影响的是主分片,想到这里,感觉饥不择食呢。


分片层面剖析
少侠,莫慌!
知道了索引层面的缺点信息,咋们连续追究,看看分片层面呢。
curl -uelastic:pwd -XGET "http://ip:9200/_cluster/health?level=shards"
固然,重点仍然level=shards,展现以下
至此,咋们能够获得更多的线索
索引名xxx-01-04呢。
分片数目2呢。
正本数0呢。
有疑的分片号0呢。而且是主分片呢。
分片状态initializing呢。声明现在初始化,自我恢复中呢。
既然是在恢复,那找恢复相关的api,看看呢。
curl -u elastic:pwd -XGET http://ip:9200/索引名/_recovery?pretty=true
从上图能够看到,破费了14.1个小时,从translog中恢复!目前进度十分堪忧呢。合-作kibana看一下
插播一下,translog的学


咋们把数据写到磁盘后,还要挪用fsync才气把数据刷到磁盘中,如果不这样做在体制掉电的时刻就会致使数据丢弃,这个理由信赖我们都清晰,elasticsearch为了高牢靠性必须把一切的修正恒久化到磁盘中呢。
咋们的数据先写入到buffer内里,在buffer内里的数据时寻找不到的,同时将数据写入到translog日志文件之中呢。如果buffer快满了,或者是一段时刻之后,就会将buffer数据refresh到一位新的OS cache之中呢。
translog的功效在推行commit以前,一切的而数据全是停留在buffer或者OS cache之中,岂论buffer或者OS cache全是内存,
一旦这台机械死了,内存的数据就会丢弃,因此需要将数据对应的操做写入一位专程的日志文件之中呢。
一旦机械出-现宕机,再次重启的时刻,es会努力的读取translog之中的日志文件数据,恢复到内存buffer和OS cache之中呢。
所有commit历程就叫做一位flush操做
一开始translog的数据也是先写入到OS cache之中的,默许每一隔5秒之中将数据更改到硬盘中去,也即是说,
应该有5秒的数据仅仅停留在buffer或者者translog文件的OS cache中,假这样机遇器挂了,
会丢弃5秒的数据,可是这样的功效对比好,咋们也能够或者者将每一次的操做都必须是直-接fsync到磁盘,可是功效会对比差呢。
上述摘录于网络,写得清晰,能够遵照一下,剖析看了日志也有无找出其余有用的信息,由因而史书索引,就将其删撤消了,只管有无定位到基本本因,可是纪录一下排查历程总是好的呢。
剩下的unassigned分片


处置了一位疑,那么还剩下一位分片是未分配的,仍然从索引层面和分片层面盘搜查,觉察也是0号主分片出疑呢。
尝试手动分配
curl -uelastic:pwd -XPOST 'mands" : [ } ] }'
报错
No data for shard [0] of index [B_2020-01-05] found on node [SL8u8zKESy6rSHjHO0jEvA]"},"status":400}


尝试手动分配失利后,替换思绪呢。挣脱掉种种繁杂的盘API,运用es为咋们供应的一位Explain API,他会诠释为什么分片有无分配,处置疑以前,先诊断诊断呢。
curl -uelastic:pwd -XGET "http://ip:9200/_cluster/allocation/explain" -H"Content-Type:application/json" -d ''
看上述过错,分片被锁住了,尝试分配,可是被谢绝,手动分配时,能够指定"acceptdataloss" : true呢。但这样会致使数据一切丢弃呢。
这类情形一样平常出-现在有结点暂时离开集群,然后马上重新参与,而且有线程现在对某个shard做bulk或者者scroll等长时刻的写入操做呢。等结点重新参与集群的时刻,由于shard lock有无张开,master无法allocate这个shard呢。 平时/cluster/reroute?retryfailed=true能够处置疑,如果根据你说的依然无法处置,应该另有其余本因致使锁住该shard的线程长时刻操做该shard无法张开锁(长时刻GC?)呢。
如果retryfailed无法处置疑,能够尝试一下allocatestale_primary,条件是需要知道这个shard的primary在哪一位结点上呢。着实处置不了,又不愿丢数据,还能够重启一下该结点,内存锁应该能够张开呢。
推行集群reroute下令
curl -XPOST "http://ip:9200/_cluster/reroute?retry_failed=true"


再看分片状态
这个时候集群以前恢复Green呢。马到成-功呢。
总结
一.遇到集群Red时,咋们能够从以下办法排查
集群层面/_cluster/health呢。
索引层面/_cluster/health?pretty&level=indices呢。
分片层面/_cluster/health?pretty&level=shards呢。
看恢复情形/_recovery?pretty呢。
两.有unassigned分片的排查思绪
_cluster/allocation/explain,先诊断呢。
/_cluster/reroute尝试重新分配呢。
三.数据重放
如果着实恢复不了,那只能索引重修了呢。供应一种思绪
先新建备份索引
curl -XPUT ‘http://xxxx:9200/a_index_copy/‘ -d ‘ }}
通过reindex,将现在可用的数据导入POST _reindex,"dest": }
删除a_index索引,这个必须要先做,否则小名无法增添.curl -XDELETE 'http://xxxx:9200/a_index'
建立aindexcopy索引
curl -XPUT ‘http://xxxx:9200/a_index_copy/‘ -d ‘ }}
通过reindex api将aindex数据copy到aindex_copy呢。
POST _reindex, "dest": }
删除a_index索引,这个必须要先做,否则小名无法增添
curl -XDELETE 'http://xxxx:9200/a_index'
给aindexcopy增添小名a_index
curl -XPOST 'http://xxxx:9200/_aliases' -d '} ]}'
四.translog总结
translog在节点有疑时,能够或者者帮-助阻挠数据的丢弃
计划目的
1.帮-助节点从失利从迅速恢复呢。
2.辅佐flush呢。防止在flush历程中数据丢弃呢。
以上即是这篇笔-记的一切内容,希望能帮-助到你呢。
迎接来公zhong号【侠梦的开拓笔-记】 一块调换提高


本文地址:http://51ac.top/post/4478.html
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?