[스프링] 엘라스틱서치 구성
쿠버네티스 환경에서 엘라스틱서치 기본 설정
엘라스틱서치는 다음 설정 파일을 사용한다.
config/elasticsearch.yml
: 기본적인 설정이 저장되는 파일이다. 클러스터 정보, 노드 정보, 데이터 파일 저장 경로 등을 설정할 수 있다.config/jvm.options
: 힙 메모리 사이즈, GC 옵션, 힙 메모리 덤프 등의 JVM 관련 설정을 할 수 있다.config/log4j2.properties
: log4j2 로깅과 관련된 설정을 지정한다.
엘라스틱서치는 인덱싱한 데이터 스트림을 data
디렉터리에 저장한다. 클러스터 상태 및 작업에 대한 정보가 포함된 자체 애플리케이션 로그는 log
디렉터리에 저장한다.
키바나는 다음 설정 파일을 사용한다.
config/kibana.yml
kibana.yml
파일에 설정하는 값은 다음과 같다.
server.port
: 키바나 백엔드 서버의 포트를 지정한다.server.host
: 키바나 백엔드 서버의 호스트를 지정한다.server.publicBaseUrl
: 키바나에 접근할 수 있는 URL을 지정한다./
문자로 끝나면 안 된다.elasticsearch.hosts
: 엘라스틱서치의 호스트 URL 목록을 지정한다. 호스트는 모두 같은 클러스터에 속해야 한다.
저장소 설정
날짜 설정
키바나의 데이터 뷰 설정에서 엘라스틱서치에 저장된 날짜와 관련된 필드의 형식을 어떻게 지정할지 설정할 수 있다.
키바나의 Stack Managemnet - Advanced Settings
메뉴에서 타임존 설정을 할 수 있다. 기본값은 browser
이며 브라우저에서 감지한 타임존을 사용한다.
애플리케이션에서 Asia/Seoul
타임존을 사용하여 날짜를 저장한 경우 키바나의 기본 설정으로는 +9 시간으로 표기된다. 엘라스틱서치에 저장된 데이터를 UTC로 보고 타임존을 설정하기 때문이다. 키바나의 타임존을 변경하여 표기 시간을 원하는 대로 설정할 수는 있지만 이 경우 키바나가 제공하는 기본 타임 필터 기능을 원하는 범위로 지정할 수 없다. 따라서 올바른 날짜 표기와 필터 기능을 위해 애플리케이션에서 날짜를 UTC로 변환하여 저장하거나 별도의 필터를 거쳐 UTC로 변환하여 저장하는 것이 필요하다.
스프링 데이터 엘라스틱서치
스프링 데이터 엘라스틱서치 (Spring Data Elasticsearch)는 단일 엘라스틱서치 노드 또는 클러스터에 연결된 엘라스틱서치 클라이언트에서 동작한다. 클러스터에 대한 작업을 위해 엘라스틱서치 클라이언트를 직접 사용할 수 있지만, 스프링 데이터 엘라스틱서치는 일반적으로 더 높은 수준의 추상화인 엘라스틱서치 오퍼레이션(operation)과 및 엘라스틱서치 리포지토리(repositoriy) 인터페이스 및 기능을 제공한다.
엘라스틱서치 클라이언트를 구성하기 위해서는 ElasticsearchConfiguration
추상 클래스를 상속하여 clientConfiguration()
메서드를 재정의한다.
@Configuration
public class EsClientConfig extends ElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
}
}
ElasticsearchConfiguration
클래스의 elasticsearchRestClient()
, elasticsearchTransport()
, elasticsearchClient()
, elasticsearchOperations()
, jsonpMapper()
, transportOptions()
메서드를 재정의하여 빈의 추가 구성을 할 수 있다.
기본적으로 엘라스틱서치 클러스터와 상호 작용하려면 ElasticsearchOperations
를 사용해야 한다. 리포지토리를 사용할 때 이 인스턴스가 내부적으로 사용된다.
##
라이브러리에서 도큐먼트 객체를 데이터 클래스로 정의 시 접근 제어자를
private
로 선언하면 매핑이 되지 않는다.
도큐먼트 객체에 날짜 및 시간과 관련된 타입의 필드를 정의할 경우 다음 예외가 발생할 수 있다.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling.
-
스프링 데이터 엘라스틱서치는 내부적으로 객체 매핑을 위해
ObjectMapper
를 사용하므로 자바의LocalDateTime
,Instant
와 같은 타입의 매핑 처리를 위해 특정 모듈 등록이 필요하다. 다음과 같이ObjectMapper
에 자바 타임 모듈을 등록한다.ObjectMapper mapper = JsonMapper.builder() .addModule(new JavaTimeModule()) .build();
엘라스틱서치 클라이언트
엘라스틱서치가 제공하는 REST API를 사용하여 직접 데이터를 전송하거나 언어 별 클라이언트 구현체를 사용할 수 있다. 클라이언트에는 저수준 REST 클라이언트, 고수준 REST 클라이언트, 자바 클라이언트가 있으며 더 높은 추상화를 제공하는 스프링 데이터 엘라스틱서치를 사용할 수도 있다.
저수준 REST 클라이언트는 아파치 HttpComponents
를 이용하며 REST API를 통한 접근으로 엘라스틱서치와의 버전 호환성 이슈는 없지만 언어에 특화된 검색 요청, 쿼리 빌더와 같은 기능을 사용할 수 없다. 또한 요청과 응답 객체를 버전에 맞게 직접 생성하여 처리해야 한다. 고수준 REST 클라이언트는 엘라스틱서치 버전에 맞는 기능 추상화를 제공하지만 7.15.0 버전 부터 자바 API 클라이언트를 위해 더 이상 사용되지 않는다. 고수준 REST 클라이언트를 사용할 경우 클라이언트 버전과 엘라스틱서치 버전의 호환성에 신경써야 한다. 고수준 REST 클라이언트의 7.17 버전은 호환성 모드를 활성화한 상태에서 엘라스틱서치 8 버전 이상에서 동작하도록 할 수 있으나 엘라스틱서치 8 버전 이상을 사용하는 경우 자바 API 클라이언트를 사용하는 것이 좋다.
##
로그스태시의 http 입력 플러그인을 사용하여 로그스태시로 HTTP POST 요청을 보내고 로그스태시를 거쳐 엘리스틱서치로 데이터를 전송할 수도 있다.
참고
- https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html#path-settings
- https://www.elastic.co/guide/en/cloud-on-k8s/master/k8s-storage-recommendations.html
- https://www.elastic.co/guide/en/cloud-on-k8s/master/k8s-persistent-storage.html
- https://www.elastic.co/kr/blog/the-elasticsearch-java-high-level-rest-client-is-out
- <https://www.elastic.co/kr/blog/switching-from-the-java-high-level-rest-client-to-the-new-java-api-client
Comments