ElasticSearch cluster_block_exception

# 1. 문제 발생

  • 운영하고 있는 서비스의 검증계 서버에서 인덱싱이 안된다는 제보가 들어와서 클라이언트 로그를 살펴보니 아래와 같습니다.
    1
    index [nakjunizm-index-20181019], type [_doc], id [153974268305904171], message [ElasticsearchException[Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];]]]

# 2. 원인

  • ElasticSearch 도 RDB 처럼 특정 상황에서 read-only상태로 전환될 수 있습니다.
  • 노드의 disk가 95% 이상 (default) 사용중이면 master node의 클러스터 로그에 아래와 같이 flood stage disk watermark exceeded 라고 로그를 뱉어 냅니다.
  • 그리고 나서는 ** 모든 인덱스를 read-only ** 로 만들어 버린것을 확인할 수 있습니다.
    1
    nakjunizm-cluster-2018-10-22-1.log:[2018-10-22T06:08:27,226][WARN ][o.e.c.r.a.DiskThresholdMonitor] [node1] flood stage disk watermark [95%] exceeded on [OxyEnIXvRRuoxy7VqTf3KQ][node2][/data/elasticsearch6/nakjunizm/nodes/0] free: 11gb[4.8%], all indices on this node will be marked read-only
  • 제 경우 node2의 디스크가 4.8% 밖에 안남았고 all indices on this node will be marked read-only 되었네요.

# 3. 문제 해결 1차 시도 (Failed)

  • 오래지난 로그파일등 쓸데없는 파일들을 정리합니다.
  • 다시 인덱싱을 요청해 봤으나 여전히 FORBIDDEN/12/index read-only / allow delete (api) 라며 인덱싱이 불가합니다!
  • 그 이유는 한번 read-only 상태로 들어간 인덱스는 명시적으로 read-only를 풀어주기 전까지는 디스크가 여유 있다 하더라도 다시 자동으로 돌아오지 않기 때문입니다.

# 4. 문제 해결 방법

  • 아래와 같이 명시적으로 read_only_allow_deletefalse 로 변경 해 주면 해결 됩니다. (물론 디스크는 정리해서 80% 이하로 떨어뜨려 놓고 시도 해야 겠습니다.)

    1
    2
    3
    4
    5
    6
    7
    8
    PUT _settings
    {
    "index": {
    "blocks": {
    "read_only_allow_delete": "false"
    }
    }
    }
  • 만약 디스크 용량이 너~~~무 모자라서 가장 중요한 인덱스 만이라도 먼저 살려야 겠다 싶으면 아래와 같이 특정 인덱스의 셋팅을 변경 하면 됩니다.

    1
    2
    3
    4
    5
    6
    7
    8
    PUT your_index_name/_settings
    {
    "index": {
    "blocks": {
    "read_only_allow_delete": "false"
    }
    }
    }

# 참조사이트

https://discuss.elastic.co/t/forbidden-12-index-read-only-allow-delete-api/110282/7
https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html

Share