Elasticsearch 클러스터 분할 두뇌(Split-Brain) 시나리오 문제 해결

중요한 Elasticsearch 분할 두뇌 문제를 진단하고 해결하는 방법을 알아보세요. 이 가이드는 네트워크 분할 및 잘못된 쿼럼 구성과 같은 일반적인 원인을 다룹니다. 네트워크 확인 및 로그 분석을 포함한 실용적인 진단 단계를 확인하고, 클러스터 안정성을 복구하기 위한 명확하고 단계별 해결 프로세스를 따르세요. 향후 분할 두뇌 사고로부터 Elasticsearch 배포를 보호하기 위한 예방 전략을 구현하십시오.

46 조회수

일반적인 Elasticsearch 클러스터 스플릿 브레인 시나리오 문제 해결

강력한 분산 검색 및 분석 엔진인 Elasticsearch는 클러스터 무결성을 유지하기 위해 안정적인 네트워크와 적절한 구성에 의존합니다. '스플릿 브레인(Split-Brain)' 시나리오는 클러스터가 여러 개의 독립적인 노드 그룹으로 나뉘어 각 그룹이 스스로 마스터라고 믿을 때 발생합니다. 이는 데이터 불일치, 노드 무응답, 잠재적인 데이터 손실로 이어집니다. 이러한 문제의 원인을 이해하고 진단 및 해결 방법을 아는 것은 건강한 Elasticsearch 환경을 유지하는 데 필수적입니다.

이 글에서는 Elasticsearch 스플릿 브레인 시나리오의 일반적인 원인을 안내하며, 특히 네트워크 관련 문제와 쿼럼(quorum) 구성 오류에 초점을 맞춥니다. 클러스터의 안정성을 복구하고 향후 발생을 방지하는 데 도움이 되도록 진단 확인 및 구성 조정을 포함한 실질적인 단계를 제공할 것입니다.

스플릿 브레인 이해하기

스플릿 브레인 상황은 노드, 특히 마스터 자격이 있는 노드 간의 통신이 중단될 때 발생합니다. Elasticsearch와 같은 분산 시스템에서는 노드가 클러스터 전체 작업을 관리하기 위해 마스터를 선출합니다. 마스터 노드에 연결할 수 없게 되거나 네트워크 분할(partition)이 노드 그룹을 격리하면, 각 고립된 그룹 내에서 새로운 마스터가 선출될 수 있습니다. 이로 인해 각 '마스터'가 독립적으로 작동하면서 클러스터 상태가 충돌하게 되고, 결국 악명 높은 스플릿 브레인으로 이어집니다.

스플릿 브레인의 주요 결과는 다음과 같습니다:

  • 데이터 불일치: 인덱스가 한 파티션에서는 업데이트되지만 다른 파티션에서는 업데이트되지 않을 수 있습니다.
  • 노드 무응답: 노드가 클러스터에 합류하거나 효과적으로 통신할 수 없게 될 수 있습니다.
  • 쓰기 실패: 클러스터 전체 조정이 필요한 작업이 실패합니다.
  • 잠재적인 데이터 손실: 파티션이 지속되고 올바르게 병합되지 않으면 데이터가 손실될 수 있습니다.

일반적인 원인 및 진단 단계

스플릿 브레인 문제는 대개 네트워크 불안정성 또는 잘못된 클러스터 설정에 기인합니다. 다음은 가장 일반적인 원인과 이를 진단하는 방법입니다.

1. 네트워크 분할 (Network Partitions)

네트워크 문제는 스플릿 브레인의 가장 빈번한 원인입니다. 이는 일반적인 네트워크 연결 문제부터 노드 또는 전체 가용 영역(availability zones)을 격리하는 잘못 구성된 방화벽 또는 라우팅 문제에 이르기까지 다양합니다.

진단 단계:

  • Ping 및 Traceroute: 각 노드에서 클러스터의 다른 모든 노드로 ping 및 traceroute를 시도합니다. 패킷 손실, 높은 지연 시간(latency) 또는 연결할 수 없는 호스트가 있는지 확인합니다.
    bash # Linux/macOS 시스템 예시 ping <other_node_ip> traceroute <other_node_ip>
  • 방화벽 규칙 확인: Elasticsearch 전송 포트(기본값 9300)가 모든 노드 간에 열려 있는지 확인합니다. 방화벽은 간헐적인 연결 문제의 흔한 원인이 될 수 있습니다.
  • 네트워크 인프라 검증: 라우터, 스위치 및 로드 밸런서에서 구성 오류나 실패 징후가 있는지 검사합니다.
  • 클라우드 공급자 세부 사항: 클라우드 환경(AWS, GCP, Azure)에서 실행 중인 경우, 보안 그룹, 네트워크 액세스 제어 목록(NACL) 및 가상 사설 클라우드(VPC) 라우팅 테이블에 제한 사항이 있는지 확인합니다.
  • Elasticsearch 로그 분석: [connection_exception], [netty], [remote_transport] 또는 [master_not_discovered] 오류를 언급하는 로그를 찾습니다. 이는 종종 네트워크 관련 통신 실패를 나타냅니다.

