《集群故障模拟方案》系列,共包含以下文章:
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
集群故障模拟方案(二):磁盘空间满、重选主节点
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
以上模拟可以帮助你了解集群的容错能力和恢复机制,为制定应急预案提供依据。
186

被折叠的 条评论
为什么被折叠?



