Post

Elasticsearch 노드와 통신: 기능과 역할별 분류

통신 모듈의 종류와 특징, 마스터/데이터/인제스트/코디네이터 노드의 역할과 운영 방식

Elasticsearch 노드와 통신: 기능과 역할별 분류

1. 통신 모듈

1-1. 전송 모듈

  • 클러스터 내부 모듈 간의 통신에 사용
  • 노드 간 데이터를 분산 처리하는 구조에 적합
  • 기본 포트: 9300 ~ 9399

1-2. HTTP 모듈

  • 엘라스틱 API에서 제공하는 형태로 외부 클라이언트 앱과 통신 시 사용함
  • 기본 포트: 9200 ~ 9299



2. 역할별 노드 종류

물리 서버 하나에 노드 하나를 구성하는 방식을 권장하지만, 단일 서버에 복수의 노드를 설치할 수도 있다. 클러스터에 참여하는 노드 이름은 중복돼서는 안 되며, 노드는 역할에 따라 업무가 달라지는데 하나의 노드가 여러 역할을 할 수 있다.


2-1. 마스터 노드

클러스터는 반드시 하나의 마스터 노드를 가져야 한다.

  • 마스터 노드의 역할
    • 마스터 노드는 인덱스의 설정, 매핑 정보와 물리적 위치, 이 외에도 클러스터 설정 정보나 인덱스 템플릿 정보 등 클러스터의 모든 상태 정보를 관리
    • 각 노드들과 통신하며 클러스터의 변화를 모니터링
  • 마스터 노드 선출
    • 마스터 노드는 사용자가 정할 수 없고 다수의 마스터 후보 노드가 투표를 통해 결정
    • 사용자는 마스터 후보 노드만 지정할 수 있다
    • 클러스터 내부에서 (N/2 + 1) 표를 얻은 마스터 후보 노드가 과반수에 의해 마스터 노드가 된다
    • 마스터 후보 노드는 자기 자신에게 투표할 수 있다
  • 스플릿 브레인
    • 네트워크 장애 등으로 클러스터가 분리되었을 때 나누어진 각각의 서브 클러스터가 서로 마스터 노드를 선출하고 독립적인 클러스터로 동작하는 상태
    • 스플릿 브레인이 발생하면 독립된 클러스터에서 각각 요청을 처리하게 되고 클러스터 상태나 인덱싱된 데이터 등에 차이가 생겨 추후 시스템이 합쳐질 때 동기화 문제가 발생할 수 있다
    • Elasticsearch 7.0 이후 버전부터 마스터 노드 선출 알고리즘 변경으로 minimum_master_node를 직접 지정하지 않기 때문에 스플릿 브레인은 발생하지 않는다
  • 투표 전용 노드
    • Elasticsearch 7.3 버전부터 마스터 후보 노드 중에서 마스터 노드를 선정하는 투표에는 참여하지만 실제 마스터 노드가 되지는 않는 투표 전용 노드가 추가


2-2. 데이터 노드

  • 데이터 노드는 인덱싱한 도큐먼트를 샤드 형태로 저장하여 데이터의 CRUD 작업과 검색, 집계 작업을 한다.
  • 실질적인 데이터 프로세싱 작업이 일어나기 때문에 일반적으로 노드 중 가장 많은 부하를 받는다.
  • 데이터 노드의 부하로 인해 마스터 노드의 성능이 떨어질 경우 클러스터 전체의 안정성에 영향을 미치므로 마스터 노드는 클러스터의 상태만 관리하고 데이터 노드는 데이터 처리만 하는 것이 좋다
  • 데이터 노드는 컴퓨터 리소스 사용량에 민감하기 때문에 모니터링하면서 부하 상태를 체크하고 상황에 맞춰 명시적으로 샤드를 재분배하거나 데이터 노드 추가/변경 작업이 필요


