Ошибка Elasticsearch: cluster_block_exception [FORBIDDEN/12/index только для чтения/разрешить удаление (api)], уровень водяного знака наводнения превышен

При попытке отправить документы в 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

Ответ 1

Это происходит, когда 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 выше, чтобы разблокировать индексы, но после этого они не должны переходить в режим только для чтения.

Ответ 2

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

Elasticsearch::Transport::Transport::Errors::Forbidden: [403] {"error":{"root_cause":[{"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only/allow delete (api)];"}],"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only/allow delete (api)];"},"status":403}

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

Водяной знак на этапе затопления диска [95%] превышен на [NCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/USR/локальные /VAR/Library/elasticsearch/узлы/0] бесплатно: 15,3 ГБ [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}'