2. 마스터 자격 노드 장애

마스터 자격 노드가 실패하거나 사용할 수 없게 되면 클러스터는 새 마스터를 선출하려고 시도합니다. 네트워크 분할로 인해 노드들이 서로를 볼 수 없게 되면 여러 마스터 선출이 동시에 발생하여 스플릿 브레인으로 이어질 수 있습니다.

진단 단계:

  • 마스터 노드 모니터링: _cat/master API를 사용하여 현재 선출된 마스터 노드가 무엇인지 확인합니다.
    bash GET _cat/master?v
  • 노드 상태 확인: _cat/nodes API는 클러스터의 모든 노드와 해당 역할에 대한 개요를 제공합니다.
    bash GET _cat/nodes?v
  • 클러스터 상태 분석: _cluster/health API는 클러스터의 전반적인 상태를 보여줍니다. 노란색 또는 빨간색 상태는 종종 샤드 할당 문제를 나타내며, 이는 스플릿 브레인과 관련될 수 있습니다.
    bash GET _cluster/health

3. 잘못된 쿼럼 구성 (discovery.zen.minimum_master_nodes)

이 설정은 스플릿 브레인을 방지하는 데 매우 중요합니다. 이는 클러스터가 마스터를 선출하고 작동하기 위해 사용할 수 있어야 하는 마스터 자격 노드의 최소 수를 정의합니다. 이 값이 너무 낮게 설정되면, 소수의 노드만으로도 클러스터의 나머지 부분과 격리된 상태에서도 쿼럼을 형성하고 마스터를 선출할 수 있습니다.

모범 사례: N이 클러스터의 마스터 자격 노드 수일 때, discovery.zen.minimum_master_nodes(N / 2) + 1로 설정하십시오. 이렇게 하면 마스터 선출을 위해 대다수의 마스터 자격 노드가 반드시 존재하도록 보장됩니다.

구성 예시 (elasticsearch.yml에서):

마스터 자격 노드가 3개인 경우:

discovery.zen.minimum_master_nodes: 2 # (3 / 2) + 1 = 2

마스터 자격 노드가 5개인 경우:

discovery.zen.minimum_master_nodes: 3 # (5 / 2) + 1 = 3

Elasticsearch 7.x 이상 버전에 대한 중요 참고 사항:

Elasticsearch 7.0 이상 버전에서 discovery.zen.minimum_master_nodes사용되지 않으며(deprecated) cluster.initial_master_nodes로 대체되었습니다. Elasticsearch 7.x의 경우, 업그레이드를 수행하는 경우에도 이전 설정과 관련된 문제가 발생할 수 있습니다. Elasticsearch 8.x 이상에서는 클러스터 부트스트랩 시 초기 마스터 노드 구성을 기반으로 클러스터가 이를 자동으로 처리합니다. 클러스터 부트스트랩을 위한 새 권장 접근 방식은 cluster.initial_master_nodes를 사용하는 것입니다.

# Elasticsearch 7.x의 경우, 초기 클러스터 부트스트랩 시 사용
cluster.initial_master_nodes: [ "node-1", "node-2", "node-3" ]

진단 단계:

  • elasticsearch.yml 확인: 모든 노드에서 discovery.zen.minimum_master_nodes 또는 cluster.initial_master_nodes 설정을 검토합니다.
  • 일관성 검증: 이 설정이 모든 마스터 자격 노드에서 일관적인지 확인합니다.
  • 재계산: 최근에 마스터 자격 노드를 추가하거나 제거한 경우, 이 값이 올바르게 재계산되고 업데이트되었는지 확인합니다.

스플릿 브레인 상황 해결하기

스플릿 브레인 상황을 해결하려면 데이터 무결성을 보장하기 위한 신중한 단계가 필요합니다. 일반적인 접근 방식은 파티션을 식별하고, 하나의 파티션을 제외한 모든 파티션을 중지한 다음, 클러스터가 다시 결합하도록 허용하는 것입니다.

경고: 이 단계에는 Elasticsearch 노드를 중지하고 잠재적으로 다시 시작하는 작업이 포함됩니다. 복구를 시도하기 전에 항상 최근 백업을 확보하십시오.

1단계: 파티션 식별

네트워크 진단 도구와 (_cat/nodes API에 접근 가능한 경우) 이를 사용하여 클러스터가 어떻게 분할되었는지 확인합니다. 어떤 노드들이 서로 통신할 수 있는지 확인하려면 개별 노드의 로그에 접근해야 할 수도 있습니다.

2단계: 유지할 파티션 선택

