作者:SUNNY
时间:2018-06-04
故障背景:
集群的数据节点中有3台机器(下文用“新节点”代替)的数据盘容量较小(2T左右),并且是最新加入集群的。在某个时候,这三台机器的磁盘容量达到了disk.watermark.high的限制,之后节点启动分片迁移机制向其他节点分派分片,由于迁移的速率小于索引更新的速率,致使节点disk.usable.percent接近0。
故障模式:
分片分配控制器和决策器会将新建索引的分片优先分配给新节点。所以新节点有较大概率会持续的被分配到新建索引的分片,导致新节点的磁盘会持续增加。
当某一个新节点的磁盘容量达到high.watermark.high后,此节点启动分片迁移,迁移的目标节点中又会包括其他新节点(由于集群的平衡策略中要求所有数据节点的分片保持一致,分片分配控制器和决策器又将其他新节点作为优先考虑的目标节点)。
集群平衡有并发的分片限制数(默认是多少?),导致了——>迁移分片的速率小于索引更新的速率,磁盘disk.usable.percent持续减小
新节点启动分片迁移后,自身的分片数较低,导致了分片分配控制器和决策器又将新建索引的分片优先指向此节点。
以上共同导致了磁盘告警在新节点上交替连续出现:告警—恢复—告警—恢复
根本原因:
数据盘容量低于其他数据节点
集群分片平衡策略是以节点分片数作为默认的优先策略
影响分析:
磁盘disk.usable.percent=0,导致节点拒绝索引写入请求——影响索引bulk功能
节点启用分片迁移,导致集群出现pending_tasks,当pend_tasks的任务等级>=HIGH,集群功能受限(无法新建索引)——影响到了新建索引功能
解决方法:
1)不下线节点:更新集群分片分配器
详细方法:
2)下线节点
参照平滑下线方法—data-node节点下线操作:http://www.yunxiaobai.net/archives/1237
3)如何杜绝此类问题
参考资料:
Disk-based shard Allocation https://www.elastic.co/guide/en/elasticsearch/reference/5.6/disk-allocator.html
扩展:
问题1:ES对于各个节点的磁盘使用控制通过哪些参数来设置?
"cluster.routing.allocation.disk.threshold_enabled": true 注1
"cluster.routing.allocation.disk.watermark.low" : "85%" 注2
"cluster.routing.allocation.disk.watermark.higt" : "90%" 注3
注1: 启用分片分配的决策器--DiskThresholdDecider,默认为true
注2: 节点磁盘超过这个量则停止向这个节点分配分片 ,默认为 85%
注3: 节点磁盘超过这个量开始迁移分片 ,默认为90%
问题2:节点的这个磁盘控制是指哪个磁盘?
指的是数据路径的所挂载的磁盘。当有多个数据路径时,节点监控的是最小和最大的盘的watermark。
问题3:当节点的磁盘达到high.watermark时,会有多少个分片会被迁移?是通过控制分片数还是磁盘大小?
通过观察监控,当磁盘可用容量为30%左右时,不再迁移分片
问题4:对于正在不断更新的索引主分片,当节点要对此分片进行迁移时,数据会不会丢失?