본문 바로가기
기술

Elasticsearch 8.18 LOOKUP JOIN 완벽 가이드: 이제 SQL처럼 JOIN 하세요

by 스타스토리. 2025. 7. 1.
반응형
핵심 요약: 본 문서는 Elasticsearch 8.18의 혁신적인 기능인 ES|QL의 LOOKUP JOIN을 심층적으로 다룬다. 새로운 'lookup' 인덱스 모드 설정부터 기본 및 복합 조인 쿼리, 보안 및 인프라 모니터링 등 고급 활용 사례, 그리고 기존 ENRICH 방식과의 비교 분석까지, SQL 스타일의 데이터 조인을 마스터하는 데 필요한 모든 것을 제공한다.

Elasticsearch는 오랫동안 강력한 검색 및 집계 기능을 제공해왔지만, 서로 다른 인덱스의 데이터를 실시간으로 연결하는 데에는 한계가 있었다. Elasticsearch 8.18에서 ES|QL에 도입된 LOOKUP JOIN 기능은 이러한 패러다임을 완전히 바꾸는 혁신이다. 이제 사용자들은 데이터 인덱싱 시점에 모든 정보를 보강할 필요 없이, 쿼리 시점에 SQL처럼 간단하게 데이터를 조인하여 컨텍스트를 풍부하게 만들 수 있다. 이는 데이터 상관관계 분석, 보안 이벤트 조사, 자산 정보 병합 등 다양한 시나리오에서 운영 효율성을 극대화한다.

1. LOOKUP JOIN의 핵심: 새로운 'lookup' 인덱스 모드

LOOKUP JOIN을 사용하기 위해서는 먼저 참조 데이터를 저장할 특별한 인덱스를 생성해야 한다. 이 인덱스는 "index.mode": "lookup" 설정을 통해 최적화되며, 조인 성능을 극대화한다.

# 1. 'lookup' 모드로 인덱스 생성
PUT my_asset_lookup
{
  "settings": {
    "index.mode": "lookup",
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "ip_address": { "type": "ip" },
      "environment": { "type": "keyword" },
      "team": { "type": "keyword" },
      "criticality": { "type": "keyword" }
    }
  }
}

# 2. 참조 데이터 색인
POST my_asset_lookup/_bulk
{"index":{"_id":"1"}}
{"ip_address":"192.168.1.100","environment":"production","team":"backend","criticality":"high"}
{"index":{"_id":"2"}}
{"ip_address":"192.168.1.101","environment":"staging","team":"frontend","criticality":"medium"}

2. ES|QL LOOKUP JOIN 기본 및 복합 활용법

ES|QL의 직관적인 문법을 통해 로그 데이터와 방금 생성한 참조 데이터를 손쉽게 조인할 수 있다.

2.1. 기본 LOOKUP JOIN

웹 로그(kibana_sample_data_logs)의 `clientip` 필드를 자산 정보(my_asset_lookup)의 `ip_address` 필드와 조인하여 에러가 발생한 IP의 환경 및 담당 팀 정보를 보강한다.

FROM kibana_sample_data_logs
| WHERE response.keyword != "200"
| LOOKUP JOIN my_asset_lookup ON clientip = ip_address
| STATS error_count = COUNT(*) BY response.keyword, environment, team
| SORT error_count DESC

2.2. 복합 조건 및 다중 JOIN

하나의 쿼리 내에서 여러 `LOOKUP JOIN`을 사용하여 보안 이벤트에 자산 정보와 사용자 정보를 동시에 보강하고, 실패한 로그인 시도가 10회를 초과하는 심각한 상황을 분석한다.

FROM security_events
| WHERE event.action == "login_failed"
| LOOKUP JOIN asset_lookup ON source.ip = asset_ip
| LOOKUP JOIN user_lookup ON user.name = username
| STATS failed_attempts = COUNT(*) BY asset.criticality, user.department, source.ip
| WHERE failed_attempts > 10
| SORT failed_attempts DESC

3. 고급 활용 사례: 보안, 인프라, APM 분석

