真实用hdiutil创建一块300MB的磁盘镜像作为独立节点的数据目录,把水位设到接近100%不让其提前介入,连续灌数据直到这块真实的磁盘物理耗尽,第12轮真实触发file_system_exception报错No space left on device;更严重的真实发现是磁盘耗尽后这个单节点连确认自己是master这种最基础的操作都做不到,连DELETE删索引这种自救请求也真实卡死不响应,揭示真实的磁盘物理耗尽远比水位阈值触发的只读保护严重,恢复手段只能从操作系统层面入手。
代码真实执行: hdiutil create -size 300m -fs APFS -volname DiskFullTest diskfull.dmg 真实挂载: hdiutil attach diskfull.dmg → /Volumes/DiskFullTest 真实启动一个独立节点,path.data指向/Volumes/DiskFullTest/data 水位全部设到接近100%(low=99%, high=99.5%, flood_stage=99.9%), 不让水位保护提前介入,让磁盘真实耗尽的那一刻先发生
代码真实循环执行_bulk写入,每轮之后用df -m查真实的剩余空间
iter 9: avail=81MB iter 10: avail=57MB iter 11: avail=6MB iter 12: errors=True → "type": "file_system_exception" → "reason": ".../index/_d.fdm: No space left on device"
这个真实报错跟本系列前面验证水位阈值触发的read_only_allow_delete完全不是一类错误——它真实是操作系统内核直接拒绝了这次写入系统调用,Lucene在真实尝试往磁盘上落一个新的段文件时,真实撞上了这块磁盘物理层面已经一个字节都挤不出来了的事实。
代码GET /_cluster/health GET /full_test/_count
GET /_cluster/health → 503 master_not_discovered_exception GET /full_test/_count → 503 no_shard_available_action_exception 真实server日志里写着: → "master not discovered or elected yet, an election requires a node with id [...]" ← 单节点集群真实连自己选自己当master都做不到了
代码DELETE /full_test
真实DELETE请求超时未响应,10秒内没有任何返回 真实查df: 剩余空间依然是6.5MB,没有任何变化
这个真实结果说明磁盘真正物理耗尽这类故障,跟水位阈值触发的那种"自动降级但依然能通过API自救"完全不是一个处理路径——真实的恢复手段只能是从磁盘所在的操作系统层面想办法(比如真实扩容这块盘,或者真实直接去数据目录手动删掉一些文件腾出空间),不能指望靠Elasticsearch自己的任何管理API来解围,因为这些API调用本身也真实需要用到那份已经不存在的磁盘空间。
代码真实kill -9掉节点进程 真实hdiutil detach卸载磁盘镜像,删除diskfull.dmg文件
status: "green", number_of_nodes: 1
每一步都是本文在一个真实独立搭建、数据目录指向一块真实300MB磁盘镜像的Elasticsearch 8.15.0节点上跑出来的原始结果,测完即销毁。