0. 이 글을 작성하는 이유
ElasticSearch의 사용법을 알기 위해서는 어떤 구조로 이루어져 있는지 간략하게는 알고 가야 할 것 같아서 정리하기 위함
주요 참고 : https://www.youtube.com/watch?v=JqKDIg8fgd8
1. 파트
Index : Document의 집합으로 RDBMS에서의 Database에 해당함.
Indices : ElasticSearch에서는 Index의 집합
Cluster : 독립된 ElasticSearch의 시스템 환경, Cluster가 여러 개더라도 서로 독립된 데이터를 가짐
Node : 실행 중인 ElasticSearch 시스템 프로세스
Document : 저장된 데이터 단위
Shard : Document들에 대한 색인과 검색을 진행하는 작업 단위
이 그림의 경우 Books와 Authors가 각각 하나의 Index이고 이 묶음이 Indices이다.
요약은 이렇게 할 수 있을 것 같다.
Document들은 Shard 내에 저장되며, Shard들은 Index 안에 존재한다.
하나 이상의 Index(즉 Indices)가 Node에 위치해 있으며, 여러 Node가 모여서 Cluster를 형성한다.
2. Shard
Primary shard와 Replica shard로 이루어져 있다.
각 Shard들은 클러스터 내 노드들에 분산되어 저장한다.
같은 Primary Shard와 Replica Shard는 같은 데이터셋(Documents)을 담고 있으며 반드시 서로 다른 노드에 저장된다.
Data node가 1개인 경우 Replica Shard가 생성되지 않는다.
Replica Shard가 존재하여 무결성을 유지한다. 만약 Node가 삭제되면 남아있는 Shard의 데이터를 다른 노드에 Primary Shard와 Replica Shard를 만든다.
각 Index의 Settings를 통해 Shard의 Primary Shard와 Replica Shard의 수를 설정할 수 있다.
다만 Replica Shard의 수는 런타임 중 변경이 가능하지만 Primary Shard는 처음 Index 생성 시점에서 설정 이후 변경이 불가능하다.
데이터 색인 시 모든 Shard에 RR(Round Robin)방식으로 입력한다.
사용자는 어떤 도큐먼트가 어떤 샤드에 적재되는지 알 수 없고 알 필요도 없다.
그래서 데이터를 입력에 대한 예제로 살펴보면
PUT books/_doc/200 → hash(200) = 3
PUT books/_doc/432 → hash(432) = 6
books라는 인덱스에 id를 200으로 걸고 입력을 하면 내부적으로 Hashing을 진행하여 각각의 Shard에 RR방식으로 입력하게 된다.
3. 검색
그렇다면 검색을 할 때는 어떻게 될까
최초에 검색 요청을 받은 Node를 Coordinate Node라고 한다.
- Coordinate Node가 다른 노드로 검색 요청을 보낸다.
- 요청을 받은 Node들은 Shard를 검색한다.
- 이렇게 검색한 결과를 다시 Coordinate Node로 보낸다.
- Coordinate Node가 결과를 취합한 후 Client에 Response를 준다.
설정은 index.number_of_shards로 진행한다.
Multitenancy
ElasticSearch에서는 Multitenancy기능을 지원한다.
서로 다른 인덱스를 묶어서 한꺼번에 검색이 가능하다.
쉼표로 나열하거나 와일드카드를 사용해서 패턴화 하여 진행한다.
GET books, authors/_search // books와 authors에서 찾는다.
GET register-books-*/_search // register-books- 로 시작하는 모든 index에서 찾는다.
4.Oversharding
Shard개수가 많은 경우 Oversharding이 발생하여 응답이 늦어지거나 불안정해질 수 있다.
5. 마치며
다음 글에서는 Alias API에 대해 정리해보도록 하겠습니다.
'ELK' 카테고리의 다른 글
ElasticSearch docker로 설치하기 (0) | 2023.09.08 |
---|