ElasticSearch의 클러스터는 여러개의 노드로 이루어진다.
노드는 내부 통신과 외부 통신등 통신 모듈이 여러개 있다.
내부 통신에는 전송 모듈을 사용하고 외부 통신 Rest API는 HTTP를 쓴다.
전송모듈
HTTP모듈
노드란?
엘라스틱서치의 클러스터를 구성하는 하나의 인스턴스다. 하나의 논리적인 서버로 구성되어 데이터를 저장하고 인덱싱과 검색 기능에 관여한다. 서버 하나에 1개의 노드를 구성하는걸 추천하지만 복수의 노드 사용도 가능하다. 이름은 유니크해야하며 하나의 노드가 여러 역할을 할 수 있다.
마스터 노드
클러스터는 반드시 하나의 마스터 노드를 갖는다. 마스터 노드는 인덱스의 설정, 매핑 정보와 물리위치, 클러스터 설정 정보나 인덱스 템플릿 정보등 클러스터의 모든 상태 정보를 관리한다. 만약 마스터 노드가 없다면 클러스터는 멈춘다. 마스터 노드는 사용자가 직접 지정할 수 없고 후보중 투표로 결정된다.
N/2 + 1 이 과반수가 되고 해당 수만큼 투표를 받으면 마스터 노드가 된다. 그러다가 만약 해당 마스터노드가 네트워크 문제등으로 연결이 끊기면 다시 새로 뽑는다. 새로 뽑고 난후 다시 고장난 노드가 정상이 되어도 재선출을 하지 않는다.
스플릿브레인
네트워크 장애등으로 클러스터가 분리되었을때 나누어진 클러스터에서 각각 마스터 노드를 선출하고 독립적인 클러스터로 작동하는 상태다. 결국 동기화 문제가 발생하게 된다. 하지만 7.0 이상버전 부터는 노드 선출 알고리즘 변경으로 해당 문제가 발생할 일은 없다. 만약 짝수개로 마스터 후보 노드를 선정하면 나중에 데이터 정합성, 무결성이 무너지는 스플릿 브레인 문제가 발생함.
투표전용노드
마스터 노드가 될 수는 없지만 마스터 노드 투표를 할 수 있게 된다. 마스터 후보 노드들이 대량으로 장애가 발생했을때 시스템이 멈추지 않고 동작하게 도와준다.
데이터노드
마스터노드와 분리하자. 부하가 생기기 때문이다. 주로 CRUD 작업, 검색, 집계 작업이 발생한다.
Document Update 지양
update시 검색 -> 삭제 -> 수정된 도큐먼트 리인덱싱 순으로 작업이 일어난다. 삭제된 도큐먼트는 세그먼트 머지 발생전까지 ID만 내부적으로 기록해뒀다가 검색시 필터링하기 때문에 검색 성능에 좋지 않다. 따라서 도큐먼트 업데이트는 가급적 피하는게 좋다.
프로세서
프로세서는 파이프라인을 구성하는 요소이다. 도큐먼트를 원하는 형태로 변경할 수 있는 기능을 제공하는 컴포넌트들이다. 주로 사용되는 프로세서는 date, drop, grok, set, split이 있음.
코디네이터 노드
해당 노드와 데이터 노드는 분리하는게 좋다. 두가지 역할을 다 할 수 있지만 노드의 부하를 줄이고 검색 효율을 높이기 위해!
규모가 크고 복잡한 검색이나 집계 요청이 많다면 코디네이터 노드를 전용으로 두는게 좋다.