Amazon Elasticsearch Service 클러스터에서 삭제된 문서 지표가 많은 이유는 무엇입니까?

최종 업데이트 날짜: 2020년 7월 14일

Amazon Elasticsearch Service(Amazon ES) 클러스터에서 문서를 삭제했지만 디스크 공간이 회수되지 않습니다. 더 많은 디스크 공간을 확보하려면 어떻게 해야 합니까?

간략한 설명

Amazon ES에서 DeletedDocuments 지표는 삭제 표시된 문서 수를 나타내는 카운터입니다. 삭제 요청이 처리되고 인덱스 세그먼트가 Elasticsearch 클러스터에 병합된 후에 지표가 증가합니다.

Amazon ES는 정기 정리 중에 강제 병합 작업을 자동으로 실행합니다. 강제 병합 중에는 기존 세그먼트가 새 세그먼트로 병합되고 기존 세그먼트도 새 요청으로 기록됩니다. 강제 병합으로 문서를 완전히 삭제하지는 않지만 Elasticsearch 클러스터에 있는 인덱스 세그먼트 수를 줄여 디스크 공간을 절약합니다.

인덱스 메타데이터를 유지하면서 Elasticsearch 클러스터에서 디스크 공간을 회수하려면 다음과 같은 방법을 고려하십시오.

개별 문서를 삭제하는 대신 인덱스를 삭제하여 디스크 공간을 즉시 회수할 수 있습니다. 인덱스를 삭제해도 삭제 마커가 생성되지 않습니다. 이에 따라 디스크 공간이 즉시 회수됩니다.

해결 방법

삭제된 문서 수 확인

Elasticsearch 클러스터에서 삭제된 문서 수를 확인하려면 클러스터 통계 API를 실행합니다. 클러스터 통계 API 호출로 얻은 값은 Elasticsearch 클러스터의 DeletedDocuments 지표에 나타납니다.

Elasticsearch 클러스터에 있는 모든 인덱스의 삭제된 문서 합계가 결과로 반환됩니다. 이 값은 응답 출력의 "docs.deleted" 필드를 사용하여 확인할 수 있습니다.

예를 들어 클러스터에 인덱스 3개(index1, index2, index3)가 있으면 인덱스 통계 API 호출을 실행할 수 있습니다.

GET index1/_stats
…
"docs" : {
        "count" : 100,
        "deleted" : 1
      }
… 
GET index2/_stats
…
"docs" : {
        "count" : 100,
        "deleted" : 5
      }
… 
GET index3/_stats
…
"docs" : {
        "count" : 100,
        "deleted" : 8
      }
… 

그런 다음, 클러스터 통계 API 호출로 Elasticsearch 클러스터에 있는 모든 인덱스의 "docs.deleted” 필드를 추가합니다.

…
"docs" : {
      "count" : 1227677521,
      "deleted" : 14
    } 
…

index2를 삭제하면 클러스터 통계 API 호출에서 index1과 index3에 대한 값만 계산합니다.

GET _cluster/stats
…
"docs" : {
      "count" : 1227677521,
      "deleted" : 9 
    } 

이제 세그먼트가 병합되고 index2의 인덱스 메타데이터가 삭제됩니다. 그 결과, DeletedDocuments 지표 값이 9로 감소합니다.

문서 용량 확인

문서 용량과 인덱스 개수를 확인하려면 용량 인덱스 API를 사용하세요. 새 문서가 용량이 Elasticsearch 클러스터의 기존 문서와 동일한지 확인하세요. 문서 용량이 동일해야 삭제된 문서가 추가로 디스크 공간을 차지하지 않습니다. 대신 Amazon ES가 백그라운드에서 작동하면서 디스크 공간을 확보하고, 세그먼트를 병합해 삭제된 문서를 자동으로 제거합니다.

삭제된 문서 제거

디스크 공간을 수동으로 회수하려면 only_expunge_deletes 파라미터를 "true"로 설정해 강제 병합 API를 실행합니다.

POST /<index-name>/_forcemerge?only_expunge_deletes=true

강제 병합을 실행하면 오래된 세그먼트가 새 세그먼트로 병합되고 Amazon ES가 삭제된 문서를 자동으로 제거합니다. 강제 병합 이후에는 사용 중인 디스크 공간이 감소하게 됩니다. 새 세그먼트가 생성되면 오래된 세그먼트는 제거됩니다. 자세한 내용은 Elasticsearch 웹사이트에서 Lucene의 삭제된 문서 처리를 참조하세요.

Elasticsearch 클러스터에서 문서 수 줄이기

Elasticsearch 클러스터에서 (쓰기 작업을 비활성화하지 않고) 문서 수를 줄이려면 강제 병합만 사용하세요. 하지만 다음 사항에 유의해야 합니다.

  • 여유 스토리지 공간이 충분할 경우에만 Elasticsearch 클러스터에 강제 병합을 실행하세요. 이 작업은 리소스를 많이 사용합니다.
  • 강제 병합 작업은 I/O를 많이 사용하는 프로세스를 트리거하며, 병합이 완료될 때까지 클러스터에 대한 모든 새로운 요청을 차단합니다.
  • 강제 병합 작업은 추가적인 데이터를 인덱스에 기록하지 않을 때 읽기 전용 인덱스에 대해서만 호출해야 합니다. 강제 병합을 읽기/쓰기 인덱스에 대해 호출하면 매우 큰 세그먼트가 생성될 수 있습니다(세그먼트 1개당 5GB 이상). 그러면 나중에 자동 병합 정책에 따라 병합할 때 해당 세그먼트 대부분이 삭제된 문서로 구성될 때까지 이를 고려하지 않습니다. 따라서 디스크 사용량은 증가하고 검색 성능이 저하됩니다.

또한 쿼리로 삭제 API 또는 삭제 API를 사용하여 Elasticsearch 클러스터의 문서를 수동으로 삭제할 수 있습니다.

디스크 공간 즉시 회수

디스크 공간을 즉시 회수하려면 인덱스 삭제 API를 사용하세요. 기존 인덱스를 삭제하여 여유 디스크 공간을 확보하는 데 도움이 됩니다.

참고: 사용하지 않는 오래된 인덱스는 삭제하는 것이 좋습니다. 활성 인덱스를 삭제하는 경우 인덱스의 자동 생성을 차단하세요. 자세한 내용은 Ealsticsearch 웹사이트에서 인덱스 자동 생성을 참조하세요.