아빠는 개발자

[es] 엘라스틱서치 샤드 최적화 본문

Elastic/elasticsearch

[es] 엘라스틱서치 샤드 최적화

father6019 2024. 6. 29. 20:01
728x90
반응형

검색 과정

  • Elasticsearch 의 검색은 1 Query, 1 Shard, 1 Thread를 바탕으로 이루어짐
    • 노드는 샤드를 1개씩 가지고 있다 
    • 노드는 4개의 코어를 가지고 있다

이 경우 검색 쓰레드 풀에 4개의  검색 Thread를 가지고 있게 된다. 

 

레플리카 샤드의 수에는 trade-off 관계가 있다.

  • 레플리카가 많아질 수록 색인 성능은 떨어지고, 읽기 성능은 좋아진다.
  • 반대로 레플리카가 적으면 색인 성능은 좋지만, 읽기 성능은 떨어진다.

그럼 샤드수를 늘리면 읽기 성능이 좋아니지 많을 수록 좋은거 아니냐.. 

 

클러스터 내 너무 많은 수의 샤드가 있는 경우

  • 클러스터에 존재하는 모든 샤드는 마스터 노드에서 관리하며, 샤드가 많아질수록 마스터 노드의 부하도 같이 증가
  • 이로 인해 마스터 노드의 부하가 증가하면 검색이나 색인도 같이 느려질 수 있음
  • 또한 마스터 노드의 메모리 사용량도 비례해서 증가
    • 마스터 노드는 빠른 처리를 위해 샤드 정보와 같은 관리 데이터를 모두 메모리에 올려놓기 때문
  • 마스터 노드에 장애 발생 시 클러스터 전체가 마비될 수 있음
마스터 노드의 역할
1. 모든 노드와 샤드를 관리
2. 평소 노드 상태 모니터링 하며, 색인 요청에 대한 라우팅 처리 및 검색 요청에 대한 부하 분산 수행
3. 장애 발생 시 레플리카를 이용해 샤드 복구 수행

 

이렇게 될 수 있다. 

 

위의 케이스의 경우 하나의 쿼리에 대한 검색을 수행하기 때문에 나머지 3개의 Thread 들이 놀고 있다.  그럼  core 수만큼 샤드를 늘려볼까?

 

 

데이터는 4개의 샤드가 나눠가졌을꺼고 4개의 Thread 들이 동시에 검색 검색을 수행하기때문에 읽기 성능은 개선되어 응답속도는 올라갔을것이다. 

 

그렇다면 동시에 2개의 쿼리가 인입된다면?

 

 

Thread 4개를 다 쓰고 있으니 Queue  첫번째 쿼리가 완료 될때까지 대기 하게 된다.

 

그렇다면 수십개의 쿼리가 동시에 인입된다면?

 

쿼리를 대기하는 시간이 늘어남에 따라 쿼리 결과 시간이 늘어나 쿼리간의 응답시간 차이가 나게 되고 Queue 가 꽉차면 rejected현상이 나타나게 될 것이다. 

 

그렇다면 샤드가 1개일때 4개의 쿼리가 인입된다면?

Thread 4 개가 동시에 같은 결과를 반환하게 될 것이다. 

 

Shard 가 1개면 단일쿼리에서는 응답속도가 느릴 수 있으나 동시에 많은 쿼리 인입시 고른 성능을 보여줄 수 있다. 

Shard 수가 많으면 단일쿼리에서 빠른성능을 보이지만 동시에 많은 쿼리가 인입 될 경우 쿼리별로 성능의 차이가 나타날 수 있다. 

고려사항 

  • cluster 전체 데이터 크기
  • 최대 동시 인입 쿼리 수
  • 검색 응답시간
  • 하드웨어 스팩
728x90
반응형