샤드(Shard) 란
인덱스가 색인되는 문서가 실제로 저장되는 공간을 의미한다.
하나의 인덱스는 반드시 하나 이상의 샤드를 가진다.
샤드는 크게 Primary shard , Replica shard로 나뉜다.
종류 | 역할 |
Primary shard | 문서가 저장되는 원본 샤드이다. 색인과 검색 성능에 모두 영향을 준다. |
Replica shard | Primary shard 의 복제 샤드이다. Primary shard 에 문제가 생기면 Replica shard 가 Primary shard 로 승격된다. |
문서의 색인과정은 Primary shard 에서 먼저 분석 과정이 이루어지고
저장이 된 다음에 해당 문서가 Replica shard 로 복제되는 구조이다.
Replica shard 의 개수보다 Primary shard의 개수가 색인 성능에 영향을 주는데,
이는 색인 과정에서 가장 리소스를 많이 소비하는 구간이
Primary shard 의 분석 구간이기 때문이다.
예를 들어 아래와 같은 상황이 발생했다고 가정해 보자.
특정 인덱스의 primary shard3와 primary shard 1의 replica shard 가 존재하는 노드에
장애가 발생한 것이다. 이럴 경우 ES는 다음과 같이 대응한다.
1) primary shard3의 replica shard를 primary shard3로 승격시킨다.
2) 새로운 primary shard3는 새로운 replica shard를 생성한다.
3) primary shard1 은 자신의 replica shard 가 사용할 수 없게 되므로 다른 노드에
replica shard 를 생성한다.
즉 아래와 그림과 같이 장애상황에 대응한다.
샤드(Shard) 설정
샤드 설정은 아래와 같은 커맨드를 통해 할 수 있다.
PUT /movie
{
"settings": {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
number_of_shard는 primary shard의 개수를 뜻하고
number_of_replicas는 replica shard의 개수를 의미한다.
여기서 헷갈리지 말아야 할 개념은
해당 movie 인덱스의 총 샤드 개수는
number_of_shard (3) + number_of_replicas (1) = 4라고 생각하는데,
이는 매우 잘못된 개념을 가지고 가는 것이다.
replica는 각 primary shard 마다 존재하는 것이기 때문에
primary shard 하나마다 replica shard 가 존재한다는 의미가 된다.
즉 총 6개의 샤드가 존재하는 것이다.
만약에 아래와 같이 movie 인덱스에 샤드설정을 했다고 해보자.
PUT /movie
{
"settings": {
"number_of_shards" : 5,
"number_of_replicas" : 2
}
}
그럼 총샤드의 개수는 number_of_shard * (number_of_replicas + 1) = 15가 된다.
샤드 라우팅 (Shard Routing)
샤드 라우팅은 문서가 샤드에 저장되는 방법/순서를 의미한다.
Es는 Routing Rule을 이용하여 문서들을 샤드에 고르게 배치한다.
Routing Rule = (문서의 id) % (프라이머리 샤드의 개수)
Routing Rule에 따라 문서가 샤드에 저장되므로
샤드의 개수가 바뀐다면 문서가 저장되는 규칙이 완전히 바뀌게 된다.
그래서 중간에 샤드의 개수가 바뀐다면 라우팅룰이 완전하게 바뀌기 때문에,
이미 샤드가 지정된 인덱스라면 프라이머리 샤드 값은 바꿀 수 없다.
(바꾸려면 reindex 방법이 있긴 하지만 이 내용은 논외로 하자.)
따라서 인덱스를 생성할 때 프라이머리 샤드의 개수를 설정하는 건 매우 중요하다.
하지만 ES를 운영할 때 인덱스를 생성할 때마다
이런 식으로 하나하나 모두 shard 설정을 해주는 것은
Schema less를 대표하는 Elasticsearch 로써 해당 db를 사용하는
취지에 맞지 않을 수 있다고 생각할 수 있다.
그래서 ES는 index template을 통해
특정 인덱스에 shard 설정을 먼저 지정해 줄 수 있다.
PUT _index_template/movie_template
{
"index_patterns": ["movie*"],
"template" : {
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
}
위와 같이 index template을 설정해 주면,
movie ~ 로 시작되는 인덱스가 생성될 때,
해당 템플릿의 샤드 설정이 적용되는 것이다.
예를 들어 movie1, movie-2022.... 등등등
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] text, keyword 타입 (0) | 2023.03.02 |
---|---|
[Elasticsearch] 검색(Search) (0) | 2023.02.28 |
[Elasticsearch] 색인 (Indexing) (0) | 2023.02.27 |
[Elasticsearch] Cluster, Node 란? (0) | 2023.02.21 |
[Elasticsearch] Elasticsearch 란? (0) | 2023.02.20 |