【ELasticsearch】集群故障模拟方案(二):磁盘空间满、重选主节点

集群故障模拟方案》系列,共包含以下文章:

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

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):每次读写 1GB1G = 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 在磁盘空间不足时的行为)。

部分
说明
fallocateLinux 文件空间预分配工具,直接创建大文件(比 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

以上模拟可以帮助你了解集群的容错能力和恢复机制,为制定应急预案提供依据。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据与AI实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值