【ELasticsearch】集群故障模拟方案(二):磁盘空间满、重选主节点
集群故障模拟方案(二):磁盘空间满、重选主节点
- 1.磁盘空间满模拟
- 1.1 方案描述
- 1.2 操作步骤
- 1.3 命令说明
- 1.3.1 dd if=/dev/zero of=...
- 1.3.2 fallocate
- 1.3.3 对比
- 2.主节点选举问题模拟
- 2.1 方案描述
- 2.2 操作步骤
- 3.安全注意事项
- 4.监控与验证
1.磁盘空间满模拟
1.1 方案描述
模拟节点磁盘空间耗尽的情况。
1.2 操作步骤
- 识别数据目录
- 检查
elasticsearch.yml
配置文件中的path.data
设置。 - 也可通过
GET _nodes/stats/fs?pretty
命令查询。
- 检查
- 填充磁盘空间
# 创建一个占满磁盘的大文件 dd if=/dev/zero of=/path/to/es_data/fill_disk bs=1G count=100# 或者使用fallocate快速创建 fallocate -l 10G /path/to/es_data/fill_disk
🚀 注意:
fill_disk
是一个文件名。 - 观察集群反应
# 观察集群状态(分片可能变为 UNASSIGNED) curl -XGET 'http://localhost:9200/_cluster/allocation/explain?pretty' curl -XGET 'http://localhost:9200/_cat/allocation?v'
- 清理磁盘空间
rm /path/to/es_data/fill_disk
1.3 命令说明
1.3.1 dd if=/dev/zero of=…
dd if=/dev/zero of=/path/to/es_data/fill_disk bs=1G count=100
这条命令使用 dd
创建一个 100GB 的大文件,用于快速占满磁盘空间,模拟 Elasticsearch 节点磁盘耗尽的情况。
部分 | |
---|---|
dd | 数据复制工具,用于按块读写文件或设备 |
if=/dev/zero | 输入文件(Input File ):从 /dev/zero (Linux 零设备)读取数据(全零字节) |
of=/path/to/es_data/fill_disk | 输出文件(Output File ):写入到指定路径(通常选 Elasticsearch 数据目录) |
bs=1G | 块大小(Block Size ):每次读写 1GB(1G = 1 Gigabyte) |
count=100 | 块数量:总共写入 100 块(100 × 1GB = 100GB) |
- 生成一个 100GB 的
fill_disk
文件,内容全为零(/dev/zero
提供无限零字节流)。 - 快速消耗磁盘空间,模拟 Elasticsearch 节点因磁盘满而无法写入的情况。
1.3.2 fallocate
fallocate -l 10G /path/to/es_data/fill_disk
这条命令同样用于快速分配磁盘空间,模拟磁盘被占满的场景(如测试 Elasticsearch 在磁盘空间不足时的行为)。
部分 | |
---|---|
fallocate | Linux 文件空间预分配工具,直接创建大文件(比 dd 更快) |
-l 10G | 指定文件大小为 10GB(10G = 10 Gigabytes) |
/path/to/es_data/fill_disk | 文件生成路径(通常选择 Elasticsearch 的数据目录) |
- 立即占用 10GB 磁盘空间,生成一个名为
fill_disk
的空文件。 - 相比
dd if=/dev/zero of=...
,fallocate
不实际写入数据,而是直接修改文件系统元数据,因此速度极快(即使分配 1TB 也只需几秒)。
关键参数
参数 | |
---|---|
-l (--length ) | 指定文件大小(支持单位:K / M / G / T ,如 1K =1KB,2M =2MB) |
-o (--offset ) | 可选,从文件指定偏移量开始分配(默认从 0 开始) |
1.3.3 对比
以上方法适用于测试:
- Elasticsearch 的 磁盘水位检测(如
cluster.routing.allocation.disk.watermark
)。 - 分片是否会自动迁移(当磁盘空间不足时)。
- 集群是否进入
read-only
模式(防止数据丢失)。
方法 | 速度 | 是否实际写数据 | 适用场景 |
---|---|---|---|
fallocate | ⚡️ 极快 | ❌ 只修改元数据 | 快速测试磁盘空间不足 |
dd if=/dev/zero | 🐢 慢(需写全零) | ✅ 是 | 需要真实占用磁盘 I/O 的场景 |
truncate -s 10G | ⚡️ 快 | ❌ 稀疏文件(不占实际空间) | 仅需逻辑大文件时 |
注意事项
- 需要 root 权限(如果目标目录权限受限)。
- 确保路径正确,避免误填其他关键目录。
- Elasticsearch 默认磁盘水位阈值:
- 低水位(
low
):85%85\%85% 占用时停止分配新分片。 - 高水位(
high
):90%90\%90% 占用时尝试迁移分片。 - 强制只读(
flood_stage
):95%95\%95% 占用时设为只读模式。
- 低水位(
2.主节点选举问题模拟
2.1 方案描述
模拟主节点不可用时的选举过程。
2.2 操作步骤
- 识别当前主节点
curl -XGET 'http://localhost:9200/_cat/nodes?v&h=name,node.role,master'
- 停止主节点
systemctl stop elasticsearch
- 观察选举过程
watch -n 1 curl -s 'http://localhost:9200/_cat/master?v'
- 恢复原主节点
systemctl start elasticsearch
3.安全注意事项
- 在生产环境谨慎操作,建议先在测试环境验证。
- 确保有备份,避免数据丢失。
- 监控集群状态,准备好快速恢复方案。
- 避免在业务高峰期 进行故障模拟。
4.监控与验证
在执行故障模拟时,建议同时监控以下指标:
- 集群健康状态:
/_cluster/health
- 节点状态:
/_cat/nodes
- 分片分配情况:
/_cat/shards
- 未分配分片解释:
/_cluster/allocation/explain
以上模拟可以帮助你了解集群的容错能力和恢复机制,为制定应急预案提供依据。