Elastic Search

Ch12. 안정적인 클러스터 운영 노하우 - 마스터 노드와 데이터 노드 분리

webmaster 2025. 10. 21. 10:12
728x90

엘라스틱서치 노드의 종류

  • 클러스터를 구성하는 노드들은 다양한 역할을 하며, 하나의 노드가 모든 기능을 수행하면 처리속도나, 메모리 관리 측면에서 큰 손해를 본다.
  • 클러스터 규모가 클수록 클러스터를 관리하거나 데이터를 저장하는 역할로 노드를 분리하는 것이 좋다.
  • 엘라스틱서치는 클러스터를 구성하는 노드들이 해당 역할로만 동작할 수 있게 모드를 지원한다.
    • elasticsearch.yml 파일에 노드 관련 속성이 제공되며, 이 속성을 조합해서 특정 모드로 설정하는 것이 가능하다.
    • master: 마스터 기능 활성화 여부
    • data: 데이터 기능 활성화 여부
    • ingest: ingest 기능 활성화 여부
    • remote.connect: 외부 클러스터 접속 가능 여부

Single Node 모드

elasticsearch.yml

node. master: true
node.data: true
node.ingest: true
search.remote.connect: true
  • 모든 기능을 수행하는 모드로, 기본 설정으로 지정돼 있다.(default)
  • 검색 클러스터 규모가 적을 때 사용하면 유리하다(3대 이하 소규모 클러스터를 구축 시, 사용)

Master Node 모드

node. master: true
node.data: false
node.ingest: false
search.remote.connect: false
  • 클러스터의 제어를 담당하는 모드
    • 기본적으로 인덱스를 생성하거나 변경 및 삭제와 관련된 일을 담당한다.
    • 클러스터를 구성하는 노드의 상태를 주기적으로 점검해서 장애에 대비한다.
  • 마스터 노드가 장애 발생 시, 클러스터 전체에 피해가 발생하기 때문에 다수의 마스터 노드가 필요하며, 장애 시, 대기 중인 마스터 후보가 즉시 마스터 역할을 위임받아야 한다.

Data Node 모드

node.master: false
node.data: true
node.ingest: false
search.remote.connect: false
  • 클러스터에 데이터를 보관하고, CRUD/검색/집계 관련 작업을 담당한다.
  • Data Node 모드로 동작 시, 내부 데이터가 저장된다.
    • 마스터 노드와 달리 대용량 저장소를 필수로 가져야 한다.
  • HDD나 NAS 같은 외부 스토리지를 마운트 할 수 있지만 최근 많이 사용하는 SSD 디스크를 사용하는 것이 효율적이다.
  • 데이터에 대한 CRUD나, 검색 집계와 같은 대량의 리소스를 사용하는 연산을 주로 사용하기에 고성능 CPU, 메모리를 가진 서버를 사용하는 것이 좋다.

Ingest Node 모드

node.master: false
node.data: false
node.ingest: true
search.remote.connect: false
  • 다양한 형태의 데이터를 색인할 때 데이터의 전처리를 담당하는 모드이다.
  • 엘라스틱서치는 스키마리스를 권장하지 않기 때문에 다양한 리소스를 인덱스라는 툴을 기반으로 색인해 데이터로 생성할 수 있다.
    • 하지만, 대부분 인덱스에 저장할 색인 데이터를 가공할 필요가 있기 떄문에 색인 시 크롤러를 개발해 색인 작업을 수행한다.
    • 이때 크롤러를 개발할 정도가 아닌 간단한 포맷 변경이나 유효성 검증과 같은 전처리가 필요시 ingest 노드 사용 가능하다

Coordination Node 모드

node.master: false
node.data: false
node.ingest: false
search.remote.connect: true
  • 사용자의 요청을 받아 처리하는 코디네이터 모드이다.
  • 엘라스틱서치의 모든 노드는 기본적으로 coordination Node이며, 모든 노드가 사용자의 집계 요청을 받아 처리 가능하다.
  • 각 샤드는 요청을 받으면, 자신이 가지고 있는 데이터 범위 내에서 검색을 수행하고, 최초 요청 결과를 최초 요청한 Coordination Node에 전달하게 된다.
    • Coordination Node는 모든 데이터가 도착할 때까지 기다리며, 모든 데이터가 도착하면 하나의 커다란 응답 데이터로 병합해 사용자에게 전달한다.
    • 각 데이터 노드에게 전달받은 데이터를 하나로 병합하는 작업에는 많은 양의 메모리가 필요하다.
    • 병합 작업을 하는 동안에는 마스터 노드의 역할, 데이터 노드의 역할에 문제가 발생할 수 있기 때문에 전체적인 노드 장애로 이뤄질 수도 있다.
  • 클러스터를 안정적으로 운영하기 위해서는 사용자의 요청은 전용 coordination Node로 구축하는 것이 좋다.