권한 있는(authoritative) 파티션으로 유지할 파티션을 결정합니다. 일반적으로 이는 분할 이전에 활성화되었던 마스터 노드를 포함하는 파티션이거나 가장 최신 데이터를 가진 파티션입니다. 이 파티션의 노드는 계속 실행되도록 표시합니다.

3단계: 유지하지 않을 파티션의 모든 노드 중지

유지하지 않을 파티션에 속하는 노드에서 모든 Elasticsearch 프로세스를 종료합니다.

4단계: 유지할 파티션 재설정 및 재시작

유지할 파티션의 노드에서:

  1. Elasticsearch 중지: 모든 Elasticsearch 프로세스가 중지되었는지 확인합니다.
  2. 트랜잭션 로그 삭제 (선택 사항이지만 권장): 데이터 일관성을 절대적으로 확실하게 하려면, 유지할 노드에서 트랜잭션 로그를 삭제할 수 있습니다. 이는 좀 더 공격적인 단계이므로 주의해서 수행해야 합니다.
    • elasticsearch 데이터 디렉터리를 찾습니다.
    • 각 인덱스에 대해 dev/shm/elasticsearch/nodes/<node_id>/indices/<index_name>/0/translog 디렉터리를 찾아 삭제합니다.
    • 주의: 이 작업은 프라이머리 샤드로부터 강제로 재인덱싱을 유발합니다. 유지할 파티션에서 프라이머리 샤드가 손상되었거나 누락된 경우 데이터 손실로 이어질 수 있습니다. 가능한 경우 클러스터가 자체적으로 재동기화하도록 두는 것이 더 안전한 경우가 많습니다.
  3. minimum_master_nodes가 올바른지 확인: discovery.zen.minimum_master_nodes (또는 최신 버전의 경우 cluster.initial_master_nodes)가 클러스터에 두려는 최종 마스터 자격 노드 수에 대해 올바르게 구성되었는지 다시 확인합니다.
  4. Elasticsearch 시작: 유지할 파티션의 노드에서 Elasticsearch 서비스를 시작합니다. 노드들은 마스터를 선출하고 안정적인 클러스터를 형성할 수 있어야 합니다.

5단계: 다른 노드 복귀시키기

유지할 파티션이 안정화되면:

  1. Elasticsearch 시작: 이전에 유지하지 않았던 파티션에 있던 노드에서 Elasticsearch 서비스를 시작합니다. 이 노드들은 기존 클러스터에 합류하려고 시도할 것입니다. Elasticsearch는 이제 안정된 클러스터의 프라이머리 노드로부터 샤드 데이터를 재동기화할 것입니다.
  2. 클러스터 상태 모니터링: _cat/nodes_cluster/health를 사용하여 모든 노드가 다시 결합하고 클러스터 상태가 녹색으로 돌아왔는지 확인합니다.

예방 전략

  • 강력한 네트워크 모니터링: 네트워크 인프라에 대한 포괄적인 모니터링을 구현하고 Elasticsearch 노드 간의 지연 시간 및 패킷 손실에 세심한 주의를 기울이십시오.
  • 중복 마스터 자격 노드: 다수 기반 쿼럼을 용이하게 하기 위해 항상 홀수 개의 마스터 자격 노드(최소 3개)를 유지하십시오.
  • 올바른 minimum_master_nodes: 이것이 주된 방어 수단입니다. N이 마스터 자격 노드의 수일 때 항상 (N / 2) + 1로 설정되었는지 확인하십시오.
  • 마스터 자격 노드 격리: 특정 노드를 마스터 자격으로 전용하고 데이터 노드와 분리하여 로드 및 잠재적 간섭을 줄이는 것을 고려하십시오.
  • 스테이징 및 테스트: 특히 네트워크 관련 클러스터 구성 변경 사항을 프로덕션에 적용하기 전에 스테이징 환경에서 철저하게 테스트하십시오.
  • 정기 백업: Elasticsearch 데이터에 대한 정기적이고 자동화된 백업을 유지하십시오. 이는 궁극적인 안전망입니다.

결론

Elasticsearch의 스플릿 브레인 시나리오는 어려울 수 있지만, 부지런한 구성 및 모니터링을 통해 예방할 수 있는 경우가 많습니다. 근본적인 원인을 이해하고, 철저한 네트워크 확인을 수행하며, 쿼럼 설정을 올바르게 구성함으로써 이러한 문제에 직면할 위험을 크게 줄일 수 있습니다. 스플릿 브레인이 발생하는 경우, 구조화된 복구 프로세스를 따르면 클러스터의 무결성을 복원하고 데이터 일관성을 보장하는 데 도움이 됩니다. 강력한 네트워킹 및 올바른 클러스터 설정을 통한 예방책을 우선시하는 것이 안정적이고 신뢰할 수 있는 Elasticsearch 배포를 유지하는 핵심입니다.