-
[Elasticsearch] 색인 속도 향상 방법(asyncIndex, bulk index api, refresh interval)Elasticsearch 2020. 8. 11. 20:52
1. _all field disable
- 필드 이름을 지정하지 않고 검색할 때 사용되는 필드
- 도큐먼트의 모든 필드의 value를 하나로 합쳐서 가지고 있는 필드이기 때문에 field 수가 많아지면 _all field 크기가 너무 커짐
- _all field는 text type으로 간주되어 색인 시 analyze 대상이 되므로 색인 속도가 느려짐
2. dynamic mapping disable
- dynamic mapping 시 문자열 필드의 경우 keyword 타입, text 타입 2개의 타입을 가지는 멀티 타입 필드로 생성됨
- text type의 경우 색인 시 analyze 대상이 되므로 색인 속도가 느려짐
3. refresh interval 늘리기
- 색인 된 데이터는 Lucene 내부의 세그먼트라는 단위로 저장됨
- 모든 세그먼트는 특정 주기마다 하나의 큰 세그먼트로 merge되는데 이것이 refresh interval
- default는 1초, 60초~120초정도로 늘린다면 유의미한 성능 향상 가능
4. primary shard 개수 조절
- 색인될 때 여러 샤드로 분산되어서 저장
- 색인 과정이 병렬로 수행되기 때문에 샤드가 많으면 분산 처리되어 유리
- 너무 많아지면 오히려 더 느려짐
- 테스트를 통해 적절한 개수를 찾아야 함
5. bulk index 사용
- 많은 양의 데이터를 모아서 한 번에 index하는 bulk index 사용
- bulk size만큼 데이터가 모이지 않는다면 index 되지 않는 단점이 있음, 이럴 경우엔 timeout을 거는 등의 추가적인 방법 필요
6. multi thread 사용
- 여러개의 스레드를 만들어 병렬로 index 수행
7. async index 사용
- default index 방식은 sync 방식, 모든 샤드(레플리카 샤드 포함)로부터 색인이 완료되었다는 ack를 받는 동안 block 상태
- async index 사용 시 block되지 않고 ES 내부의 index queue에 모든 요청을 던져버림
- index 실패 시 데이터 유실 염려가 있으므로 callback 함수에서 실패했을 경우에 대한 handling 필요
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] query, aggregation size 변경 (0) 2020.08.11 [Elasticsearch] indexAsync 사용 시 2번째 파라미터 찾을 수 없는 문제 (0) 2020.08.11 [Elasticsearch] Java Rest Client 사용 시 버전 충돌 문제 (0) 2020.08.11 [Elasticsearch] Mapping시 유의사항(dynamic mapping, _all field, text, keyword) (0) 2020.08.11