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 %이므로 1TB 드라이브에서는 최소 50GB의 여유 공간이 필요합니다. 그렇지 않으면 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 명령으로 수정했지만 며칠 후에 동일한 결과를 얻습니다.
manu

@SankalpaTimilsina 당신은 대답을 얻었습니까, 나는 같은 문제에 직면하고 있습니다.
Malik Faiq

52

기본적으로 설치된 Elasticsearch는 사용 가능한 디스크 공간이 5 % 미만인 경우 읽기 전용 모드로 전환됩니다. 다음과 유사한 오류가 표시되는 경우 :

Elasticsearch :: Transport :: Transport :: 오류 :: 금지 : [403] { "error": { "root_cause": [{ "type": "cluster_block_exception", "reason": "차단 자 : [FORBIDDEN / 12 / 인덱스 읽기 전용 / 삭제 허용 (api)]; "}],"type ":"cluster_block_exception ","reason ":"차단 자 : [FORBIDDEN / 12 / index read-only / allow delete (api)]; " }, "상태": 403}

또는 /usr/local/var/log/elasticsearch.log에서 다음과 유사한 로그를 볼 수 있습니다.

[nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / nodes / 0]에서 플러드 단계 디스크 워터 마크 [95 %] 초과 : 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"당신의 명령을 받고 있습니다.
Cyril Duchon-Doris

1
감사! 디스크 공간이 부족했습니다. 여유 공간을 확보 한 후에도 문제는 여전히 남아 있습니다. 이 명령은 내 문제를 해결했습니다!
Fred

이것은 최신 Elasticsearch 버전에 대한 올바른 솔루션입니다. 그러나 _all. 각 인덱스에 수동으로 적용해야했습니다.
rubik

@rubik "수동으로 각 인덱스에 적용"하는 방법을 말씀해 주시겠습니까? Elasticsearch를 처음 사용하고 _all이 작동하지 않는 동일한 문제에 직면했습니다.

@rom 물론입니다. _all색인 이름으로 바꾸고 각 색인에 대해 요청을 반복하십시오.
루빅
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.