Info
2023년에 직접 경험한 내용을 다루고 있습니다.
Elasticsearch의 매핑(Mapping)은 인덱스에 들어가는 데이터의 형식을 정의합니다.
기본적으로 Elasticsearch는 동적 매핑을 지원하기 때문에 자동으로 데이터에서 타입을 유추해 매핑을 생성합니다. 하지만 이로 인해 예기치 못한 문제가 발생할 수도 있습니다.
문제 상황 및 원인
Elasticsearch에서 신규 메트릭을 수집하고 대시보드를 구성하던 중, CPU 코어 값의 합이 맞지 않는 문제가 있었습니다.
해당 값은 원래 float
타입으로 입력되어야 하는 상황이었습니다. 그런데 들어오는 첫 값이 정수로 떨어지는 바람에 인덱스에서 해당 항목이 int
타입으로 설정되었고 이로 인해 CPU 코어 값의 소수점 아래 부분이 모두 잘린 상태로 처리되었습니다.
Elasticsearch의 숫자 타입 매핑에는 coerce
라는 옵션이 있어 정확히 타입이 일치하지 않아도 일단 값을 받도록 할 수 있습니다. 대신 입력한 값은 알맞게 변환되어 저장됩니다. 기본값이 true
였기 때문에 위와 같이 소수점이 포함된 숫자도 모두 잘려서 저장되는 문제가 발생했습니다.
문제 조치
- 당시에는 인덱스를 생성한 지 얼마 되지 않아서 다음과 같이 해결하였습니다.
- 인덱스 삭제
float
타입 명시하여 매핑 재작성- 데이터 재적재
- 하지만 이 방법은 상당히 위험한 방법입니다.
보통은 새로운 인덱스에 매핑을 하고 재색인을 하는 것이 좋습니다.