Ошибка Elasticsearch: cluster_block_exception [FORBIDDEN / 12 / index-read-only / allow delete (api)], превышен водяной знак диска на этапе флуд

115

При попытке отправить документы в Elasticsearch в обычном режиме я получаю следующую ошибку:

cluster_block_exception [FORBIDDEN/12/index read-only / allow delete (api)];

Я также вижу это сообщение в журналах Elasticsearch:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only
Шон Хэммонд
источник
Я просто столкнулся с этой проблемой, когда вы задали этот вопрос. ES обсуждает поговорку, освобождая память
Abhijith S

Ответы:

225

Это происходит, когда Elasticsearch считает, что на диске мало места, поэтому он переходит в режим только для чтения.

По умолчанию решение Elasticsearch основывается на проценте свободного места на диске, поэтому на больших дисках это может произойти, даже если у вас много гигабайт свободного места.

Водяной знак этапа лавинной рассылки по умолчанию составляет 95%, поэтому на диске емкостью 1 ТБ вам понадобится не менее 50 ГБ свободного места, иначе Elasticsearch перейдет в режим только для чтения.

Документацию о водяном знаке стадии наводнения см. На https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html .

Правильное решение зависит от контекста - например, производственная среда или среда разработки.

Решение 1. Освободите место на диске

Эту проблему решит освобождение достаточного дискового пространства, чтобы было свободно более 5% диска. Elasticsearch не будет автоматически выходить из режима только для чтения, как только диск освободится, вам нужно будет сделать что-то вроде этого, чтобы разблокировать индексы:

$ curl -XPUT -H "Content-Type: application/json" https://[YOUR_ELASTICSEARCH_ENDPOINT]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Решение 2.Измените настройку водяного знака на этапе наводнения

Измените "cluster.routing.allocation.disk.watermark.flood_stage"настройку на что-нибудь другое. Он может быть установлен на более низкий процент или на абсолютное значение. Вот пример того, как изменить настройку из документации :

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}

Опять же, после этого вам придется использовать указанную выше команду curl, чтобы разблокировать индексы, но после этого они не должны снова переходить в режим только для чтения.

Шон Хэммонд
источник
8
Здравствуй. Но я получаю эту ошибку, даже если в моей системе достаточно свободного места. Есть ли другие причины, по которым можно сообщить об этой проблеме?
Санкальпа Тимилсина
У меня такая же проблема, хотя у меня доступно 82,43% диска. Я исправляю это с помощью команды curl, но через несколько дней получаю то же самое.
manu
@SankalpaTimilsina, вы получили ответ? У меня такая же проблема.
Малик Файк,
58

По умолчанию установленный Elasticsearch переходит в режим только для чтения, если у вас менее 5% свободного места на диске. Если вы видите похожие ошибки:

Elasticsearch :: Transport :: Transport :: Errors :: Forbidden: [403] {"error": {"root_cause": [{"type": "cluster_block_exception", "reason": "заблокировано: [FORBIDDEN / 12 / индекс только для чтения / разрешить удаление (api)]; "}]," тип ":" cluster_block_exception "," причина ":" заблокировано: [FORBIDDEN / 12 / index read-only / allow delete (api)]; " }, "status": 403}

Или в /usr/local/var/log/elasticsearch.log вы можете увидеть журналы, похожие на:

водяной знак на этапе наводнения [95%] превышен на [nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / nodes / 0] free: 15.3gb [4.1%], все индексы на этом узле будут отмечены как прочитанные -только

Затем вы можете исправить это, выполнив следующие команды:

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_cluster/settings -d '{ "transient": { "cluster.routing.allocation.disk.threshold_enabled": false } }'
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
Паям Ханиеджад
источник
26
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

ИЗ

https://techoverflow.net/2019/04/17/how-to-fix-elasticsearch-forbidden-12-index-read-only-allow-delete-api/

дзайбацу
источник
Я получаю сообщение {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [null] and no indices exist"от вашей команды, есть идеи?
Сирил Дюшон-Дорис,
1
Спасибо! На моем диске не хватало места. Даже после того, как я освободил место, проблема осталась. Эта команда решила мою проблему!
Фред
Это правильное решение для современных версий Elasticsearch. Однако это не сработало _all. Пришлось применить его к каждому индексу вручную.
Рубик
@rubik, не могли бы вы упомянуть, как вы "применяете его к каждому индексу вручную"? Я новичок в Elasticsearch и сталкиваюсь с той же проблемой, когда _all не работает.
ром
@rom Конечно. Просто замените _allна имя индекса и повторите запрос для каждого индекса.
Рубик