Elasticsearch All shards failed for phase

JunMyung Lee·2024년 3월 25일
0

Elasticsearch

목록 보기
33/37

현상

타팀의 ES운영중에 검색시 다음과 같은 예외가 발생한다고 문의가 왔다.

[2024-03-22T16:26:11,079][DEBUG][o.e.a.s.TransportSearchAction] [blth232-node1] All shards failed for phase: [query]
org.elasticsearch.action.NoShardAvailableActionException: null

구글링시에 대부분 특정 인덱스에 문제가 발생했으니 해당 인덱스를 찾으라고 한다. 이때 찾는법은 status가 red인 인덱스를 지우면 된다고 한다.

GET _cluster/health?level=shards 조회 시, status는 모두 "yellow"로 되어 있고 "red"는 존재하지 않았다. "yellow"상태는 경고성이지 검색이 안되면 안되는 것이다.

또한 문의가 왔을 때 일반적인 조회는 되고 특정 쿼리에서 조회가 되질 않았다.

원인

  • GET /_cat/nodes?v 노드 상태 체크 시 1대의 노드만 기동 중
    * ES 자체가 내려가서 "red" 상태값이 안보임
  • 분산 색인에 의해 유실된 데이터를 검색하는 부분일 경우 예외 발생
    * 단순 _search 데이터 노출

해결

  • 내려간 ES를 재기동
  • 일정 시간 이후 검색 정상화 및 클러스터 상태 "green"

상태값이 "yellow"였으므로 검색에는 이상이 없었어야 했는데 단순히 클러스터가 내려갔다고 검색이 안되었다는것이 이해하기 어려웠다. ES는 한쪽 서버가 내려가도 무중단 서비스가 되어야 하기 때문이다.
기본 옵션으로 설정했으므로 primary shards는 5값이고, replica는 1이므로 다음과 같은 설정이 되어야 한다.

하지만 유실된 검색데이터가 발생하였고, 에러까지 발생하였다.

예상 시나리오

운영중인 서버의 설정

서버의 설정에서 마스터노드가 따로 존재하지 않고 두대의 서버 설정 모두 다음과 같다

node.master: true
node.data: true

둘다 master 설정이 되어 있지만 먼저 올라간 노드가 마스터로 지정이 되었을 것이다.

Master 노드 Down

master 노드가 독립적이지 않고 data 노드의 역할도 함께 하고 있고, master 노드의 서버가 down되었다면, 살아있는 다른 서버가 master로 승격이 되어서 운영이 되어야 한다.

샤드 분배 실패

master 노드가 살아있는 노드의 replica shards를 primary shards로 승격을 시켜야 하는데, master의 역할을 하는 노드가 죽었기 때문에 승격을 시키지 못하고 죽었고, 새로운 master가 승격되었을 때는 이러한 샤드 분배역할을 건너뛰고 승격이 되었기 때문에 unsigned_shard가 발생하고 검색이 안되었을 가능성이 현재로서는 가장 타당한 예측인듯 하다.

결론

ES구성에서 master 노드와 data 노드를 함께 구성하지 말라고만 하는데 실제 운영중 이런 이슈가 발생할 수 있으므로 ES의 노드 설정을 잘 구성해야 한다. 또한 리소스에 맞게도 구성해야한다.

0개의 댓글