프로젝트를 진행하면서 노드를 수명 주기 관리로서 해결해야할 요구사항이 생겼기에 엘라스틱 서치의 내부 구조와 용어에 대한 이해가 필요하다고 절실히 느꼈다.
어떤 좋은 티스토리에서 어떠한 문장을 봤는데
'ES 성능은 shard 개수보다 replica 개수에 영향을 준다'라는 문장이었다. 본인은 아직 shard와 replica에 대한 개념이 잡히지 않아서 왜 그런지, 내부는 어떻기에 이런지에 대한 의문이 생겨 공부하기로 했다.
1. 내부 구조
먼저 ES의 내부 구조를 살펴보면..
엘라스틱서치는 여러 개의 클러스터로 구성될 수 있다. 위의 구조처럼 하나의 클러스터를 가정을 둘 때,
하나의 클러스터에는 여러 개의 노드들이 묶여져 있는 구조를 볼 수 있다. (물론 하나의 노드도 가능) 그리고 각 노드에 데이터를 저장하는데 이를 인덱스라고 부르고, 각 인덱스에는 한 개 혹은 여러 개의 샤드로 구성된다.
2. 개념 정리
(1) cluster (클러스터)
클러스터로 묶인 노드들은 노드간 데이터 교환을 위해 http포트 (9200~9299), tcp포트 (9300~9399)를 열어둔다.
이 말은 즉, 여러 개의 노드들은 하나의 클러스터로 묶는다면 노드1에서 입력된 데이터를 노드2에서도 읽을 수 있고, 당연히 그 반대도 가능하는 말이 된다.
하지만 하나의 물리서버에 여러 개의 노드 실행이 가능하지만, 하나의 물리서버에 하나의 노드 실행을 권장한다. (과부하가 발생할 수 있음)
위의 그림이 의미하는 바는
물리적인 구성과 상관없이 여러 노드가 하나의 클러스터로 묶이기 위해선 노드들끼리 클러스터명이 같아야 한다.
같은 서버나 네트워크망에 내부에 있다 하더라고, 클러스터명이 다르면 다른 클러스터로 실행이 되고, 각각 별개의 시스템으로 인식된다.
(2) node (노드)
클러스터에 묶인 각각의 엘라스틱서치를 시작하게 되면, 노드가 생성된다.
이 노드는 동일한 네트워크상에서 클러스터가 존재하는지 확인한다. 만약 없으면, 노드사 스스로 클러스터를 생성하고, 있으면 같은 이름을 가진 클러스터에 노드를 연결한다.
(3) index (인덱스)
엘라스틱서치에서는 단일 데이터 단위를 도큐먼트(document)라고 부른다.
그리고 이 도큐먼트를 모아놓은 집합을 인덱스(index)라고 부른다.
인덱스는 기본적으로 샤드 단위로 분리되고, 각 노드에 데이터(도큐먼트)를 분산되어 저장한다.
즉, 인덱싱을 할때 노드 내부에 논리적으로 데이터 저장공간(샤드)을 만들어 나누면 이제 동시에 여러 데이터를 분산해서 저장할 수 있다.
(4) 샤드
클러스터에 노드를 추가하면 샤드들이 각 노드로 분산되고, 디폴트로 1개의 복제본들 생성한다. 이때 처음에 생성된 샤드를 프라이머리 샤드( primary shard ), 복제본 (replica)을 레플리카라고 부른다.
샤드는 일종의 파티션과 같은 의미로, 인덱스의 도큐먼트를 분산해서 저장하는 저장소라고 볼 수 있다.
그래서 샤드의 개수에 따라서 노드에 분산해서 저장소를 만들고, 거기에 도큐먼트들을 저장한다.
(5) replica (복제본)
primary shard (샤드)의 복제본.
같은 샤드와 복제본은 동일한 데이터를 담고 있으며, 반드시 서로 다른 노드에 저장이 된다.
레플리카는 프라이머리 샤드와 개수만큼 생성되며, 인덱스 생성시에만 개수를 설정할 수 있다.
예를 들어, 노드의 개수 4, 샤드의 개수 5, 레플리카의 개수 1이라면 아래와 같이 샤드와 레플리카가 분산돼서 저장된다.
샤드와 레플리카는 각각 다른 노드에 생성되고, 어파치 레플리카도 또 다른 샤드이기 떄문에 전체 샤드의 개수는 10개가 된다.
만약 노드의 개수가 1개라면???
프라미어리 샤드만 존재하고 복제본은 생성죄디 않는다.
그래서 아무리 작은 클러스터라도 데이터 가용성과 무결성을 위해 최소 3개의 노드로 구성할 것을 권장한다.
'데이터베이스 > ELK' 카테고리의 다른 글
[Elasticsearch] (error) vm.max_map_count 값 변경하기 (0) | 2022.08.19 |
---|---|
[Elasticsearch] 다른 서버에서 클러스터 구성 (노드 연동) with. docker-compose (0) | 2022.08.18 |
[ElasticSearch] 인덱스 수명 주기 관리 (Hot, Warm, Cold) (0) | 2022.08.11 |
[ELK] ELK의 REST API이해 (0) | 2022.05.21 |
[ELK] GCP환경에서 Docker로 ELK 설치 및 실행하기 (0) | 2022.05.13 |