데이터 스트림

원본 보기

데이터 스트림

데이터 스트림은 추가 전용(append-only) 시계열 데이터를 저장하는 데 최적화된 인덱스 집합 위에 놓이는 추상화 계층 역할을 합니다. 여러 개의 백킹 인덱스에 데이터를 저장하면서도 요청에 사용할 수 있는 단일 이름의 리소스를 제공합니다. 데이터 스트림은 로그, 이벤트, 메트릭을 비롯해 지속적으로 생성되는 데이터에 적합합니다.

인덱싱 요청과 검색 요청을 데이터 스트림에 직접 보낼 수 있습니다. 스트림은 해당 요청을 스트림의 데이터를 저장하는 백킹 인덱스로 자동 라우팅합니다. 인덱스 수명 주기 관리(ILM)를 사용하면 이러한 백킹 인덱스의 관리를 자동화할 수 있습니다. 예를 들어 ILM을 사용해 오래된 백킹 인덱스를 더 저렴한 하드웨어로 자동으로 옮기고 필요 없는 인덱스를 삭제할 수 있습니다. ILM은 데이터가 늘어남에 따라 발생하는 비용과 관리 부담을 줄이는 데 도움이 됩니다.

보존 요구 사항에 맞춰 수명 주기 관리를 자동화하기 위해 데이터 스트림 수명 주기를 사용할 수도 있습니다.

Streams로 데이터 스트림 관리하기

Elastic Stack 9.2 버전부터 Streams 페이지에서 Kibana의 데이터를 관리할 수 있는 중앙 집중식 인터페이스를 제공합니다. 이 페이지는 일반적인 데이터 관리 작업을 한데 모아 여러 애플리케이션과 구성 요소를 일일이 수동으로 설정할 필요를 없애줍니다. 스트림은 Elasticsearch 데이터 스트림에 직접 매핑됩니다. 예를 들면 logs-myapp-default와 같습니다. Streams 페이지에서 변경한 내용은 연결된 데이터 스트림에 자동으로 전파됩니다.

자세한 내용은 Streams 페이지에서 데이터 스트림 관리를 참조하세요.

데이터에 데이터 스트림을 사용해야 할지 판단하려면 데이터의 형식과 예상되는 사용 방식을 고려해야 합니다. 데이터 스트림을 사용하기에 적합한 경우는 다음 기준에 부합합니다.

  • 데이터에 타임스탬프 필드가 있거나 자동으로 생성할 수 있습니다.
  • 주로 인덱싱 요청을 수행하며, 업데이트와 삭제는 가끔씩만 발생합니다.
  • _id 없이 문서를 인덱싱하거나, 명시적인 _id로 문서를 인덱싱할 때 먼저 기록된 값이 유지되는(first-write-wins) 동작을 기대합니다.

대부분의 시계열 데이터 사용 사례에서는 데이터 스트림이 적합합니다. 다만 데이터가 이러한 범주에 맞지 않는다면(예: 동일한 _id로 여러 문서를 자주 전송하면서 나중에 기록된 값이 유지되기를 기대하는 경우) 대신 쓰기 인덱스를 갖춘 인덱스 별칭을 사용하는 편이 나을 수 있습니다. 자세한 내용은 데이터 스트림 없이 시계열 데이터 관리하기 튜토리얼을 참조하세요.

시계열 데이터 스트림(TSDS)이나 데이터 스트림 수명 주기와 같은 일부 기능은 데이터 스트림을 필요로 한다는 점에 유의하세요.

데이터 스트림은 하나 이상의 숨겨진 자동 생성 백킹 인덱스로 구성됩니다.

data streams diagram

데이터 스트림에는 이에 대응하는 인덱스 템플릿이 필요합니다. 이 템플릿에는 스트림의 백킹 인덱스를 구성하는 데 사용되는 매핑과 설정이 담겨 있으며, 데이터 스트림이 사용하는 ILM 정책을 정의합니다.

