Elasticsearch 클러스터는 마스터 노드, 데이터 노드, 코디네이터 노드로 구성되며, 각 노드가 다운될 경우 시스템의 안정성과 가용성에 영향을 미칠 수 있다. 따라서 각 노드 유형별로 장애 발생 시 대응 방안을 마련해야 한다.


1. 마스터 노드 장애 복구 전략

(1) 마스터 노드의 역할

  • 클러스터의 헬스 체크, 노드 관리, 샤드 할당, 설정 변경 등의 중요한 역할을 수행
  • 마스터 노드가 장애를 일으키면 클러스터 상태를 업데이트하거나 새로운 노드를 추가할 수 없음

(2) 마스터 노드 장애 발생 시 증상

  • GET _cluster/health 요청 시 red 또는 yellow 상태
  • 클러스터 상태 변경이 불가능
  • 노드 추가 및 샤드 할당 불가

(3) 복구 방법

  1. 다른 마스터 노드가 있는지 확인
    • 정상적으로 선출된 새로운 마스터 노드가 있으면 자동 복구 진행됨
  2. GET _cat/master?v
  3. 마스터 노드가 1개뿐인 경우 클러스터가 중단됨
    • 최소 3개의 마스터 노드를 유지해야 함
    • 마스터 노드가 모두 다운된 경우 수동 복구 필요
  4. 새로운 마스터 노드 추가
    • 기존 마스터 노드가 복구 불가능할 경우 새로운 노드를 추가하고 elasticsearch.yml에서 마스터 노드로 설정
    node.master: true
    
  5. 클러스터 재시작 후 상태 확인
  6. GET _cluster/health
  7. 마스터 노드 선출이 안 될 경우 강제 복구
    • 강제로 클러스터를 재구성하여 노드를 재배치
  8. curl -XPOST "http://localhost:9200/_cluster/reroute?retry_failed=true"

예방 조치

  • 마스터 노드는 반드시 3개 이상 유지하여 선출이 가능하도록 구성
  • 마스터 전용 노드를 설정하여 데이터 노드와 분리
  • 고가용성을 위해 마스터 노드를 다른 물리 서버에 배포

2. 데이터 노드 장애 복구 전략

(1) 데이터 노드의 역할

  • 인덱스 데이터 저장 및 검색 요청 처리
  • 장애 발생 시 저장된 데이터가 유실될 가능성이 있음

(2) 데이터 노드 장애 발생 시 증상

  • 일부 데이터 조회 불가
  • 클러스터 헬스 체크 시 yellow 또는 red 상태
  • 샤드 불균형 발생

(3) 복구 방법

  1. 장애 노드 상태 확인
    • 노드가 다운되었는지 확인하고 문제 원인 파악 (디스크 공간 부족, 메모리 문제 등)
  2. GET _cat/nodes?v
  3. 샤드 재할당 확인
    • UNASSIGNED 상태의 샤드가 있으면 자동 복구되지 않았음을 의미
  4. GET _cat/shards?v
  5. 노드 재시작 후 샤드 복구 확인
    • 데이터 노드를 다시 시작한 후, 클러스터가 자동으로 샤드를 복구하는지 확인
    systemctl restart elasticsearch
    
  6. 수동 샤드 복구 실행 (필요 시)
  7. POST _cluster/reroute?retry_failed=true
  8. 샤드 강제 할당 (긴급 복구 필요 시)
    • 할당이 실패한 이유를 확인한 후 적절한 노드로 수동 할당
  9. POST _cluster/allocation/explain

예방 조치

  • 복제 샤드 설정(number_of_replicas: 1 이상)으로 장애 발생 시 자동 복구 가능하도록 설정
  • 디스크 사용량 모니터링 (GET _cat/allocation?v 명령어 활용)
  • 데이터 노드 장애 발생 시 ILM(인덱스 수명 주기 관리) 적용하여 오래된 데이터를 자동으로 Cold 노드로 이동

3. 코디네이터 노드 장애 복구 전략

(1) 코디네이터 노드의 역할

  • 검색 쿼리 및 집계 요청을 분산하여 성능 최적화
  • 장애 발생 시 데이터 노드의 부하가 증가할 수 있음

(2) 코디네이터 노드 장애 발생 시 증상

  • 검색 및 집계 쿼리 속도 저하
  • CPU 사용량 증가
  • 클러스터 전체의 응답 속도 저하

(3) 복구 방법

  1. 장애 노드 상태 확인
    • 코디네이터 노드가 다운되었는지 확인
  2. GET _cat/nodes?v
  3. 노드 재시작
    • 노드가 단순한 장애(메모리 부족, 네트워크 문제)라면 재시작으로 해결 가능
  4. systemctl restart elasticsearch
  5. 노드 추가 및 부하 분산
    • 코디네이터 노드가 과부하로 다운되었다면 새로운 코디네이터 노드 추가
    node.master: false
    node.data: false
    node.ingest: false
    
  6. 쿼리 로드 밸런싱 설정
    • 애플리케이션에서 Elasticsearch에 요청할 때 라운드 로빈 방식을 사용하여 요청을 여러 노드로 분산

예방 조치

  • 검색 요청이 많은 경우 코디네이터 노드를 2개 이상 운영
  • 로드 밸런서를 활용하여 요청 부하를 분산
  • 쿼리 최적화 적용 (필요한 필드만 검색, 애그리게이션 최소화)

4. 결론

  • 마스터 노드 장애 시: 3개 이상의 마스터 노드를 유지하여 자동 선출 가능하도록 구성
  • 데이터 노드 장애 시: 복제 샤드를 설정하고 ILM을 적용하여 자동 복구 가능하도록 운영
  • 코디네이터 노드 장애 시: 로드 밸런서를 활용하여 부하를 분산하고, 검색 요청이 많은 경우 추가적인 코디네이터 노드를 운영

+ Recent posts