ITLinuxАдминистрирование

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 watermark

4. Находим заблокированные индексы

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 отсутствует, тестовый документ записывается, а через несколько минут блок не появляется снова.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *