검색엔진/ElasticSearch

인덱싱 성능 최적화

ZzangHo 2022. 4. 5. 13:44
728x90

정의

엘라스틱 서치 및 검색엔진을 사용하기 위해서는 데이터 색인이 먼저 되어야 한다.
프로젝트를 진행하면서 알게 된 색인에 영향을 주는 항목에 대해 정리를 해보고자 한다.

 

인덱싱 성능 최적화

 

  • Refresh_interval
    해당 옵션을 사용하게 되면 색인 성능이 올라간다. 그 이유는 엘라스틱서치는 기본적으로 준 실시간(Near Real-Time)으로 1초에 한번씩 데이터를 갱신하여 제공하고 있다.
    이 말은 1초에 한번씩 세그먼트 파일에 데이터를 쓴다는 이야기이다. 1초에 한번씩 작은단위로 세그먼트에 계속 데이터를 Write를 하다 보니 전체 색인과 같은 대량의 작업에서는 refresh_interval을 -1로 아에 옵션을 끄던지 아니면 60s나 큰 주기로 한번씩 refresh를 해주는 것이 대량의 색인 작업에서는 성능에 도움이 된다. 색인이 완료되면 다시 1s로 셋팅을 하여 색인 된 데이터들이 서비스에 반영이 되도록 해주는 것도 잊지 말자!

  • Number_of_replicas
    색인 할 때 replica 옵션을 0으로 주어 primary shard만 색인 하도록 셋팅한다. 색인 할 때 replica shard도 생성이 된다면 세그먼트 파일에 write하는 작업이 primary shard 1, replica shard 1 기준으로 두 번 일어나게 되는 것이다. replica shard 값이 증가할 수록 색인성능은 떨어지게 된다. 처음에 색인 할 때 0으로 색인 한 뒤 _settings API를 통해 replica 수를 조정하는 것이 더 효율적이다.

  • Bulk API
    당연한 말이지만 단일 건으로 요청하는 것 보다 Bulk API를 통해 대량의 document를 한번에 보내는 것이 훨씬 더 나은 성능을 제공한다.

  • Multi Thread
    Bulk API를 보내는 단일 스레드는 엘라스틱서치 인덱싱의 용량의 최대치에 도달하지 못한다. 그렇기 때문에 Multi Thread/Process 로 다수의 Bulk API를 보내야 한다. 
    하지만 보내는 요청이 너무 과하면 다음과 같은 에러가 발생할 수 있다. TOO_MANY_REQUESTS (429) 해당 에러가 발생하는지 확인해야 하며 적절한 스레드 수는 오직 테스트만이 최적의 갯수를 판단 할 수 있다.

  • 자동 생성 ID 사용
    엘라스틱서치는 문서를 색인할 때 고유한 값의 id를 자동으로 생성하는데 이것을 인덱싱할때 사용자가 생성을 할 수도 있다. 사용자가 생성을 하게 되면 해당 id가 중복인지 아닌지를 한번 검증하는 작업이 추가적으로 들어가기 때문에 자동 생성이 되도록 하는 것이 색인 성능에 도움이 된다고 한다. (나의 경우 자동 생성 ID 사용은 하지 않았다)

  • 빠른 하드웨어(SSD)
    데이터 디렉토리 공간은 HDD보다는 SSD를 사용한다. 인덱싱의 경우 I/O 작업과 관련이 있기 때문에 하드웨어 성능에 따라 색인 성능이 차이가 난다.

  • 파일 시스템 캐시에 메모리 제공
    I/O 작업을 버퍼링하기 위해 파일 시스템 캐시가 사용됩니다. Elasticsearch를 실행하는 머신의 메모리 중 적어도 절반을 파일 시스템 캐시에 제공해야 한다. 


테스트

테스트용으로 현재 개발에 있는 데이터를 색인 해보겠다.
전체 문서 는 약 5백만건 정도 되지만 실제 색인 되는 데이터는 약 250만건 정도 된다. 이는 필요한 데이터만 색인을 하였기 때문이다.


테스트 조건

  • 전체 문서 수 : 5,067,312‬건
  • 색인 된 문서 수 : 2,494,798건
  • Bulk 인덱싱
  • Multi Thread
  • ElasitcSearch Node 3대

 

Case 1) replica shard 0으로 색인

primary shard : 1
replica shard : 0
refresh interval : 60s
색인 시간 : 약 4분

Case 2) primary, replica shard 1로 색인

primary shard : 1
replica shard : 1
refresh interval : 60s
색인 시간 : 약 4분 40초

Case 3) refresh interval 조정

primary shard : 1
replica shard : 0
refresh interval : 1s
색인 시간 : 약 4분 40초

Case 4) primary 갯수 증가

primary shard : 3
replica shard : 0
refresh interval : 60s
색인 시간 : 약 4분 10초

 

위의 테스트 결과 처럼 동일한 데이터로 색인을 하여도 refresh interval과 shard(primary, replica) 수만 조정하여도 색인 성능에 영향이 끼치는 것을 볼 수 있다.

'검색엔진 > ElasticSearch' 카테고리의 다른 글

시스템 튜닝 포인트  (0) 2023.02.15
ElasticSearch vs Solr  (0) 2022.04.29
ElasticSearch 색인, 검색 노드 나누기  (0) 2022.03.23
ElasticSearch - Rolling Restart  (0) 2022.03.22
ElasticSearch - Full-cluster Restart  (0) 2022.03.21