商品重建索引报 cluster_block_exception,提示 index read-only / allow delete。OpenSearch 在磁盘达到 flood-stage 时自动保护节点;只解除只读标记而不解决磁盘空间,block 会很快再次出现。

固定复现条件

检查每个节点的磁盘、分片分布、集群健康和索引设置,确认实际 Magento 别名指向哪个版本化索引。

df -h
curl -s 'http://127.0.0.1:9200/_cluster/health?pretty'
curl -s 'http://127.0.0.1:9200/_cat/allocation?v'
curl -s 'http://127.0.0.1:9200/_cluster/settings?include_defaults=true&pretty'
curl -s 'http://127.0.0.1:9200/_all/_settings?filter_path=**.blocks.read_only_allow_delete&pretty'
php bin/magento indexer:status catalogsearch_fulltext

根据证据定位

单节点磁盘满可能让相关分片全部只读;删除文档不一定立即释放段文件空间。大量旧 Magento 索引、快照失败或日志与数据共享卷都可能占用空间。

修复与回滚

先扩容或安全删除确认不再使用的旧索引/日志,使磁盘低于恢复水位,再精确解除受影响索引的 read_only_allow_delete,并重建搜索索引。不要全局关闭磁盘阈值。

验收

集群恢复 green/yellow 的预期状态,Magento 全量与增量索引成功;观察下一个高峰和合并周期,磁盘水位与旧索引保留策略稳定。

生产环境操作前的检查

处理“Magento 2 OpenSearch 因磁盘水位变成只读”前,先记录 Magento 版本、部署模式、问题 Store View、复现时间和最近发布。所有 SQL 默认先执行 SELECT;写操作、目录清理、服务重启和配置切换必须确认范围、保留备份并准备回滚。多节点环境还要核对构建版本、app/etc/env.php 配置摘要和实际流量节点。

php bin/magento --version
php bin/magento deploy:mode:show
php bin/magento maintenance:status
php bin/magento indexer:status
php bin/magento cache:status

命令应由 Magento 文件所有者在项目根目录执行。不要在生产高峰同时运行全量索引、静态部署和数据修复;涉及客户、支付、税费、库存或订单的变更,应先在脱敏数据副本验证。

建立可比较的排查记录

每次实验只改变一个变量,记录操作前值、命令、开始与结束时间、结果和回滚方式。至少准备一个正常对象和一个异常对象;旧对象恢复而新对象仍能复现,说明根因尚未消除。

检查层证据通过标准
入口 URL、状态码、请求 ID、节点 路由与协议一致
应用 异常堆栈、模块、作用域 无新异常且可重复
数据 主键、时间、关联行数 关系完整无重复副作用
业务 正常、失败与重试路径 最终状态一致

修复后的观察窗口

上线后至少观察一轮 Cron、队列和索引周期,并在两台节点、无痕浏览器与目标 Store View 重复验证。临时调试日志必须脱敏,确认错误率、响应时间和数据量稳定后及时关闭。