# 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_delete
를false
로 변경 해 주면 해결 됩니다. (물론 디스크는 정리해서 80% 이하로 떨어뜨려 놓고 시도 해야 겠습니다.)1
2
3
4
5
6
7
8PUT _settings
{
"index": {
"blocks": {
"read_only_allow_delete": "false"
}
}
}만약 디스크 용량이 너~~~무 모자라서 가장 중요한 인덱스 만이라도 먼저 살려야 겠다 싶으면 아래와 같이 특정 인덱스의 셋팅을 변경 하면 됩니다.
1
2
3
4
5
6
7
8PUT 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