LOOKUP JOIN은 다양한 운영 시나리오에서 데이터 분석의 깊이를 더한다.

  • 보안 분석: 방화벽 로그와 최신 위협 인텔리전스 데이터를 실시간으로 조인하여 알려진 악성 IP로부터의 공격을 즉시 식별한다.
  • 인프라 모니터링: CPU 사용량이 급증한 서버의 메트릭 데이터를 자산 관리 데이터(CMDB)와 조인하여 해당 서버의 중요도, 담당 팀, 관리자 정보를 즉시 파악하고 신속하게 대응한다.
  • 애플리케이션 성능 분석: APM 트레이스 데이터와 배포 이력 데이터를 조인하여 특정 배포 버전이 에러율이나 응답 시간에 미친 영향을 정확히 분석한다.

4. ENRICH 프로세서 vs. LOOKUP JOIN 비교

📌 핵심 차이점
ENRICH는 데이터 인덱싱 시점에 데이터를 보강한다. 참조 데이터가 변경될 때마다 정책을 재실행해야 하는 번거로움이 있다. 반면, LOOKUP JOIN쿼리 시점에 데이터를 보강하므로, 참조 데이터가 실시간으로 변경되어도 항상 최신 정보를 사용하여 분석할 수 있다.
구분 ENRICH Processor (기존) ES|QL LOOKUP JOIN (신규)
실행 시점 인덱싱 시점 쿼리 시점
데이터 변경 정적 데이터에 적합 동적/실시간 데이터에 최적
유연성 낮음 (파이프라인 사전 정의) 높음 (쿼리에서 즉시 사용)
복잡도 높음 (정책 생성/실행 필요) 낮음 (SQL과 유사)

5. 실시간 데이터 관리 및 성능 최적화

LOOKUP JOIN의 가장 큰 장점은 참조 데이터의 실시간성을 보장한다는 것이다. 외부 CMDB나 자산 관리 시스템의 변경 사항을 주기적으로 동기화하거나, 실시간으로 개별 문서를 업데이트하여 항상 최신 상태의 컨텍스트를 유지할 수 있다.

# Python을 이용한 동적 데이터 관리
from datetime import datetime

class DynamicLookupManager:
    def __init__(self, es_client):
        self.es = es_client
    
    def sync_from_cmdb(self, cmdb_api_endpoint):
        cmdb_data = self._fetch_cmdb_data(cmdb_api_endpoint)
        # CMDB 데이터를 Elasticsearch Bulk API로 일괄 업데이트
        self.es.bulk(body=self._create_bulk_ops(cmdb_data))

# CMDB와 동기화된 최신 자산 정보로 즉시 조인 가능
# FROM ... | LOOKUP JOIN asset_lookup ...

Lookup 인덱스의 성능을 최적으로 유지하기 위해 단일 샤드를 사용하고, 조인 키는 `keyword` 타입을 사용하는 것이 권장된다. 또한, Kibana UI를 통해 CSV 파일을 업로드하여 비전문가도 손쉽게 Lookup 인덱스를 생성하고 관리할 수 있다.

결론 및 향후 로드맵

Elasticsearch 8.18의 LOOKUP JOIN은 NoSQL의 유연성과 관계형 데이터베이스의 강력한 데이터 연결성을 결합한 게임 체인저이다. 이 기능을 통해 사용자들은 복잡한 데이터 파이프라인 없이도 실시간으로 데이터를 보강하고, 더 깊이 있는 인사이트를 발견할 수 있게 되었다.

향후 로드맵에는 `INNER JOIN`, 서브쿼리, 일반 인덱스와의 조인 등 더욱 강력한 기능들이 포함되어 있어, Elasticsearch가 진정한 통합 분석 플랫폼으로 발전하는 데 핵심적인 역할을 할 것으로 기대된다. 지금 바로 Elasticsearch 8.18에서 LOOKUP JOIN을 경험하고 데이터 분석의 새로운 가능성을 탐험해보길 바란다.

반응형