DevOps/Elastic Stack

[Elasticsearch] 성능 향상을 위한 doc_values 사용법: 메모리 효율 향상시키기 - 컴도리돌이

컴도리돌이 2024. 11. 9. 17:38
728x90

작심삼주 오블완 챌린지

오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.

www.tistory.com


Elasticsearch에서 성능을 최적화하는 것은 데이터 양이 많을수록 더욱 중요합니다. 보통 검색 속도에 집중하게 되지만, 메모리 사용 최적화 역시 시스템 성능에 큰 영향을 미쳐요. 이때 doc_values라는 기능이 등장하죠! 이 기능을 통해 메모리 사용을 절감하면서도 빠른 응답 속도를 확보할 수 있습니다. 😊


근데 doc_values가 뭔데? 🤔

doc_values는 필드 데이터를 메모리가 아닌 디스크에 저장하여 필요한 순간에만 참조할 수 있게 해주는 Elasticsearch의 기능입니다. 메모리 대신 디스크를 활용해 대량의 데이터를 효율적으로 다루게 하죠. 이를 통해 JVM 힙 메모리에 대한 부담을 줄이며, 집계와 정렬 작업 시 메모리를 효과적으로 관리할 수 있습니다.
 
여기서 핵심은 doc_values가 컬럼 기반 데이터 구조를 사용해 힙 메모리 대신 운영체제(OS)의 파일 시스템 캐시를 활용한다는 것입니다. 색인 시 디스크에 저장되고 검색 시 시스템 캐시를 사용해 성능을 최적화하는 방식이죠.
 
keyword, date, numeric 타입 필드는 기본적으로 doc_values가 활성화되어 있습니다. 이들 필드는 보통 집계나 정렬에 사용되므로 메모리 부담을 줄이기 위해 doc_values가 기본 설정되어 있어요. 반면 text 타입 필드는 검색 용도로만 사용되기 때문에 기본적으로 비활성화 상태입니다. 다만, 특정 집계가 필요하다면 text 필드에 doc_values를 활성화할 수도 있지만, 디스크 사용량이 증가할 수 있어 신중한 결정이 필요합니다.
 
doc_values는 집계 및 정렬에 자주 사용되는 필드에서 유용합니다. 예를 들어 사용자 ID나 생성 날짜와 같은 필드에서 doc_values를 활성화하면, 메모리 절약과 성능 향상을 동시에 얻을 수 있습니다. 반면 자주 검색에 쓰이는 필드라면 doc_values는 비활성화하는 편이 좋습니다.


어떻게 doc_values 설정하는데? 

doc_values를 활성화하려면 필드 매핑에서 doc_values 설정을 true로 조정하면 됩니다.😊
아래 예제는 user_id와 created_at 필드에 대해 doc_values를 활성화하는 설정입니다. 

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "user_id": { "type": "keyword", "doc_values": true },
      "created_at": { "type": "date", "doc_values": true }
    }
  }
}

 
위 예제에서는 user_id와 created_at 필드의 doc_values를 활성화하여, 메모리 사용량을 절감할 수 있도록 설정했습니다. 대규모 데이터에서 특히 효과적입니다.
 
실제 성능 차이를 확인하기 위해 user_id와 created_at 필드로 집계와 정렬 쿼리를 실행한 결과를 비교해 보았습니다.

GET /my-index-000001/_search
{
  "query": { "match_all": {} },
  "aggs": {
    "user_count": {
      "terms": {
        "field": "user_id"
      }
    }
  },
  "sort": [
    { "created_at": { "order": "desc" } }
  ]
}
 doc_values 비활성화 시doc_values 활성화 시
응답시간5~7초1~2초
메모리 사용량1GB 이상300~400MB

 
위 쿼리에서 doc_values를 활성화한 경우 메모리 사용량이 줄고, 응답 속도도 빠른 것을 볼 수 있습니다. 대규모 데이터에서 doc_values의 성능 최적화 효과가 특히 두드러집니다. 👏


doc_values는 Elasticsearch 성능 최적화에 필수적인 도구로, 특히 메모리 사용을 줄이고, 대량의 데이터에서 집계 및 정렬할 때 유리합니다. 이 기능을 사용함으로써 효율적인 메모리 관리와 쿼리 속도 향상을 동시에 얻을 수 있죠. Elasticsearch를 사용할 때는 필드별로 doc_values의 활성화 여부를 신중하게 결정하는 것이 성능 개선의 핵심이 되겠죠? 막무가내로 text 필드에 doc_values를 활성화하면, 오히려 디스크 사용량이 늘어나며 메모리 사용 이점을 얻기는커녕 성능 악화를 초래할 수 있어요 😂 또한 해당 설정은 특정 집계나 정렬 작업에서만 사용해야 하며, 자주 검색에 쓰이는 필드에는 적용하지 않는 것이 좋습니다.