데이터 스트림에 인덱싱되는 모든 문서에는 date 또는 date_nanos 필드 타입으로 매핑된 @timestamp 필드가 있어야 합니다. 인덱스 템플릿이 @timestamp 필드의 매핑을 지정하지 않으면 Elasticsearch는 @timestamp를 기본 옵션의 date 필드로 매핑합니다.

동일한 인덱스 템플릿을 여러 데이터 스트림에 사용할 수 있습니다. 데이터 스트림이 사용 중인 인덱스 템플릿은 삭제할 수 없습니다.

백킹 인덱스의 이름 패턴은 구현 세부 사항이므로 여기서 어떤 의미도 유추해서는 안 됩니다. 유일하게 보장되는 사실은 각 데이터 스트림 세대 인덱스가 고유한 이름을 갖는다는 것뿐입니다.

데이터 스트림에 읽기 요청을 보내면 스트림은 해당 요청을 모든 백킹 인덱스로 라우팅합니다.

data streams search request

가장 최근에 생성된 백킹 인덱스가 데이터 스트림의 쓰기 인덱스입니다. 스트림은 새 문서를 이 인덱스에만 추가합니다.

data streams index request

다른 백킹 인덱스에는 인덱스로 직접 요청을 보내더라도 새 문서를 추가할 수 없습니다.

또한 쓰기 인덱스에는 인덱싱을 방해할 수 있는 다음과 같은 작업을 수행할 수 없습니다.

롤오버는 새 백킹 인덱스를 생성하며, 이 인덱스가 스트림의 새로운 쓰기 인덱스가 됩니다.

쓰기 인덱스가 지정된 기간이나 크기에 도달했을 때 데이터 스트림을 자동으로 롤오버하도록 ILM을 사용하는 것을 권장합니다. 필요하다면 데이터 스트림을 수동으로 롤오버할 수도 있습니다.

각 데이터 스트림은 자신의 세대를 추적합니다. 세대는 000001부터 시작하는 6자리 0 채움 정수입니다.

백킹 인덱스가 생성될 때 인덱스 이름은 다음 규칙에 따라 지정됩니다.

.ds-<data-stream>-<yyyy.MM.dd>-<generation>
		

<yyyy.MM.dd>는 백킹 인덱스의 생성 날짜입니다. 세대 번호가 높은 백킹 인덱스일수록 더 최근 데이터를 담고 있습니다. 예를 들어 web-server-logs 데이터 스트림의 세대가 34라고 가정해 봅시다. 2099년 3월 7일에 생성된 이 스트림의 가장 최근 백킹 인덱스 이름은 .ds-web-server-logs-2099.03.07-000034가 됩니다.

축소복원 같은 일부 작업은 백킹 인덱스의 이름을 바꿀 수 있습니다. 이러한 이름 변경이 백킹 인덱스를 데이터 스트림에서 제외시키지는 않습니다.

데이터 스트림에 새 인덱스가 추가되지 않아도 데이터 스트림의 세대가 바뀔 수 있습니다(예: 기존 백킹 인덱스를 축소한 경우). 즉, 일부 세대에 해당하는 백킹 인덱스는 아예 존재하지 않게 됩니다. 백킹 인덱스 이름에서 어떤 의미도 유추해서는 안 됩니다.

데이터 스트림은 기존 데이터가 거의 갱신되지 않는 사용 사례를 위해 설계되었습니다. 기존 문서에 대한 업데이트나 삭제 요청은 데이터 스트림에 직접 보낼 수 없습니다. 다만 해당 문서의 백킹 인덱스에 직접 요청을 보내는 방식으로 데이터 스트림 내 문서를 업데이트하거나 삭제할 수는 있습니다.

데이터 스트림에서 더 많은 수의 문서를 업데이트해야 한다면 쿼리 기반 업데이트(update by query) API와 쿼리 기반 삭제(delete by query) API를 사용할 수 있습니다.

동일한 _id로 여러 문서를 자주 전송하면서 나중에 기록된 값이 유지되기를 기대한다면, 대신 쓰기 인덱스를 갖춘 인덱스 별칭을 사용하는 편이 나을 수 있습니다. 데이터 스트림 없이 시계열 데이터 관리하기 튜토리얼을 참조하세요.