티스토리 뷰
반응형
1. Fielddata란?
Elasticsearch에서 text 타입의 필드는 기본적으로 정렬(Sort)이나 집계(Aggregation)에 사용할 수 없습니다.
이를 가능하게 하려면 Fielddata 기능을 활성화해야 합니다.
Fielddata의 역할
- text 필드에서 정렬 및 집계를 수행할 수 있도록 데이터 구조를 변환
- 대용량 데이터에서도 빠른 검색 및 분석 가능
Fielddata의 단점
- 메모리 사용량 증가 : Heap 영역에 데이터를 적재하므로 JVM 메모리 부담이 커짐
- 성능 저하 가능성 : 대량의 데이터를 처리할 경우 OutOfMemory(OOM) 발생 가능
2. Elasticsearch 8.12에서 Fielddata 해제 이슈
Elasticsearch 8.12 버전부터 Fielddata의 자동 해제(Expire) 기능이 추가되었습니다.
기본적으로 1시간(expire: 1h)이 지나면 Fielddata가 자동으로 해제되는 동작을 합니다
문제 발생 원인
- 기존 버전(8.11 이하)에서는 Fielddata가 캐시 크기 형태로 유지됨 (기본값 -1b)
- 8.12에서는 indices.fielddata.cache.expire 설정이 추가됨
- 기본값이 1시간(1h)으로 설정되어 있음
- 일정 시간이 지나면 Fielddata가 삭제되고 다시 로딩하는 과정에서 성능 저하가 발생
릴리즈 노트에는 있지만 공식 문서에는 언급되지 않음
- Elasticsearch 8.12 릴리즈 노트에는 해당 내용이 포함됨
- 하지만 공식 문서(Field data cache settings)에는 이 변경 사항이 언급되지 않음

실제 Fielddata 자동 해제 확인
- 1시간이 지나면 Fielddata가 자동 해제되는 현상을 확인할 수 있음
- 특정 필드에서 Fielddata를 활성화한 후 시간이 지나면 제거됨
3. Fielddata 해제 문제 해결 방법
1) Fielddata 자동 해제 비활성화
Fielddata가 자동으로 해제되지 않도록 설정을 변경할 수 있습니다.
# IndicesFieldDataCache.java
public static final Setting<TimeValue> INDICES_FIELDDATA_CACHE_EXPIRE = Setting.positiveTimeSetting(
"indices.fielddata.cache.expire",
new TimeValue(1, TimeUnit.HOURS),
Property.NodeScope
);
final TimeValue expire = INDICES_FIELDDATA_CACHE_EXPIRE.exists(settings) ? INDICES_FIELDDATA_CACHE_EXPIRE.get(settings) : null;
if (expire != null && expire.getNanos() > 0) {
cacheBuilder.setExpireAfterAccess(expire);
}
코드를 보면 expire 이 null 이 아니고 값이 0 보다 큰 경우에만 캐시 만료 시간을 설정 합니다. 이 외 경우 기본값 1h 시간으로 설정 됩니다. 결국, 0 이하 값 (일반적으로 -1 을 무제한 값으로 사용)은 설정 할 수 없습니다.
※ 숫자만 입력했을 때 기본 단위는 나노초(ns)
따라서, Fielddata 을 무제한으로 유지하기 위해서는 0 값을 설정 해야 합니다.
# elasticsearch.yml
indices.fielddata.cache.expire: 0
필요에 따라 적절한 만료 시간을 설정할 수도 있음 (예: 2h, 12h)

2) Fielddata 설정 변경 후 유지되는지 확인
- 설정 변경 후 Fielddata가 자동으로 해제되지 않는지 확인
3) Fielddata 사용 최소화
Fielddata는 메모리 사용량이 크므로 가능하면 대체 방법을 사용하는 것이 좋습니다.
✅ Fielddata 대신 keyword 타입 사용
- text 대신 keyword 타입을 사용하면 Fielddata 없이도 정렬 및 집계가 가능
- 기존 데이터에서 text + keyword 멀티 필드 적용 가능
{
"mappings": {
"properties": {
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
- 이렇게 설정하면 title.keyword 필드를 정렬 및 집계에 사용할 수 있음
4. 마무리 및 추천 설정
1) Elasticsearch 8.12 이상 버전 사용자라면 반드시 확인할 사항
- Fielddata가 1시간 후 자동 해제되는지 확인
- indices.fielddata.cache.expire 설정 조정
2) Fielddata를 꼭 사용해야 한다면?
- indices.fielddata.cache.expire: 0로 설정
- Heap 메모리 사용량 모니터링 필수
3) Fielddata 없이 운영하는 방법 고민
- keyword 타입을 적극 활용
- 데이터 모델링을 최적화하여 성능을 개선
반응형
undefined
공지사항
최근에 올라온 글