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를 활성화하면, 오히려 디스크 사용량이 늘어나며 메모리 사용 이점을 얻기는커녕 성능 악화를 초래할 수 있어요 😂 또한 해당 설정은 특정 집계나 정렬 작업에서만 사용해야 하며, 자주 검색에 쓰이는 필드에는 적용하지 않는 것이 좋습니다.
'DevOps > Elastic Stack' 카테고리의 다른 글
[Elasticsearch] 성능 개선을 위한 코드 비교 및 분석 - 컴도리돌이 (4) | 2024.11.08 |
---|---|
[Elasticsearch] wildcard 쿼리에 대해 제대로 이해하기 - 컴도리돌이 (0) | 2024.11.07 |
[ELK] 인덱스(생성/조회/삭제)와 도큐먼트(CRUD)에 대해서 - 컴도리돌이 (0) | 2024.01.23 |
[Elasticsearch] 엘라스틱 서치 역인덱스(Elasticsearch inverted index) - 컴도리돌이 (0) | 2024.01.17 |
[ELK] Elastic Stack에 대해서 - 컴도리돌이 (2) | 2024.01.16 |