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