Помилка Elasticsearch: cluster_block_exception [FORBIDDEN / 12 / індекс лише для читання / дозволити видалити (api)], водяний знак диска на стадії затоплення перевищено


107

При спробі опублікувати документи в 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

Відповіді:


215

Це трапляється, коли 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
Привіт. Але я отримую цю помилку, навіть коли в моїй системі є достатньо вільного місця. Чи є інші причини, які можуть повідомити про це?
Sankalpa Timilsina

У мене така ж проблема, хоча у мене є 82,43% диск. Я виправляю це командою curl, але через кілька днів я отримую те саме.
Мана

@SankalpaTimilsina Ви отримали відповідь, я зіткнувся з тим же питанням.
Malik Faiq

52

За замовчуванням встановлений Elasticsearch переходить у режим лише для читання, коли у вас менше 5% вільного місця на диску. Якщо ви бачите помилки, подібні до цієї:

Elasticsearch :: Транспорт :: Транспорт :: Помилки :: Заборонено: [403] {"помилка": {"root_ why": [{"тип": "cluster_block_exception", "причина": "заблоковано: [FORBIDDEN / 12 / індекс лише для читання / дозволу delete (api)]; "}]," type ":" cluster_block_exception "," причина ":" заблоковано: [FORBIDDEN / 12 / індекс лише для читання / дозволити delete (api)]; " }, "статус": 403}

Або в /usr/local/var/log/elasticsearch.log ви можете побачити журнали, схожі на:

Дисковий водяний знак на стадії затоплення [95%] перевищено на [nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / nodes / 0] безкоштовно: 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}'

23
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

@rubik чи можете ви зазначити, як ви "застосовуєте його до кожного індексу вручну"? Я новачок у Elasticsearch і зіткнувся з тією ж проблемою, де _all не працює.
rom

@rom Звичайно. Просто замініть _allім'я індексу та повторіть запит для кожного індексу.
rubik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.