Quickwit - 로그를 위한 클라우드 네이티브 검색 엔진 치트시트
Quickwit는 추가만 가능한 데이터를 위해 설계된 오픈소스의 Rust 기반 검색 엔진입니다. 로그, 트레이스, 감사 이벤트로, 객체 저장소 (S3, GCS, Azure)에서 직접 실행됩니다. Elasticsearch와 달리 인덱스를 위한 로컬 디스크나 클러스터 상태가 필요하지 않습니다. 인덱스가 객체 저장소에 불변으로 저장되므로 계산을 저장소에서 분리하고 페타바이트 규모 보관을 경제적으로 만듭니다. Elasticsearch 호환 검색 API를 노출하고 트레이스를 위한 네이티브 Jaeger 백엔드입니다.
설치
| 방법 | 명령 |
|---|
| 설치 스크립트 | `curl -L https://install.quickwit.io |
| Docker | docker run -p 7280:7280 quickwit/quickwit run |
| Kubernetes | Helm 차트 사용 가능 |
| 노드 시작 | ./quickwit run |
| UI / API | http://localhost:7280 |
핵심 개념
| 용어 | 의미 |
|---|
| 인덱스 | doc 매핑이 있는 명명된 데이터셋 |
| Split | 객체 저장소에 저장된 불변 인덱스 샤드 |
| Metastore | 인덱스/split 추적 (파일 또는 PostgreSQL) |
| 소스 | 문서가 어디서 나오는지 (Kafka, 파일, 수집 API) |
| 노드 역할 | indexer, searcher, metastore, control plane |
인덱스 생성
# index-config.yaml
version: 0.8
index_id: app-logs
doc_mapping:
field_mappings:
- name: timestamp
type: datetime
fast: true
input_formats: [rfc3339, unix_timestamp]
- name: level
type: text
tokenizer: raw
- name: service
type: text
tokenizer: raw
- name: message
type: text
tokenizer: default
timestamp_field: timestamp
indexing_settings:
commit_timeout_secs: 30
search_settings:
default_search_fields: [message]
quickwit index create --index-config index-config.yaml
데이터 수집
| 방법 | 명령 |
|---|
| 파일 | quickwit index ingest --index app-logs --input-path logs.json |
| Stdin | `cat logs.json |
| 수집 API | POST /api/v1/app-logs/ingest |
| Kafka 소스 | 인덱스 구성에서 소스 정의 |
| OTLP | 로그/트레이스를 위한 네이티브 OpenTelemetry 엔드포인트 |
curl -XPOST "http://localhost:7280/api/v1/app-logs/ingest" \
--data-binary @logs.ndjson
검색
# CLI 검색
quickwit index search --index app-logs --query "level:ERROR AND service:api"
# REST 검색
curl "http://localhost:7280/api/v1/app-logs/search?query=level:ERROR&max_hits=20"
| 쿼리 구문 | 매칭 |
|---|
term | 기본 필드에서 전체 텍스트 용어 |
field:value | 정확한 필드 매칭 |
a AND b, a OR b, NOT a | 부울 로직 |
field:[10 TO 100] | 범위 |
"exact phrase" | 정확한 구문 매칭 |
field:prefix* | 접두사 매칭 |
집계 및 시간 필터
# 시간 한정 검색 (빠른 타임스탐프 필드 사용)
curl "http://localhost:7280/api/v1/app-logs/search?query=*&start_timestamp=1753400000&end_timestamp=1753486400"
Quickwit는 Elasticsearch 스타일 집계를 지원하므로 기존 대시보드와 쿼리가 거의 변경 없이 이식됩니다.
인덱스 관리
| 명령 | 설명 |
|---|
quickwit index list | 인덱스 나열 |
quickwit index describe --index X | 통계/split 표시 |
quickwit index clear --index X | 모든 문서 삭제 |
quickwit index delete --index X | 인덱스 삭제 |
quickwit split list --index X | Split 검사 |
보관
retention:
period: 90 days
schedule: daily
Split이 객체 저장소에 존재하므로 보관은 단지 오래된 split을 삭제하는 것입니다. 저렴하고 빠릅니다.
통합
| 대상 | 참고 |
|---|
| Jaeger | Quickwit는 네이티브 Jaeger 저장소 백엔드 |
| Grafana | 대시보드를 위한 데이터 소스 플러그인 |
| OpenTelemetry | 로그 및 트레이스를 위한 네이티브 OTLP 수집 |
| Elasticsearch API | 호환 검색 엔드포인트는 마이그레이션 간소화 |
Quickwit vs 대안
| 측면 | Quickwit | Elasticsearch | Loki |
|---|
| 저장소 | 객체 저장소만 | 로컬 디스크 | 객체 저장소 |
| 전체 텍스트 인덱스 | 예 (진정한 검색) | 예 | 레이블 기반, 제한됨 |
| 규모에서 비용 | 매우 낮음 | 높음 | 낮음 |
| 트레이스 | 네이티브 Jaeger 백엔드 | APM 애드온 | Tempo를 통해 |
| 최적 용도 | 저렴한 검색 가능 로그/트레이스 보관 | 일반 검색 | Grafana 네이티브 로그 |
Loki 및 OpenObserve와 비교합니다; 수집을 위해 Vector와 쌍을 이룹니다.
리소스