3. 시스템 구조
- 엘라스틱서치는 항상 클러스터로 동작한다.
- 1개의 노드만 있어도 클러스터로 구성된다.
클러스터 구성
- 9200~9299: 클라이언트와 통신하기 위한 http 포트
- 9300~9399: 노드 간 데이터를 교환하기 위한 tcp 포트
- 물리 서버마다 하나의 노드를 실행하는 것을 권장한다.
- 같은 물리 서버 내라고 해도 cluster.name이 같아야 같은 클라이언트로 인식한다.
bin/elasticsearch -Ecluster.name=~ -Enode.name=~
으로 실행 시 옵션을 지정한다.- 엘라스틱서치 실행 후 로그에서 포트 바인딩 정보를 확인할 수 있다.
- 모든 클러스터에는 반드시 하나의 마스터 노드가 존재한다.
디스커버리
- 같은 서버, discovery.seed_hosts에 설정된 네트워크 상의 다른 노드들을 찾아 같은 클러스터로 바인딩하는 과정이다.
- discovery.seed_hosts에서 호스트들을 찾아서 cluster.name이 같으면 바인딩되고, 없으면 새로운 클러스터로 시작한다.
- 처음 탐색할 노드 3~5개만 설정해도 문제없이 클러스터가 바인딩된다.
- 처음 탐색 대상 노드는 먼저 가동중이어야 한다.
인덱스와 샤드
- 도큐먼트: 단일 데이터 단위
- 인덱스: 도큐먼트를 모아놓은 논리적 집합
- 인덱스는 샤드라는 단위로 분리되어 각 노드에 분산저장된다.
- 샤드: 인덱스의 도큐먼트를 분산하여 저장하는 저장소
- 인덱스는 엘라스틱서치 7.0부터 default로 1개의 샤드로 구성되며, 이하 버전은 5개로 구성된다.
- 저장 뿐만 아니라 검색도 샤드 별로 분산되어 검색된다.
- 샤드 개수에 비례해서 시스템 자원을 사용하므로 적절한 개수를 유지하는 것이 좋다.
- 노드가 추가되면 샤드들이 노드들로 분산된다.
- 프라이머리 샤드: 처음 생성된 샤드이다.
- 리플리카(복제본) 샤드: 프라이머리 샤드를 복제하여 다른 노드에 저장한다. 단일 노드일 경우 리플리카는 생성되지 않는다
- 프라이머리 샤드와 리플리카는 같은 데이터를 담고 있으며 반드시 서로 다른 노드에 저장된다.
- 노드 유실 시 유실된 샤드는 자동으로 복제된다.
- 프라이머리 샤드가 유실될 경우 리플리카가 프라이머리로 승격되며, 복제본이 새로 생성된다.
- 샤드 개수는 인덱스 생성 시 결정하며 변경 불가능하다.
- 인덱스 5개, 복제본 1개 설정 시 10개의 샤드가 생성된다.
마스터 노드와 데이터노드
- 마스터노드: 인덱스의 메타데이터, 샤드의 위치와 같은 클러스터 상태 정보를 관리한다. 클러스터 내 유일하다.
- Master Eligible Node: 마스터 노드가 될 수 있는 후보 노드 node.master로 설정하며 default는 true이다.
-
node.master: true #node.data: false (해당 노드를 마스터 노드로만 사용할 경우)
- 마스터 노드는 키바나에서 별 표시로 나타난다.
- 데이터노드: 마스터가 아닌 노드. 데이터 처리에만 집중한다.
-
node.master: false node.data: true
- Split Brain: 마스터 후보 노드가 짝수일 때 마스터 후보 노드간 연결이 끊어질 경우 각자 다른 클러스터로 동작하는 문제
- 마스터 후보 노드 개수는 항상 홀수로 지정하자.
- 전체 마스터 후보 노드 중 과반 이상의 노드가 있는 상태일 때만 동작하도록 설정하자.
discovery.zen.minimum_master_nodes: (전체 마스터 후보 노드 개수/2)+1