Elasticsearch FORBIDDEN/12 read-only: диагностика disk watermark и восстановление
Ошибка FORBIDDEN/12/index read-only / allow delete обычно появляется после достижения flood-stage watermark. Правильный порядок: проверить диск и allocation, освободить место, дождаться нормализации и только затем снять блок.
1. Проверяем файловую систему на data nodes
df -h
df -i
du -xhd1 /var/lib/elasticsearch | sort -hНе удаляйте файлы вручную из каталога data Elasticsearch.
2. Проверяем кластер через API
export ES='https://es.example.com:9200'
export API_KEY='CHANGE_ME'
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/_cluster/health?pretty"
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/_cat/nodes?v&h=name,ip,roles,disk.used_percent,disk.avail"
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/_cat/allocation?v"3. Смотрим текущие disk watermarks
curl -sS -H "Authorization: ApiKey $API_KEY" \
"$ES/_cluster/settings?include_defaults=true&flat_settings=true&pretty" | grep -i watermark4. Находим заблокированные индексы
curl -sS -H "Authorization: ApiKey $API_KEY" \
"$ES/_all/_settings/index.blocks.read_only_allow_delete?flat_settings=true&pretty"5. Проверяем причины неприсвоенных shard
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/_cat/shards?v&s=state"
curl -sS -X POST -H "Authorization: ApiKey $API_KEY" -H 'Content-Type: application/json' \
"$ES/_cluster/allocation/explain?pretty" -d '{}'6. Освобождаем место безопасно
Сначала определите самые крупные индексы:
curl -sS -H "Authorization: ApiKey $API_KEY" \
"$ES/_cat/indices?v&s=store.size:desc&h=health,status,index,pri,rep,docs.count,store.size"Перед удалением проверьте aliases, lifecycle и snapshot:
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/OLD_INDEX/_alias?pretty"
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/OLD_INDEX/_ilm/explain?pretty"
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/_cat/snapshots/backup-repo?v"Удаляйте только подтверждённо ненужный индекс:
curl -sS -X DELETE -H "Authorization: ApiKey $API_KEY" "$ES/OLD_INDEX"7. Проверяем, что диск вышел из flood-stage
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/_cat/allocation?v"
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/_cluster/health?wait_for_status=yellow&timeout=60s&pretty"8. Снимаем блок read_only_allow_delete
curl -sS -X PUT -H "Authorization: ApiKey $API_KEY" -H 'Content-Type: application/json' \
"$ES/_all/_settings" -d '{"index.blocks.read_only_allow_delete": null}'Для одного индекса вместо _all укажите его имя.
9. Проверяем запись
curl -sS -X POST -H "Authorization: ApiKey $API_KEY" -H 'Content-Type: application/json' \
"$ES/read-only-test/_doc" -d '{"@timestamp":"2026-08-02T06:30:00Z","message":"write test after recovery"}'
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/read-only-test/_search?pretty"10. Контролируем повторное появление блока
curl -sS -H "Authorization: ApiKey $API_KEY" \
"$ES/_all/_settings/index.blocks.read_only_allow_delete?flat_settings=true&pretty"
curl -sS -H "Authorization: ApiKey $API_KEY" "$ES/_cat/allocation?v"11. Rollback теста
curl -sS -X DELETE -H "Authorization: ApiKey $API_KEY" "$ES/read-only-test"Критерий успеха: data nodes находятся ниже flood-stage, allocation не блокируется диском, read-only setting отсутствует, тестовый документ записывается, а через несколько минут блок не появляется снова.