2019년 tistory에 작성한 내용을 velog에 이전한 내용입니다.
엘라스틱서치는 인스턴스가 시작될 때마다 노드가 시작되며 서버 단위를 노드라고 한다.
또한 연결된 노드의 묶음을 클러스터라고 하며, 클러스터의 모든 노드는 HTTP 트래픽을 처리할 수 있다.
기본적으로 노드의 종류는 Master, Data, ingest, coordinating node가 있다.
각 노드의 역할은 elasticsearch.yml에 작성한다.
마스터노드는 클러스터를 제어하는 역할을 수행하며 클러스터 내 노드를 관리하고 샤드와 레플리카를 관리한다.
인덱스의 생성 및 삭제, 데이터의 조회와 같은 요청시 어떤 데이터노드의 요청한 인덱스가 저장되어 있는지를 마스터노드에서 별도로 관리하여 각 데이터노드에 요청을 전달한다.
마스터 적격 노드가 여러대일 경우 마스터 선출 프로세스에 의해 마스터노드가 선출되며 마스터노드는 전체적인 클러스터 관리를 수행하므로 안정적으로 수행되어야만 한다.
따라서 마스터 전용 노드와 데이터 노드는 역할을 분리하는 것이 좋다.
마스터노드의 기본 포트는 9200이다.
*마스터 선출 프로세스: https://www.elastic.co/guide/en/elasticsearch/reference/7.3/modules-discovery.html
node.master: true
node.data: false
node.ingest: false
cluster.remote.connect: false
데이터노드는 CRUD와 Search, Aggreation과 같은 데이터 관련 작업을 처리한다.
이러한 작업은 I/O, 메모리, CPU와 같은 리소스를 많이 사용하므로 많은 수의 데이터노드를 사용하는 것이 좋다.
데이터노드의 기본 포트는 9300이다.
node.master: false
node.data: true
node.ingest: false
cluster.remote.connect: false
인제스트노드는 인덱스를 저장하기 전 전처리 파이프라인을 수행하는 노드이다.
Logstash를 사용할 경우 Logstash가 데이터 전처리를 수행하지만 엘라스틱서치에서 별도로 데이터 전처리를 수행할 수 있으며, 그때 사용하는 노드가 인제스트노드이다.
node.master: false
node.data: false
node.ingest: true
cluster.remote.connect: false
node.master: false
node.voting_only: false
node.data: false
node.ingest: false
node.ml: false
cluster.remote.connect: false
동일한 클러스터에 참여하는 노드는 동일한 클러스터명을 가져야하므로, elasticsearch.yml에 cluster.name을 설정하여 준다.
또한 7.0 버전으로 업그레이드되면서 discovery.seed_hosts에 클러스터에 참여하는 노드의 목록을 입력해야한다.
elasticsearch.yml 설정
- cluster.name: es-dev
- discovery.seed_hosts: ["IP1", "IP2"] (Master Node <-> Data Node 간 상태 체크를 위한 설정)
- cluster.initial_master_nodes: ["IP1", "IP2"] (서비스 시작시 선출될 Master Node를 설정)
7.0 업데이트 전에는 Split Brain을 피하기 위해 discovery.zen.minimum.master_nodes를 설정해줘야 했다.
하지만 7.X 노드에서 이 설정은 무시되며 7.0 업데이트 후 Quorum based dicision으로 마스터 노드를 결정하므로 위 설정 없이도 자동으로 Split Brain을 피할 수 있다.