2-3. 인제스트 노드

  • 인제스트 노드는 도큐먼트의 가공과 정제를 위한 인제스트 파이프라인이 실행되는 노드
  • 로그스태시의 필터와 기능적으로 유사하나, 실행 주체가 엘라스틱서치라는 점과 지원되는 기능에 일부 차이가 있다
  • 모든 노드는 기본적으로 인제스트 노드 역할을 수행할 수 있으나, 데이터 가공을 많이 하는 시스템이라면 별도의 인제스트 전용 노드를 구성하는 것이 좋다
  • 인제스트 노드는 프로세서의 집합인 파이프라인으로 구성
  • 프로세서는 도큐먼트를 변형할 수 있는 기능적으로 구분되는 모듈
    • 특정 구분자를 이용해 도큐먼트를 쪼개거나 조건에 맞춰 도큐먼트를 버리거나 변경하는 동작을 할 수 있다
    • 프로세서의 종류와 순서에 따라 파이프라인의 성격이 달라진다


2-4. 코디네이터 노드

  • 코디네이터 노드는 REST API 요청을 처리
  • 사용자 요청 작업을 받아서 각 노드들에 전달하고 취합해 결과를 제공하는 역할을 한다
  • 코디네이터 작업이 많은 서비스의 경우 전용 코디네이터 노드를 두어 데이터 노드의 부하를 줄이고 검색 효율을 높이는 것이 좋다
    • 코디네이터 전용 노드는 로드밸런싱, 요청 라우팅, 요청 캐싱 그리고 각 데이터 노드에서 계산도니 결과에 대한 취합에 온전히 집중할 수 있다
  • 기본적으로 모든 노드가 코디네이터 노드 역할을 수행할 수 있다


2-5. 전용 노드

  • 노드들은 기본적으로 다양한 역할을 수행할 수 있다
  • 기본적으로 노드에 엘라스틱서치를 설치하고 설정 파일을 수정하지 않으면 그 노드는 모든 역할을 수행
    • 대규모 시스템에서 마스터 노드와 데이터 노드를 하나로 구성하면 잠재적인 문제의 원인이 된다
    • 그래서 노드별로 하나의 역할을 수행하는 전용 노드로 클러스터를 구성하면 시스템의 성능과 안정성, 비용 면에서 좀 더 효율적으로 활용할 수 있다
  • 전용 노드 설정
    • elasticsearch.yml
      1
      
      node.roles: [ master, data, data_content, data_hot, data_warm, data_cold, ingest, ml, remote_cluster_client ]
      
    • 전용 노드 설정값
    노드 타입node.roles
    마스터 전용 노드[ master ]
    투표 전용 노드[ master, voting_only ]
    데이터 전용 노드[ data ]
    인제스트 전용 노드[ ingest ]
    머신러닝 전용 노드[ ml ]
    코디네이터 전용 노드[ ]
  • 전용 노드 하드웨어 권장 사항

    노드 타입CPU메모리저장장치
    마스터 후보 전용 노드저사양저사양저사양
    데이터 전용 노드고사양고사양고사양
    인제스트 전용 노드고사양중간 사양저사양
    코디네이터 전용 노드저사양중간 사양저사양
    • 마스터 후보 전용 노드는 클러스터의 상태 관리가 주 역할이기에 하드웨어 성능이 중요하지 않음
    • 데이터 전용 노드는 빈번한 I/O 작업과 연산 작업이 필요하기 때문에 고사양 하드웨어로 구성하고, 가능하면 전용 노드로 사용하는 것을 권장
    • 인제스트 전용 노드는 데이터 수집이 목적이기 때문에 연산 작업에 비해 저장장치는 크게 중요하지 않다
    • 코디네이터 전용 노드는 API 요청의 부하를 분산하는 역할이기에 일반적으로 특별히 고사양의 하드웨어가 필요하지는 않다. 다만 요청량이 많을 경우에는 메모리를, 무거운 집계 요청이 잦은 경우에는 CPU를 더 많이 할당하면 도움이 된다
This post is licensed under CC BY 4.0 by the author.