[Elasticsearch] 동작원리, shard와 replica를 몇개로 설정해야하는가?

[Elasticsearch] 동작원리, shard와 replica를 몇개로 설정해야하는가?

이전에 이해한 개념을 바탕으로 이젠 원래 주 목적이였던 성능튜닝에 대해서 정리해보려고한다.

그 전에 es검색원리를 이해해야했다.(쉽지않다..) 검색하는데 어떤 영향이 있는지 알아아야 몇개로 설정할지 감이 잡힐테니까!

검색하는데 shard와 replicar가 어떤 영향을 미치길래 성능튜닝을 하는거지?

그래서 결국 primary shard와 replica를 몇개로 설정해야하는가?

참고로,

Replica는 나중에 변경 가능하지만, primary shard는 인덱스를 처음 생성할때만 설정할 수 있다. (변경하려면 reindex해야함)

https://localhost:9200/index명/_setting API를 통해서 primary shard와 replica 개수를 확인할 수 있다.

검색원리

일단 기본적인 원리는 "es검색은 1쿼리 1샤드 1스레드를 바탕으로 일어난다" 이다.

그리고 "쿼리->노드1 전달-> 나머지노드 전달-> 각 노드들이 샤드에게 전달, 이떄 검색스레드가 쿼리를 전달" 하는 순이다.

Case1. 샤드의 개수가 '1'일경우 '단일'쿼리

클러스터에 총 3개의 노드, 각각 노드가 1개의 샤드, 4개의 코어 즉 4개의 검색스레드 를 가지고 있는 경우

하나의 쿼리 가 들어올때 어떤 원리로 검색을 수행하는가?

하나의 쿼리가 들어온다는 가정하게 어떻게 검색이 진행되는가?

단일쿼리를 기준으로 검색원리의 순서에 따라서

먼저 사용자가 쿼리를 날리면 -> 노드c에서 받고 -> 노드c가 나머지 노드들에게 전달 -> 각노드들이 자신의 샤드에게 전달한다.

단, 이때 검색할 샤드의 수가 1개이기 때문에 4개의 스레드풀에서 1개의 스레드만 사용하게 된다.

결국 각 노드는 샤드가1개씩 있기 때문에 검색 스레드를 하나씩 사용하게 되서 나머지 3개의 스레드는 낭비하게 되는 비효율적인 상황!

Case2. 샤드의 개수가 '1'일 경우 '멀티'쿼리

그렇다면 위와 같은 상황을 예시로 동시에 여러개의 쿼리가 들어온다면? 조금더 효율적이지 않을까?

단일쿼리검색와 마찬가지로 동시에 4개의 쿼리를 날려도 검색과정은 같다.

사용자가 멀티쿼리를 날린다 하더라도 -> 노드c에서 받고 -> 노드c가 나머지 노드들에게 전달 -> 각노드들이 자신의 샤드에게 전달한다.

단, 쿼리가 4개가 들어오고 각 노드에 할당된 샤드의 수가 1개이기 때문에 4개의 스레드풀에서 4개의 스레드를 사용한다.

결국 각 노드는 샤드가1개씩 있기 때문에 쿼리하나 당 스레드를 하나씩 사용하게 되서 낭비없이 모든 스레드를 사용하는 상황

Case3. 샤드의 개수가 n일 경우 멀티쿼리 (n:코어의 개수)

그렇다면 샤드의 개수와 코어의 개수가 같다면? 그리고 거기에 동시에 여러개의 쿼리가 들어온다면? 훨씬 더 효율적이지 않을까?

마찬가지로 검색과정은 같다.

사용자가 멀티쿼리를 날린다 하더라도 -> 노드c에서 받고 -> 노드c가 나머지 노드들에게 전달 -> 각노드들이 자신의 샤드에게 전달한다.

단, 쿼리가 4개가 들어오고 각 노드에 할당된 샤드의 수가 1개이기 때문에 4개의 스레드풀에서 4개의 스레드를 사용한다.

하지만 노드별로 쿼리를 날려야할 샤드가 4개이므로 쿼리1에 대한 결과를 조회하기 위해

4개의 스레드풀에서 4개의 스레드를 모두 각각 사용해야한다.

그럼 그 뒤에 들어온 2~4번 쿼리는 1쿼리가 완료될 때까지 실행되지 못하고 스레드큐에 쌓이게 될 수 있다.

결국 2~4쿼리에 대한 응답결과가 느려지게 되고, 쿼리간의 응답속도차가 점점 벌어지게 된다.

참고

https://brunch.co.kr/@alden/39

반응형

from http://pearlluck.tistory.com/696 by ccl(A) rewrite - 2021-12-23 20:00:36