엘라스틱 서치 클러스터 상태(Cluster Health)가 노란색이 되는 이유

gompro·2021년 6월 27일
0
post-thumbnail

흔히 엘라스틱 서치의 중요한 특성으로 분산성을 얘기합니다. 분산성은 간단하게, 데이터를 여러 대의 머신에 나눠 저장할 수 있는 능력을 말합니다. 이를 통해 한 머신에 장애가 일어나더라도 다른 머신에서 계속해서 작업을 진행할 수 있습니다. (내장애성 (Falut Tolerance)) 또 다른 장점은 수평 스케일링(Horizontal Scaling)의 장점을 누릴 수 있다는 점입니다. 일반적으로 데이터 저장소의 성능을 개선하려면 사용 중인 머신을 업그레이드하거나 (수직 스케일링 (Vertical Scaling)) 평범한 스펙의 머신을 여러 대 사용(수평 스케일링)할 수 있습니다. 수평 스케일링은 수직 스케일링에 비해 업그레이드가 용이할 뿐 아니라 비용면에서도 훨씬 효율적입니다. 같은 일을 하기 위해 수퍼 컴퓨터 1대를 사는 대신 평범한 사무용 컴퓨터 수 십대를 활용할 수 있는 것과 같은 이치입니다.

그렇다면 엘라스틱 서치는 어떤 식으로 여러 대의 머신을 활용할까요? 엘라스틱 서치의 각 머신은 노드(Node)라고 불리는데요, 노드는 여러 개의 문서(Document)가 속한 인덱스(Index)를 가질 수 있습니다. 인덱스는 또 여러 개의 샤드(Shard) 단위로 관리됩니다. 엘라스틱 서치는 하나의 샤드를 여러 노드에 저장함으로써 한 노드에서 장애가 발생하더라도 다른 노드를 이용하여 검색을 수행할 수 있습니다. 즉, 프라이머리 샤드(Primary Shard)와 해당 샤드의 복제본 - 레플리카(Replica)를 여러 노드에 걸쳐 저장함으로써 샤드의 일부 유실을 견딜 수 있게 되는 것입니다. 이처럼 여러 샤드를 저장하는 방식은 내장애성을 끌어올리는 것 외에도 검색 성능 향상에도 도움을 줍니다. (물론 여러 노드를 사용하면 그만큼 더 많은 비용이 발생하므로 비용과 이득을 잘 계산해서 스위트 스팟을 찾아야합니다.)

지금까지는 클러스터의 상태를 이해하기 위한 사전 지식을 살펴봤습니다. 이제 클러스터 상태 얘기를 해봅시다. AWS 엘라스틱 서치 인스턴스를 사용하다보면 설정에 따라 클러스터 상태가 노란색이 되는 경우가 있습니다. 클러스터 상태가 노란색이 되더라도 검색/색인 기능에 이상은 없지만, 찝찝한 느낌이 드는 것도 사실입니다. 이 상황에서 어떻게 하면 클러스터 상태를 초록색으로 만들 수 있을까요?

먼저 각 클러스터 색깔이 어떤 상태를 의미하는지 살펴봅시다.

상태설명
초록색모든 데이터가 정상이고, 모든 레플리카가 배정된 상태
노란색모든 데이터가 정상이고, 일부 레플리카가 배정되지 않은 상태
빨간색일부 데이터를 사용할 수 없는 상태

위 사진을 보면 노드는 1대, 활성화된 샤드(Active shards)가 8개, 프라이머리 샤드가 8개 그리고 할당되지 않은 샤드(Unassigned shards)가 8개로 표시되는데요, 이는 현재 프라이머리 샤드 8개와 해당 샤드에 대한 레플리카가 각 하나씩 존재하며 모든 레플리카가 배정되지 않았다는 얘기입니다. (8 * 레플리카 개수(1) = 8)

먼저 해당 인덱스에 설정된 레플리카 개수를 살펴봅시다. 인덱스 별로 설정된 레플리카의 개수를 확인하려면 인덱스 세팅 조회 API를 사용하면 됩니다. 위 상황의 경우 number_of_replicas 옵션이 1로 설정되어 있습니다. 하지만 노드가 1대인 상황에서는 레플리카를 사용할 수 없습니다. 이는 엘라스틱 서치가 프라이머리 샤드와 해당 샤드의 레플리카를 같은 노드에 할당하지 않기 때문인데요. 레플리카를 사용하는 이유가 노드의 실패를 견디기 위해서라는 점을 생각해보면 이해할 수 있는 규칙입니다. 프라이머리 샤드와 레플리카가 같은 노드에 할당되었는데, 해당 노드에 장애가 발생하면 그 프라이머리는 사용할 수 없는 상태가 되니까요.

우리는 개발 목적으로 1대의 노드만 사용할 것이기 때문에number_of_replicas0으로 설정해줍니다. 만약 로그 데이터처럼 특정한 규칙에 의해 인덱스가 자동으로 추가되는 경우(logs-20xx-xx-xx), 인덱스 템플릿을 활용할 수 있습니다.

PUT _index_template/base_logs_template
{
  "index_patterns": ["logs-*"], // logs 접두사를 사용하는 모든 인덱스
  "template": {
    "settings": {
      "number_of_shards": 1, // 샤드를 하나만 사용
      "number_of_replicas": 0 // 레플리카 사용하지 않음
    }
  }
}

일반적으로 설정 변경을 위해서는 설정 파일을 변경한 후 재시작이 필요한 것과 달리, 엘라스틱 서치는 서버 재시작 없이 API를 활용하여 동적으로 설정을 변경할 수 있다는 큰 장점이 있습니다.

마지막으로 프라이머리 샤드와 레플리카 개수 설정에 따라 몇 대의 노드를 사용해야 클러스터 상태를 초록색으로 만들 수 있는지 계산해봅시다.

프라이머리 샤드 2개 / 레플리카 2개

위 상황에서 샤드의 총 개수는 2 + (2 * 2) = 6개가 됩니다.

pr = primary shard
re = replica

Node1
pr0 re1

Node2
pr1 re0

Node3
re1 re0

할당되지 않은 샤드 없이, 프라이머리 샤드와 레플리카를 같은 머신에 할당하지 않으려면 노드가 3대 필요하네요!

더 읽어보기

profile
다양한 것들을 시도합니다

0개의 댓글