마스터 노드와 데이터 노드를 분리해야 하는 이유

전용 마스터 노드 구축

  • 운영중 무거운 쿼리가 요청되어, 데이터 노드의 부하로 시스템에 순간적으로 행이 걸리거나 노드가 다운될 수 있다.
  • 하나의 노드에 데이터 노드 Role과 마스터 노드 Role이 동시에 수행된다면, 마스터 노드의 역할을 하지 못해 레플리카에 의해 복구가 어렵다.
    • 장애 복구의 책임은 마스터에 있지만 그 역할을 수행하지 못하기 때문
    • 다른 마스터 노드에게 위임되기 위해서는 해당 마스터 노드가 아예 죽어야 하지만 데몬으로 살아있다면 마스터 후보가 있어도 전달하지 못할 수 있다.
  • 따라서 일정 규모 이상의 클러스터를 구성할 경우 마스터 노드와 데이터 노드는 분리해야 한다.

전용 Coordination 노드 구축

  • 엘라스틱서치는 집계연산을 제공하며, 이를 통계내는 것이 매우 간단하다.
  • 집계 연산에 대한 통제가 불가능한 상황에서는 시스템 전체의 장애를 방지하기 위해서 Coordination 노드를 별도로 구축해야한다.
    • 대량 데이터 처리가 필요한 집계는 반드시 전용 Coordination 노드로만 요청을 받아야 한다.
  • 집계 연산의 경우 메모리를 많이 사용하는데, 하나의 물리 서버에서 데이터 노드의 역할과 Coordination 역할이 동시에 수행될 경우 장애가 발생될 가능성이 커진다.
  • 검색/색인/집계 용도의 Coordination 노드를 운영하되, 그렇다고 너무 많은 Coordination 노드를 운영하는 것은 마스터 노드가 관리할 노드가 많아짐으로 지양해야 한다.

Cluster Split Brain 문제 방지하기

Split brain 문제

  • 전용 마스터 노드가 다수 존재하면, 1개만 마스터 노드로 동작하고 나머지 노드들은 마스터 후보 노드로 무기한 대기하게 되는데, 나중에 마스터 노드에 장애가 발생하면 대기중인 마스터 후보 노드들이 투표를 통해 마스터 노드를 선출한다.
  • 노드간 투표가 시작되기 전에 네트워크 문제로 노드간 연결이 끊어지게 된다면, 후보자를 본인만 존재한다고 생각해 마스터 노드로 등록할 수 있고, 이러한 마스터 노드들이 여럿 생길수도 있게 된다.
  • 마스터 노드가 2개가 된다면 클러스터에 존재하는 데이터 노드도 2개의 그룹으로 분리되며, 일부 샤드 조각이 존재하지 않는다고 판단해 데이터를 복구해 클러스터가 뒤죽박죽이 될 것이다.
  • 강제로 마스터 노드를 한개로 복구하더라도, 이미 유실되거나 변경된 데이터로 인해 완전 복구가 힘들다.

이러한 문제를 Split Brain 문제라고 한다.

 

discovery.zen.minimum_master_nodes 속성 설정

  • 엘라스틱서치는 이러한 문제를 해결하기 위해 elasticsearch.yml 파일에 discovery.zen.minimum_master_nodes 속성을 제공한다.
  • 기본적으로 해당 값은 1을 가진다.
  • 새로운 마스터 노드를 선출하는 투표를 진행할 경우 숫자로 지정된 갯수 만큼의 마스터 후보 노드가 반드시 존재해야한다는 의미다.
    • 클러스터의 마스터 노드가 1,2일 경우 1로 설정하고, 3개 이상일 경우 (마스터 후보 노드 수 / 2) + 1로 설정하면 된다.
  • 자신이 운영중인 클러스터의 마스터 노드는 최소 3대 이상을 유지하고 그에 따른 discovery.zen.minimum_master_nodes 속성 값을 계산해 elasticsearch.yml에 설정해야 한다.
  • 운영중에 마스터 노드를 늘려야 하는 경우 아래 API를 통해 운영중에 해당 수치를 변경할 수 있다
PUT _cluster/settings
{
  "transient": {
    "discovery.zen.minimum_master_nodes": 3
  }
}
728x90