시계열 데이터를 다루는 많은 엔지니어들이 직면하는 문제가 있습니다. 시간이 지남에 따라 계속 쌓이는 로그, 메트릭, 이벤트 데이터를 어떻게 효율적으로 관리할 것인가? 특히 대규모 환경에서는 이러한 데이터의 저장, 관리, 쿼리가 상당한 도전이 됩니다. Elasticsearch의 Data Streams 기능은 이런 문제를 해결하기 위한 우아한 솔루션을 제공합니다.
Data Streams란 무엇인가?
Elasticsearch 7.9 버전에서 정식 출시된 Data Streams는 시계열 데이터를 위한 특별한 추상화 계층입니다. 기존에 여러 개의 인덱스를 수동으로 관리하던 방식에서 벗어나, 마치 하나의 인덱스처럼 동작하는 데이터 관리 패러다임을 제공합니다.
가장 중요한 점은 Data Streams가 백엔드에서 여러 인덱스를 자동으로 관리한다는 것입니다. 사용자는 단일 엔드포인트에 데이터를 쓰고, 단일 엔드포인트에서 데이터를 읽을 수 있습니다. 내부적인 복잡성은 Elasticsearch가 알아서 처리해 줍니다.
Data Streams의 핵심 구성 요소
Data Streams의 구조를 이해하기 위해서는 다음 세 가지 핵심 구성 요소를 알아야 합니다:
- 인덱스 템플릿(Index Template): Data Stream을 생성하기 전에 설정해야 하는 매핑과 설정을 정의합니다.
- 백업 인덱스(Backing Indices): Data Stream은 내부적으로 여러 개의 숨겨진 인덱스로 구성됩니다. 각 인덱스는 특정 시간 범위의 데이터를 담고 있습니다.
- 롤오버 정책(Rollover Policy): 새로운 백업 인덱스를 언제 생성할지 결정하는 규칙입니다. 시간, 크기, 문서 수 등의 기준을 설정할 수 있습니다.
Data Streams의 장점
1. 효율적인 스토리지 관리
Data Streams는 ILM(Index Lifecycle Management)과 완벽하게 통합되어 데이터 라이프사이클을 자동화합니다. 오래된 데이터는 자동으로 콜드 스토리지로 이동하거나 삭제될 수 있으며, 핫 데이터는 고성능 노드에 유지됩니다. 이는 스토리지 비용을 크게 절감하면서도 성능을 최적화합니다.
2. 운영 오버헤드 감소
전통적인 시계열 데이터 관리에서는 인덱스 롤오버, 삭제, 별칭 관리 등을 수동으로 처리해야 했습니다. Data Streams는 이러한 작업을 자동화하여 운영 오버헤드를 크게 줄여줍니다. 개발자나 운영자는 데이터 관리보다 비즈니스 가치 창출에 더 집중할 수 있게 됩니다.
3. 쿼리 성능 최적화
시간 기반 필터링이 자주 사용되는 시계열 데이터 조회에서, Data Streams는 관련 백업 인덱스만 타겟팅하여 쿼리 성능을 최적화합니다. 예를 들어, 지난 24시간의 데이터만 조회한다면, Elasticsearch는 해당 시간대의 데이터를 포함하는 인덱스만 검색합니다.
실제 구현 예시
간단한 Data Stream 설정 예시를 살펴보겠습니다:
// 1. 컴포넌트 템플릿 생성
PUT _component_template/logs_mappings
{
"template": {
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"message": { "type": "text" },
"level": { "type": "keyword" }
}
}
}
}
// 2. 인덱스 템플릿 생성
PUT _index_template/logs_template
{
"index_patterns": ["logs-*"],
"data_stream": { },
"composed_of": ["logs_mappings"],
"priority": 100
}
// 3. Data Stream 생성
PUT _data_stream/logs-app
// 4. 데이터 색인
POST logs-app/_doc
{
"@timestamp": "2023-05-20T12:00:00.000Z",
"message": "사용자 로그인 성공",
"level": "INFO"
}
이제 logs-app Data Stream에 계속해서 데이터를 쓸 수 있으며, Elasticsearch는 설정된 정책에 따라 백업 인덱스를 자동으로 관리합니다.
실제 사용 사례
로그 관리 시스템
대규모 마이크로서비스 환경에서는 수많은 서비스가 지속적으로 로그를 생성합니다. Data Streams를 사용하면 서비스별, 환경별로 로그 스트림을 구성하고, 각 스트림의 보존 정책을 별도로 설정할 수 있습니다. 개발 환경의 로그는 3일만 보관하고, 프로덕션 환경의 로그는 90일 동안 보관하는 등의 세밀한 관리가 가능합니다.
IoT 데이터 처리
스마트 팩토리나 스마트 시티와 같은 IoT 환경에서는 수많은 센서가 지속적으로 데이터를 생성합니다. Data Streams를 활용하면 실시간 모니터링을 위한 최신 데이터는 고성능 스토리지에 유지하고, 분석용 과거 데이터는 비용 효율적인 스토리지로 자동 이동할 수 있습니다.
백업 인덱스 (Backing Indices)?
백업 인덱스는 데이터 스트림의 실제 데이터가 저장되는 물리적인 Elasticsearch 인덱스입니다.
- 데이터 스트림은 사용자에게는 하나의 가상 인덱스처럼 보이지만, 내부적으로는 여러 개의 숨겨진(hidden) 실제 인덱스들로 구성됩니다.
- 이러한 실제 인덱스들을 "백업 인덱스" 또는 "백킹 인덱스"라고 부릅니다.
- 백업 인덱스의 이름은 일반적으로 .ds-<데이터스트림이름>-<타임스탬프>-<세대번호> 형식을 가집니다. 예: .ds-logs-filebeat-ecs-2025.03.26-000361
사용자는 데이터 스트림 이름을 통해 모든 백업 인덱스의 데이터에 접근할 수 있어 투명하게 여러 인덱스에 걸쳐 작업할 수 있습니다.
롤오버 (Rollover)?
롤오버는 새로운 백업 인덱스를 생성하고 쓰기 작업을 새 인덱스로 전환하는 과정입니다.
- 롤오버는 지정된 조건(시간, 크기, 문서 수 등)이 충족되면 자동으로 발생합니다.
- 롤오버 후에도 이전 백업 인덱스들은 계속 유지되며 검색에 포함됩니다.
- 롤오버는 인덱스 라이프사이클 관리(ILM) 정책에 의해 제어됩니다.
롤오버의 주요 이점:
- 성능 최적화: 인덱스 크기를 적절하게 유지하여 검색 성능 최적화
- 효율적인 데이터 관리: 시간이 지난 데이터는 별도 인덱스에서 다른 정책(압축, 콜드 스토리지 이동 등)을 적용 가능
- 운영 편의성: 단일 엔드포인트(데이터 스트림 이름)를 통해 모든 백업 인덱스를 관리
예를 들어, 로그 데이터를 저장하는 데이터 스트림이 있고 "1일 또는 5GB에 도달하면 롤오버" 정책을 설정했다면:
- 처음에는 .ds-logs-2025.03.27-000001 백업 인덱스가 생성됩니다.
- 하루가 지나거나 인덱스 크기가 5GB에 도달하면 .ds-logs-2025.03.28-000002 인덱스가 새로 생성되고 새 데이터는 이 인덱스에 저장됩니다.
- 사용자는 계속해서 logs 데이터 스트림을 통해 모든 데이터에 접근할 수 있습니다.
인덱스 쓰면 되지 않아요?
일반 인덱스:
- 시간 개념이 내장되어 있지 않습니다
- 데이터가 계속 추가되면 하나의 인덱스가 계속 커집니다
- 수명 주기 관리를 수동으로 해야 합니다
- 오래된 데이터와 새 데이터가 같은 인덱스에 섞여 있습니다
데이터 스트림:
- 시간 기반으로 동작합니다 (@timestamp 필드 필수)
- 자동으로 여러 백업 인덱스로 분할됩니다
- 새 데이터는 항상 최신 인덱스에 쓰여집니다
- 오래된 데이터는 별도 인덱스에 격리되어 관리됩니다
- 인덱스 라이프사이클 관리(ILM)와 함께 사용하면 자동으로 오래된 데이터를 처리합니다
로그 데이터나 모니터링 데이터처럼 시간에 따라 계속 쌓이는 데이터는 데이터 스트림이 훨씬 효율적입니다.
기존에 있떤 데이터들도 스트림에 들어가나요?
데이터 스트림을 생성했다고 해서 기존 인덱스의 데이터가 자동으로 이동하지 않습니다. 데이터 스트림은 앞으로 들어올 데이터를 위한 추상화 계층으로, 기존에 다른 인덱스에 저장된 데이터는 자동으로 옮겨지지 않습니다. 기존 데이터를 데이터 스트림으로 이동하려면 별도의 마이그레이션 작업이 필요합니다.
기존 데이터를 새 데이터 스트림으로 마이그레이션하는 방법은 다음과 같습니다:
- 재인덱싱(Reindex API):
- POST _reindex { "source": { "index": "기존-인덱스-이름" }, "dest": { "index": "ds-logs" } }
- 로그스태시 사용: 로그스태시를 사용하여 기존 인덱스에서 데이터를 읽어서 데이터 스트림으로 전송할 수 있습니다.
- 스냅샷 & 복원: 기존 인덱스의 스냅샷을 만들고 데이터 스트림 형식으로 복원할 수도 있습니다.
일반적으로 데이터 스트림으로의 전환은 새로운 데이터부터 시작하고, 필요한 경우에만 기존 데이터를 마이그레이션하는 방식으로 진행합니다.
만약 기존 .ds-logs-filebeat-ecs-2025.03.26-000361와 같은 인덱스의 데이터를 새로운 ds-logs 데이터 스트림에서 보고 싶다면, 키바나 데이터 뷰를 수정하여 두 패턴을 모두 포함하도록 할 수 있습니다. 예를 들면:
title: "ds-logs*,.ds-logs-filebeat-ecs*"
결론
Elasticsearch의 Data Streams는 시계열 데이터 관리의 패러다임을 바꾸고 있습니다. 복잡한 인덱스 관리 작업을 자동화하고, 스토리지 효율성을 높이며, 쿼리 성능을 최적화함으로써 개발자와 운영자의 부담을 크게 줄여줍니다.
특히 로그, 메트릭, 이벤트 데이터와 같은 대규모 시계열 데이터를 다루는 조직에게 Data Streams는 선택이 아닌 필수가 되어가고 있습니다. Elasticsearch 7.9 이상 버전을 사용하고 있다면, 지금 바로 Data Streams를 도입하여 시계열 데이터 관리의 혁신을 경험해보세요.
'DataOps > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 8. 엘라스틱서치의 내부 동작 상세 (0) | 2024.04.03 |
---|---|
[Elasticsearch] 3. 인덱스 설계 (Template, Routing) (0) | 2024.03.13 |
[Elasticsearch] 3. 인덱스 설계 (Analyzer, Tokenizer) (0) | 2024.03.13 |
[Elasticsearch] 3. 인덱스 설계 (설정, 맵핑, doc_values, _source) (0) | 2024.03.04 |
[Elasticsearch] 2. 엘라스틱서치 기본 동작과 구조 (0) | 2024.01.26 |
댓글