엘라스틱서치 작동 방법!
엘라스틱 서치는 성능과 검색 품질을 향상하고, 확장성과 가용성 향상을 위한 인프라 구조의 최적화
엘라스틱 서치는 write 작업시 일관성을 유지하기 위해, 모든 업데이트 액션은 우선 마스터 노드에서 수행된 후에 secondary node로 복제된다.
다중 노드로 구성된 클러스터에서는 마스터 노드가 죽으면 마스터 자격이 있는(matser-eligible)노드가 새로운 마스터 노드로 선출된다.
엘라스틱서치 노드에는 중요한 두가지 노드가 있다.
바로 데이터가 없는 노드(non-data node)와 데이터를 포함하는 노드이다.
데이터가 없는 노드는 REST 응답을 비롯한 그 밖의 모든 검색 작업을 처리할 수 있다.
모든 액션 실행 시, 일반적으로 엘라스틱서치는 Map/Reduce 처리 방법을 이용해 액션을 수행한다.
데이터가 없는 노드는 기본 샤드(Map)에 액션을 분산하고 최종응답을 보낼 수 있도록, 샤드 결과 수집/집계(Reduce)를 책임진다.
패싯(Pacet), 집계(aggregation), 수집 결과와 캐싱 같은 작업을 하기 위해 많은 양의 RAM을 사용할 수 있다.
데이터 노드는 데이터를 저장할 수 있으며 루씬 색인처럼 색인된 도큐먼트를 저장한 색인 샤드를 포함한다.
엘라스틱서치 노드가 실행될 때 많은 필수 서비스가 자동으로 실행된다.
가장 중요한 서비스는 다음과 같다.
- 클러스터 서비스 : 클러스터 상태, 노드간의 통신, 동기화를 관리한다
- 색인 서비스: 모든 활성화 색인과 샤드를 초기화하는 색이 작업을 모두 관리한다
- 매핑 서비스: 클러스터에 저장된 도큐먼트 타입을 관리한다
- 네트워크 서비스 : HTTP REST 서비스(9200)와 내부 ES 프토토콜(9300)같은 서비스가 있다. 쓰리프트(Thrift) 플러그인을 설치하면 쓰리프트 서버(9500 포트)를 적용할 수 있다.
- 플러그인 서비스: 사용자 정의 방식을 이용해 엘라스틱서치의 기본 기능을 확장할 수 있다
- 리버 서비스: 엘라스틱서치 클러스터 내에서 동작하는 플러그인 서비스로서, 데이터를 얻은 후(또는 데이터를 푸시 받은 후) 엘라스틱 서치 클러스터에 색인한다.
- 언어 스크립트 서비스 : 엘라스틱 서치를 지원하는 새로운 언어 스크립트를 추가할 수 있다.
Index는 하나 이상의 replica를 가질 수 있다.
샤드가 주요 복제본이면 primary shard라 불리고, 보조 복제본이면 secondary shard라 불린다.
쓰기 작업 시 일관성 유지를 위해 다음과 같이 작업이 진행된다.
- primary shard에서 쓰기 작업이 수행된다.
- primary shard에 쓰기가 성공적이면, 모든 secondary shard에 동시에 전파된다.
- primary shard가 사용 불가능하다면, secondary shard 중 하나를 primary shard로 선출하고 작업 흐름이 재실행된다.
클러스터 내에 replica가 있다면, 검색 성능을 높이기 위해 primary shard와 secondary shard 중 유효한 샤드 집합이 무작위로 선출된다.
엘라스틱서치는 노드와 샤드를 잘 분산하기 위해 다양한 할당 알고리즘을 적용한다.
신뢰도를 높이기 위해, 한 노드가 사용 불가능한 상태가 되면 데이터를 분산해 복제본을 할당한다.
따라서 남아있는 노드에서 동작하는 모든 샤드는 적어도 하나의 복제본이 항상 존재한다.