网站如何进行优化设计高端网站官网
集群故障模拟方案(二):磁盘空间满、重选主节点 
- 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
以上模拟可以帮助你了解集群的容错能力和恢复机制,为制定应急预案提供依据。
