Amazon Elasticsearch Service 클러스터에서 인덱싱 성능을 개선하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 10일

Amazon Elasticsearch Service(Amazon ES)에서 수집 처리량을 극대화할 수 있도록 인덱싱 작업을 최적화하고 싶습니다. 어떻게 해야 합니까?

해결 방법

수집하려는 인덱스의 샤드가 데이터 노드에 고르게 분산되었는지 확인합니다.

다음 공식을 사용하여 샤드가 고르게 분산되었는지 확인합니다.

Number of shards for index = k * (number of data nodes), where k is the number of shards per node

예를 들어 인덱스에 샤드 24개가 있고 데이터 노드가 8개인 경우, Amazon ES에서 각 노드에 샤드 3개를 할당합니다. 자세한 내용은 Amazon Elasticsearch Service 시작하기: 얼마나 많은 샤드가 필요합니까?를 참조하세요.

refresh_interval을 60초 이상으로 늘림

문서를 검색할 수 있도록 Amazon ES 인덱스를 새로 고칩니다. 인덱스를 새로 고치려면 스레드 인덱싱에 사용한 것과 동일한 리소스가 필요합니다.

기본 새로 고침 간격은 1초입니다. 새로 고침 간격을 늘리면 데이터 노드가 API 호출 횟수를 줄입니다. 새로 고침 간격은 새로 고침 간격에 따라 더 짧거나 빨라질 수 있습니다. 429 오류가 발생하지 않도록 하려면 새로 고침 간격을 높이는 것이 좋습니다.

참고: 기본 새로 고침 간격은 지난 30초 이내에 그 이상의 검색 요청을 수신한 인덱스의 경우 1초입니다. 업데이트된 기본 간격에 대한 자세한 내용은 Elasticsearch 웹사이트에서 _refresh API version 7.x을 참조하세요.

복제본 수를 0으로 변경

큰 인덱싱 작업이 예상되는 경우 index.number_of_replicas 값을 "0"으로 설정합니다. 각 복제본은 인덱싱 프로세스를 복제합니다. 따라서 복제본을 비활성화하면 클러스터 성능이 개선됩니다. 큰 인덱싱 작업이 완료되면 복제된 인덱스를 다시 활성화합니다.

중요: 복제본이 비활성화되어 있는 동안 노드에 장애가 발생하면 데이터가 손실될 수 있습니다. 짧은 시간 동안 데이터 손실을 허용할 수 있는 경우에만 복제본을 비활성화합니다.

최적의 대량 요청 크기를 찾기 위한 실험

5~15MiB의 대량 요청 크기로 시작합니다. 그런 다음, 인덱싱 성능이 더 이상 개선되지 않을 때까지 요청 크기를 서서히 늘립니다. 자세한 내용은 Elasticsearch 웹사이트에서 대량 요청 사용 및 크기 조정을 참조하세요.

참고: 일부 인스턴스 유형은 대량 요청이 10MiB로 제한됩니다. 자세한 내용은 네트워크 제한을 참조하세요.

SSD 인스턴스 스토어 볼륨이 있는 인스턴스 유형(예: I3) 사용

I3 인스턴스는 고속 로컬 메모리 익스프레스(NVMe) 스토리지를 제공합니다. I3 인스턴스는 범용 SSD(gp2) Amazon Elastic Block Store(Amazon EBS) 볼륨을 사용하는 인스턴스보다 뛰어난 수집 성능을 제공합니다. 자세한 내용은 I3 인스턴스를 사용하여 Amazon Elasticsearch Service에서 페타바이트 규모의 클러스터 실행을 참조하세요.

응답 크기를 줄임

Amazon ES 응답의 크기를 줄이려면 filter_path 파라미터를 사용하여 불필요한 필드를 제외하세요. 실패한 요청을 식별하거나 다시 시도하는 데 필요한 필드는 필터링하지 마십시오. 이러한 필드는 클라이언트에 따라 다를 수 있습니다.

다음 예제에서는 index-name, type-nametook 필드가 응답에서 제외됩니다.

curl -X POST "es-endpoint/index-name/type-name/_bulk?pretty&filter_path=-took,-items.index._index,-items.index._type" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test2", "_id" : "1" } }
{ "user" : "testuser" }
{ "update" : {"_id" : "1", "_index" : "test2"} }
{ "doc" : {"user" : "example"} }

자세한 내용은 응답 크기 줄이기를 참조하세요.

index.translog.flush_threshold_size 값을 늘림

기본적으로 index.translog.flush_threshold_size는는 512MB로 설정됩니다. 즉, translog가 512MB에 도달하면 플러시됩니다. 인덱싱 로드의 가중치는 트랜스로그의 빈도에 따라 결정됩니다. index.translog.flush_threshold_size를 늘리면 노드가 트랜스로그 작업을 실행하는 빈도가 낮아집니다. Amazon ES 플러시는 리소스를 많이 사용하는 작업이기 때문에 트랜스로그의 빈도를 줄이면 인덱싱 성능이 개선됩니다. 플러시 임계값 크기를 늘리면 Elasticsearch 클러스터가 (여러 개의 작은 세그먼트 대신) 몇 개의 큰 세그먼트도 생성합니다. 큰 세그먼트는 병합 빈도가 낮고 병합하는 대신 인덱싱에 더 많은 스레드가 사용됩니다.

참고: index.translog.flush_threshold_size가 커지면 트랜스로그를 완료하는 데 걸리는 시간도 증가합니다. 샤드가 실패할 경우 트랜스로그가 더 크기 때문에 복구 시간이 더 오래 걸립니다.

index.translog.flush_threshold_size를 늘리기 전에 다음 API 작업을 호출하여 현재 플러시 작업 통계를 가져옵니다.

$ curl 'es-endpoint/index-name/_stats/flush?pretty'

es-endpointindex-name을 해당 변수로 바꿉니다.

출력에서 플러시 수와 총 시간을 기록해 둡니다. 다음 예제 출력에서는 플러시가 124개로, 17,690ms가 걸린 것으로 나타났습니다.

"flush" { "total" : 124, "total_time_in_millis" : 17690 }

플러시 임계값 크기를 늘리려면 다음 API 작업을 호출합니다.

$ curl -XPUT 'es-endpoint/index-name/_settings?pretty' -d '{"index":{"translog.flush_threshold_size" : "1024MB"}}'

이 예제에서는 플러시 임계값 크기가 1,024MB로 설정되어 있으며, 이는 32GB 이상의 메모리가 있는 인스턴스에 적합합니다.

참고: Amazon ES 도메인에 적절한 임계값 크기를 선택하세요.

_stats API 작업을 다시 실행하면 플러시 활동이 변경되었는지 확인하세요.

$ curl 'es-endpoint/index-name/_stats/flush?pretty' 

참고: 현재의 인덱스에 대해서만 index.translog.flush_threshold_size를 늘리는 것이 좋습니다. 결과를 확인한 후, 변경 사항을 인덱스 템플릿에 적용하세요.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?