Elasticsearch数据节点空间使用控制

作者: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:对于正在不断更新的索引主分片,当节点要对此分片进行迁移时,数据会不会丢失?

Elasticsearch 中,可以通过清理索引空间来释放磁盘空间。以下是清理 ES 节点索引空间的步骤: 1. 找到要清理的索引或索引别名。 2. 确定哪些段已经被删除或合并,并可以释放空间。 3. 关闭写入,以确保没有新的段被创建。 4. 执行清理操作,这会删除已经被标记为删除的段,并合并其他段。 5. 重新打开写入,以便索引可以继续使用。 下面是执行清理操作的具体步骤: 1. 打开 Elasticsearch 的命令行界面。 2. 执行以下命令,以查看当前节点的索引情况: ``` GET /_cat/indices?v ``` 这将列出当前节点上的所有索引及其状态。 3. 执行以下命令,以查看特定索引的段情况: ``` GET /<index_name>/_segments ``` 这将列出特定索引的所有段及其状态。 4. 执行以下命令,以关闭写入: ``` PUT /<index_name>/_settings { "index.blocks.write": true } ``` 这将禁止该索引的写入操作。 5. 执行以下命令,以执行清理操作: ``` POST /<index_name>/_forcemerge?max_num_segments=1 ``` 这将强制合并索引的所有段,并删除已经被标记为删除的段,从而释放磁盘空间。 6. 执行以下命令,以重新打开写入: ``` PUT /<index_name>/_settings { "index.blocks.write": false } ``` 这将允许该索引的写入操作。 注意:清理操作可能会导致一些性能问题,因此需要谨慎使用。最好在低负载时执行清理操作,并在操作前备份索引数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值