磁盘警戒水位线机制
Elasticsearch 需要处理大量数据,因此磁盘空间管理非常重要。要避免磁盘空间耗尽导致集群崩溃,同时磁盘高读写可能导致系统性能问题。此外,访问磁盘是一个 “低效” 的过过程。总之,应尽可能减少磁盘 IO。
1.查看节点磁盘使用量
在 Elasticsearch 中查看节点磁盘使用量的命令主要有以下几种方式。
1.1 查看所有节点磁盘概览(简洁版)
GET _cat/nodes?v&h=name,disk.total,disk.used,disk.avail,disk.used_percent
输出示例:
disk.total
:节点磁盘总容量。disk.used
:已用磁盘空间。disk.avail
:剩余可用空间。disk.used_percent
:磁盘使用百分比(关键监控指标)。
1.2 查看详细磁盘信息(含分片分布)
GET _cat/allocation?v
输出示例:
新增关键字段:
disk.indices
:Elasticsearch 索引实际占用的磁盘空间(可能小于disk.used
,因包含系统文件)。shards
:该节点承载的分片数。
1.3 查看单个索引的磁盘占用
GET _cat/indices?v&h=index,store.size,pri.store.size
store.size
:索引主分片+副本分片总大小。pri.store.size
:仅主分片大小。
1.4 高级监控(JSON 格式详细数据)
GET _nodes/stats/fs
返回关键数据:
total_in_bytes
:磁盘总容量(字节)。free_in_bytes
:剩余空间。available_in_bytes
:可用空间(考虑系统预留)。
1.5 关键告警建议
- 警戒阈值:
- 磁盘使用 ≥ 85 % ≥ 85\% ≥85%:触发清理或扩容。
- 磁盘使用
≥
90
%
≥ 90\%
≥90%:Elasticsearch 会自动阻止写入(可通过
cluster.routing.allocation.disk.watermark
调整)。
- 常见处理措施:
- 删除旧索引:
DELETE /old_index-*
- 强制段合并:
POST /index/_forcemerge?max_num_segments=1
- 扩容磁盘或增加节点。
- 删除旧索引:
通过以上命令可以全面掌握集群磁盘使用情况,建议定期监控并结合告警系统使用。
2.磁盘警戒水位线机制
磁盘警戒水位线(Disk Watermark
)是 Elasticsearch 用于防止节点 因磁盘空间不足导致故障 的重要保护机制,它会根据磁盘使用情况自动控制分片分配行为。
2.1 水位线机制的核心原理
当节点磁盘使用量达到特定阈值时,Elasticsearch 会自动触发以下保护措施:
- 1️⃣ 停止向该节点分配新分片。
- 2️⃣ 可能将现有分片迁移到其他节点。
- 3️⃣ 极端情况下会阻止写入操作。
2.2 水位线的三种类型
2.2.1 低水位线(Low Watermark)
- 作用:早期预警,开始调整分片分配。
- 默认值: 85 % 85\% 85%
- 触发行为:
- 停止向该节点分配新的分片。
- 但不会主动迁移已存在的分片。
- 配置示例:
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.disk.watermark.low": "85%" } }
2.2.2 高水位线(High Watermark)
- 作用:紧急处理,主动迁移分片。
- 默认值: 90 % 90\% 90%
- 触发行为:
- 开始将该节点上的分片迁移到其他节点。
- 优先迁移最近最少使用的分片。
- 配置示例:
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.disk.watermark.high": "90%" } }
2.2.3 洪水水位线(Flood Stage Watermark)
- 作用:最后防线,保护节点不崩溃。
- 默认值: 95 % 95\% 95%
- 触发行为:
- 强制将所有索引设为只读(
read_only_allow_delete
)。 - 阻止新建索引和文档写入。
- 日志中会出现
blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]
错误。
- 强制将所有索引设为只读(
- 配置示例:
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.disk.watermark.flood_stage": "95%" } }
2.3 实际应用场景示例
案例1:预防性维护
// 在数据量大的集群中设置更保守的水位线
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "75%",
"cluster.routing.allocation.disk.watermark.high": "85%",
"cluster.routing.allocation.disk.watermark.flood_stage": "90%"
}
}
案例2:紧急恢复磁盘空间
当节点达到洪水水位线时:
# 1. 先删除部分数据释放空间
DELETE /old_logs-2023-*
# 2. 手动解除只读状态
PUT _all/_settings
{
"index.blocks.read_only_allow_delete": null
}
2.4 水位线配置注意事项
- 单位灵活性:
- 百分比: 85 % 85\% 85%
- 绝对大小: 500 500 500 GB
- 动态生效:修改后无需重启集群,设置会立即生效。
- 监控建议:
# 查看节点磁盘使用情况 GET _cat/nodes?v&h=name,disk.used_percent,disk.avail,disk.total # 检查是否有索引被阻塞 GET _all/_settings?include_defaults&filter_path=*.blocks.read_only*
- 特殊场景处理:
- 对于冷数据节点,可以适当调高水位线。
- 对于热数据节点,建议设置更保守的值。
通过合理配置磁盘水位线,可以有效预防因磁盘空间不足导致的集群故障,是 Elasticsearch 运维中至关重要的保护机制。