Field data cache
출처: 문서
본문
필드 데이터 캐시
필드 데이터 캐시는 필드 데이터와 글로벌 오디널을 저장하는 노드 수준의 인메모리 캐시예요. 이들은 분석된 텍스트 필드에 대한 집계와 정렬을 가능하게 하는 데이터 구조예요. 계산 비용이 많이 들 수 있기 때문에 재사용이 필요할 경우를 대비해 생성 후 캐시돼요.
필드 데이터란
필드 데이터는 텍스트 필드에 대한 빠른 정렬과 집계를 가능하게 하는 데이터 구조예요. 텍스트 필드는 역색인(inverted index)에 저장되며, 이는 특정 용어를 빠르게 검색하는 데 최적화되어 있고 개별 문서를 반복하는 데는 적합하지 않아요. 집계나 정렬을 위해서는 개별 문서 접근에 최적화된 다른 데이터 구조로 역색인을 처리해야 하므로 OpenSearch가 이를 수행해요.
글로벌 오디널이란
특정 필드에 대한 집계를 계산할 때 각 Lucene 세그먼트는 고유한 용어에 고유한 오디널을 할당하여 버킷 집계와 같은 작업을 가능하게 해요. 전체 클러스터에 걸쳐 집계를 계산할 때는 전역적으로 고유한 각 용어에 대한 글로벌 오디널을 생성하고 이 글로벌 오디널과 세그먼트 오디널 간의 매핑을 저장해야 해요. 이를 통해 각 세그먼트의 집계 결과를 결합할 수 있어요. 이 매핑은 이후 집계에서 재사용할 수 있도록 필드 데이터 캐시에 저장돼요.
필드에 매핑 파라미터 "eager_global_ordinals": true가 설정되어 있으면(기본값은 false), 글로벌 오디널은 쿼리 시점에 지연 계산되지 않고 인덱스 리프레시 시점에 계산되어 저장돼요.
글로벌 오디널에 대한 자세한 내용은 Eager global ordinals를 참조하세요.
모범 사례
기본적으로 텍스트 필드에서는 필드 데이터가 비활성화되어 있어요. 많은 힙 메모리를 소비할 수 있기 때문이에요. 텍스트 필드에서 정렬이나 집계를 수행하려면 대신 키워드 하위 필드를 생성하는 것이 좋아요. 키워드 필드는 분석되지 않으므로 역색인에 저장되지 않으며 집계를 위한 별도의 데이터 구조를 구축할 필요가 없어요.
텍스트 필드에서 직접 정렬이나 집계를 활성화하려면 필드 매핑에서 "fielddata": true를 설정하세요.
필드 데이터 캐시 구성
| 설정 | 데이터 타입 | 기본값 | 수준 | 정적/동적 | 설명 |
|---|---|---|---|---|---|
indices.breaker.fielddata.limit |
Percentage | 40% |
Cluster | Dynamic | 필드 데이터 캐시 크기 제한을 설정하며, 이 한도를 초과하면 캐시에 더 많은 항목이 필요한 들어오는 요청이 서킷 브레이커에 의해 중단돼요. |
indices.fielddata.cache.size |
Byte size or percentage of total heap size | 35% |
Cluster | Dynamic | 최대 필드 데이터 캐시 크기를 설정하며, 이 크기를 초과하면 제거가 발생해요. 서킷 브레이커 한도보다 작아야 해요. 값이 -1이면 이 제한이 적용되지 않고 서킷 브레이커 한도만 관련돼요. |
필드 데이터 캐시 모니터링
Nodes Stats API는 클러스터의 모든 노드에 대한 캐시 통계를 반환해요:
GET /_nodes/stats/indices/fielddata
{% include copy-curl.html %}
응답에는 캐시 통계가 포함돼요:
{
"nodes" : {
"oeR83dkUSPmnQqzBEGc4fQ" : {
"indices" : {
"fielddata" : {
"memory_size_in_bytes" : 0,
"evictions" : 0,
"item_count" : 0
}
}
}
}
}
{% include copy-curl.html %}
level=indices 파라미터를 제공하여 인덱스별로 값을 집계할 수 있어요.
Cat Field Data API를 사용하여 각 노드의 각 필드에 대한 필드 데이터 크기 목록을 얻을 수도 있어요.