본문 바로가기

ELK

[ES] 403 index read-only 에러가 발생했을 때


어느날 ElasticSearch index에 데이터가 제대로 들어오지 않는 것같아서 logstash의 log를 열어보니 다음과 같은 로그가 여러개 발생해 있었다.

logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({"type"=>"cluster_block_exception", "reason"=>"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]

그래서 찾아보니 이런 내용의 글이 있었다.


(원문 페이지: https://discuss.elastic.co/t/forbidden-12-index-read-only-allow-delete-api/110282)

Edit: i think my problem is low storage. just check your storage first.

when it's low, kibana auto changes its config to read-only mode. to deal with it, go to your dev tools console and run below command:

PUT .kibana/_settings
{
    "index": {
        "blocks": {
        "read_only_allow_delete": "false"
        }
    }
}

즉, ES에 용량대비 데이터가 지나치가 많이 쌓이면 키바나에서 데이터를 read-only모드로 바꾼다는 내용이다.

실제로 쿼리를 날리니까 문제는 해결됐다. 원문을 잘 읽어보면 '.kibana' 인덱스 자체를 날리고 해결했다는 사람도 있는데,

대시보드 세팅이 매우 많이 진행 되었기 때문에 그럴순 없었다. (문제를 해결하는 적절한 방법 같지도 않다.)


찜찜한 마음에 더 찾아보니,

kibana가 설치가 되어있지 않은 ES에서도 디스크 용량이 가득차면 ES내부 옵션에서 read-only로 바뀐다고한다.

이럴땐 .kibana 인덱스 말고 전체(_all) 혹은 특정 인덱스 대상으로 아래와 같이 쿼리를 날리면 해결된다.

PUT _all/_settings
{
    "index": {
        "blocks": {
        "read_only_allow_delete": "false"
        }
    }
}

kibana 내부 옵션만으로도 데이터 전달이 되지 않는 것을 보면, ES의 insert과정에서 키바나 설정과 동기화되는 요소가 있는 것 같다.