При попытке запись в Elasticsearch возвращает ошибку: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];
Полный текст ошибки выглядит следующим образом:
1 | {"index":{"_index":"test-54","_type":"_doc","_id":"gxRH6oAB5E3E9kN4fPQy","status":403,"error":{"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}}} |
Для разблокировки индекса или всех индексов выполняем команду ниже.
Для одного индекса <index_name>
1 | curl -k -XPUT -H 'Content-Type:application/json' http://127.0.0.1:9200/<index_name>/_settings -d '{ "index" : { "blocks.read_only_allow_delete": "false" } }' |
Для всех индексов
1 | curl -k -XPUT -H 'Content-Type:application/json' http://127.0.0.1:9200/_all/_settings -d '{ "index" : { "blocks.read_only_allow_delete": "false" } }' |
Чаще всего такое поведение может быть связано с исчерпанием дискового пространства, более подробно можно почитать в статье "Elasticsearch Cluster Blocks Read-Only"
Elasticsearch автоматически отключает определенные процессы на кластере, когда свободное пространство на диске опускается ниже определенного уровня.
Изменить пороговые значения disk.watermark для кластера Elasticsearch
Elasticsearch учитывает доступное дисковое пространство на узле, прежде чем принять решение о выделении новых шардов на этом узле или об активном перемещении шардов с этого узла.
Ниже приведены параметры, которые можно настроить в конфигурационном файле elasticsearch.yml или динамически обновить на живом кластере с помощью API cluster-update-settings:
- cluster.routing.allocation.disk.watermark.low - Низкий watermark для использования диска, по умолчанию 85%. Elasticsearch не будет выделять шарды узлам, у которых диск используется более чем на 85%.
- cluster.routing.allocation.disk.watermark.high - Высокий watermark для использования диска, по умолчанию 90%. Elasticsearch попытается переместить шарды подальше от узла, чье использование диска превышает 90%.
- cluster.routing.allocation.disk.watermark.flood_stage - Watermark стадии "наводнения" для использования диска, по умолчанию 95%. Elasticsearch принудительно создает индексный блок только для чтения (index.blocks.read_only_allow_delete) для каждого индекса, который имеет один или более шардов, выделенных на узле, и у которого по крайней мере один диск превышает уровень.
Изменить disk.watermark с помощью API
Установить конкретный порог в гигабайтах
1 2 3 4 5 6 7 8 9 | curl -XPUT /_cluster/settings' -H 'Content-Type: application/json' -d' { "transient": { "cluster.routing.allocation.disk.watermark.low": "10gb", "cluster.routing.allocation.disk.watermark.high": "7gb", "cluster.routing.allocation.disk.watermark.flood_stage": "5gb", "cluster.info.update.interval": "1m" } }' |
Установить порог в процентах
1 2 3 4 5 6 | PUT /_cluster/settings?flat_settings=true -H 'Content-Type: application/json' -d' { "transient": { "cluster.routing.allocation.disk.watermark.low": "93%", "cluster.routing.allocation.disk.watermark.high": "95%" }' |
Изменить disk.watermark в elasticsearch.yml
В файл elasticsearch.yml добавляем следующие настройки
1 2 3 | cluster.routing.allocation.disk.watermark.low: "95%" cluster.routing.allocation.disk.watermark.high: "95%" cluster.routing.allocation.disk.watermark.flood_stage: "95%" |
После чего потребуется перезапустить ноду
1 | service elasticsearch restart |