LLM WikiAccess-protected knowledge portal

WIKI

DragonflyDB 1.38~1.39: Redis 호환 인메모리 DB가 하이브리드 검색·Count-Min Sketch·TTL 최적화로 진화하는 방법

왜 지금 봐야 하나 Redis는 2024년 라이선스를 BSL로 전환한 뒤 오픈소스 생태계의 공백을 남겼다. Valkey Redis 포크, Linux Foundation 호스팅 가 가장 빠른 대안으로 주목받았지만, 아키텍처 측면에서 Redis의 한계인 단일 스레드 구조를 그대로 유지한다. DragonflyDB 는 다른 선택을 했다. 멀티코어 CPU를 완전히 활용하는 shared nothing 아키텍처 로 처음부터 설계했다. 48

경로human/study/content/database-frontier/61-dragonfly-1-38-1-39-hybrid-search-cms-ttl.md
카테고리Study
태그#cms #dragonfly #dragonflydb #hybrid #inmemory #kubernetes #mysql #performance #redis #search #study #ttl #vectorsearch

왜 지금 봐야 하나

Redis는 2024년 라이선스를 BSL로 전환한 뒤 오픈소스 생태계의 공백을 남겼다. Valkey(Redis 포크, Linux Foundation 호스팅)가 가장 빠른 대안으로 주목받았지만, 아키텍처 측면에서 Redis의 한계인 단일 스레드 구조를 그대로 유지한다.

DragonflyDB는 다른 선택을 했다. 멀티코어 CPU를 완전히 활용하는 shared-nothing 아키텍처로 처음부터 설계했다. 48코어 머신에서 Redis의 22배 처리량을 달성한다는 벤치마크는 단순한 마케팅이 아니라 아키텍처 차이에서 비롯된다.

v1.38.0(2026년 4월)과 v1.39.0(2026년 6월)은 두 가지 방향으로 진화했다. 하나는 확률적 자료구조(Top-K, Count-Min Sketch) 추가와 TTL 메모리 최적화이고, 다른 하나는 벡터 검색과 텍스트 검색을 하나의 쿼리로 융합하는 FT.HYBRID다. 이 챕터는 이 두 릴리스가 운영 환경에서 무엇을 바꾸는지를 다룬다.


배경: Redis와 DragonflyDB의 아키텍처 차이

Redis: 단일 스레드 이벤트 루프

Redis는 메인 스레드 하나에서 모든 클라이언트 요청을 처리한다. 이 설계는 잠금 경합(lock contention)이 없어 구현이 단순하고, 단일 코어 성능이 높은 환경에서 효율적이다. 단점은 코어를 아무리 늘려도 Redis 자체 처리량은 증가하지 않는다는 점이다. CLUSTER 모드를 쓰면 수평 확장이 가능하지만 운영 복잡도가 크게 높아진다.

DragonflyDB: Shared-Nothing 멀티코어

DragonflyDB는 CPU 코어 수만큼 독립적인 스레드(shard)를 생성한다. 각 shard는 자체 메모리 영역과 키스페이스를 담당한다. 스레드 간 공유 상태가 없기 때문에 잠금 없이 병렬 처리가 가능하다. 크로스-shard 명령(예: MGET, EVAL, 트랜잭션)은 경량 fiber 기반 코루틴으로 조율한다.

클라이언트 Redis 프로토콜 Network Layer TCP + epoll Shard Router 키 해시로 shard 결정 fiber 코루틴 조율 Shard 0 Core 0-5 Shard 1 Core 6-11 Shard N Core N*6...(N+1)*6 지원 자료구조 (Redis 호환 + 확장) Redis 호환 String, Hash, List Set, ZSet, HyperLogLog Stream, Geo Pub/Sub, Lua 스크립트 HTTL (Hash Field TTL) 확률적 구조 (v1.38) Top-K (TOPK.*) Count-Min Sketch (CMS.*) Bloom Filter (BF.*) RDB 영속성 지원 RedisBloom 호환 API 벡터 검색 (v1.38~1.39) FLAT / HNSW 인덱스 FT.SEARCH (텍스트) FT.HYBRID (텍스트+벡터) VECTOR_RANGE (반경 검색) Porter 어간 분석 (EN) 메모리 최적화 (v1.38) CompactKey 내장 TTL TTL 워크로드 26% 절감 Bloom Filter 점진 복제 PubSub 배치 응답 (v1.39) syscall 24-70% 감소
DragonflyDB Shared-Nothing 아키텍처와 FT.HYBRID 쿼리 경로

v1.38.0: 확률적 자료구조와 TTL 메모리 최적화

Top-K 스케치 (TOPK.*)

빈번히 등장하는 상위 K개 아이템을 실시간으로 추적한다. Count-Min Sketch 기반으로 근사치를 유지해 메모리를 고정 크기로 제한한다. 정확한 카운터 대신 Top-K 스케치를 쓰는 이유는 명확하다.

TOPK.RESERVE hot_items 10 100 5 0.9
# 이름, K=10, width=100, depth=5, decay=0.9

TOPK.ADD hot_items "product_A" "product_B" "product_A"
TOPK.LIST hot_items   # ["product_A", "product_B", ...]
TOPK.QUERY hot_items "product_A"  # 1 (있음)

이 기능은 RedisBloomTOPK.* API와 호환된다. RDB 스냅샷에 상태가 포함되므로 재시작 후 스케치가 유지된다.

Count-Min Sketch (CMS.*)

빈도 카운터의 확률론적 변형이다. 개별 이벤트의 발생 횟수를 추정할 때 쓴다. 실제 카운터보다 메모리가 훨씬 적다.

# 오차율 0.001%, 신뢰도 99.5%로 초기화
CMS.INITBYPROB cms_sketch 0.00001 0.995

CMS.INCRBY cms_sketch "event_A" 3 "event_B" 1
CMS.QUERY cms_sketch "event_A"  # 약 3 (추정값)
CMS.INFO cms_sketch             # width, depth, count 정보

Top-K와 CMS를 함께 쓰면 스트리밍 로그 분석, 실시간 트렌드 추적, 이상 빈도 탐지를 별도 집계 파이프라인 없이 인메모리에서 처리할 수 있다.

HTTL — 해시 필드 TTL

Redis에서 해시는 키 단위로 TTL을 설정할 수 있었지만, 필드 단위 TTL은 지원하지 않았다. DragonflyDB v1.38.0은 HTTL(Hash TTL) 명령을 추가한다.

HSET session:user123 token "abc123" created_at "2026-07-29"
HEXPIRE session:user123 3600 FIELDS 1 token
# "token" 필드는 3600초 후 자동 삭제

HTTL session:user123 FIELDS 1 token  # 남은 TTL 조회

세션 관리나 임시 자격증명 저장에서 키 전체가 아닌 특정 필드만 만료시키는 패턴이 가능해진다.

CompactKey 내장 TTL — 26% 메모리 절감

TTL이 있는 키는 내부적으로 만료 타임스탬프를 별도 자료구조에 저장했다. v1.38.0에서 이 타임스탬프를 CompactKey 구조 안에 직접 내장했다. 별도 저장 공간이 사라지면서 TTL 위주 워크로드에서 메모리 사용량이 약 26% 줄었다.

세션 캐시, 토큰 저장소처럼 거의 모든 키에 TTL이 걸리는 환경에서 효과가 두드러진다.

벡터 범위 검색 (VECTOR_RANGE)

v1.38.0은 기존 KNN(K-Nearest Neighbor) 방식 외에 반경 기반 유사도 검색을 추가한다. 특정 쿼리 벡터로부터 일정 거리 이내의 모든 벡터를 반환한다.

FT.SEARCH myindex "*=>[VECTOR_RANGE 0.3 $vec AS score]"
  SORTBY score ASC
  PARAMS 2 vec <바이너리 벡터>
  DIALECT 2

KNN이 "가장 가까운 N개"라면 VECTOR_RANGE는 "일정 거리 안에 있는 전부"다. 클러스터링, 이상 탐지, 유사 문서 집합 조회에 적합하다.


v1.39.0: FT.HYBRID와 PubSub 성능 개선

FT.HYBRID — 텍스트와 벡터 검색의 융합

v1.39.0의 가장 주목할 기능이다. 단일 쿼리에서 텍스트 검색 점수와 벡터 유사도를 결합한다. RAG 파이프라인에서 검색 품질 향상에 직접 영향을 준다.

기존 방식: 텍스트 검색과 벡터 검색을 각각 실행하고 애플리케이션에서 결과를 병합(re-rank)한다.

FT.HYBRID: 하나의 쿼리로 두 점수를 DB 레이어에서 결합한다.

FT.HYBRID myindex
  TEXT_QUERY "머신러닝 추론 최적화"
  VECTOR_FIELD embedding
  VECTOR_QUERY $vec
  FUSION_METHOD rrf          # Reciprocal Rank Fusion
  TOPK 10
  PARAMS 2 vec <임베딩 벡터>

RRF(Reciprocal Rank Fusion)은 두 랭킹 목록을 결합하는 가중치 없는 방법이다. 각 문서의 텍스트 순위와 벡터 순위에서 역수 합을 취해 최종 순위를 결정한다. 하이퍼파라미터 조정 없이 안정적인 품질을 낸다.

검색 방식강점약점
텍스트 검색 (BM25)키워드 매칭, 해석 가능의미 유사도 포착 안 됨
벡터 검색 (KNN)의미·맥락 이해정확한 키워드 매칭 약함
FT.HYBRID두 방식의 장점 결합추가 스토리지(벡터 인덱스)

Porter 어간 분석 (Stemming)

영어 텍스트 필드에 Porter Stemmer가 기본 적용된다. "running", "runs", "ran"을 모두 "run"으로 인식해 검색한다. 인덱스 정의 시 STEM 옵션을 명시하면 활성화된다.

FT.CREATE myindex ON HASH PREFIX 1 doc:
  SCHEMA
    title TEXT WEIGHT 2 STEM
    content TEXT STEM
    embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 768 DISTANCE_METRIC COSINE

한국어 어간 분석은 현재 지원되지 않는다. 영어 콘텐츠나 영어-한국어 혼합 데이터에서 영어 부분에만 효과가 있다.

PubSub 배치 응답

PubSub 메시지를 수신자에게 전달할 때 개별 syscall 대신 배치로 묶어 전송한다. 결과는 측정 가능하다.

실시간 이벤트 브로드캐스팅, 채팅 서비스, 알림 시스템처럼 Pub/Sub을 집중적으로 쓰는 워크로드에서 효과가 크다.


Redis 호환성 경계

DragonflyDB는 Redis API를 "100%에 근접하게" 지원한다고 주장하지만 운영자가 검증해야 할 차이점이 있다.

영역Redis 8.xDragonflyDB 1.39비고
핵심 자료구조전체전체호환
Lua 스크립트EVAL/EVALSHAEVAL/EVALSHA샌드박스 강화됨
Redis 모듈RedisSearch, RedisJSON 등일부 내장외부 모듈 로드 불가
Cluster Mode완전 지원미지원수직 확장으로 대체
Sentinel완전 지원미지원Kubernetes에서 직접 HA
WAIT 명령동기 복제 확인제한적Open question

가장 중요한 차이는 Cluster Mode 미지원이다. Redis에서 수평 확장을 Cluster로 했다면 DragonflyDB로의 전환은 단순 드롭인이 아니다. DragonflyDB는 단일 인스턴스로 멀티코어를 활용하기 때문에 수직 확장(더 큰 인스턴스)이 기본 전략이다.


운영 가이드

메모리 측정

Redis에서 DragonflyDB로 전환하기 전 메모리 예측이 필요하다. DragonflyDB는 자체 MEMORY USAGE 명령과 Prometheus 메트릭을 제공한다.

# 메모리 사용 현황
MEMORY USAGE mykey

# Prometheus 메트릭 스크레이프
# process_resident_memory_bytes, dragonfly_db_used_memory_bytes

TTL 워크로드 확인

v1.38.0의 CompactKey 최적화는 자동으로 적용된다. 기존 데이터는 다음 쓰기나 접근 시 점진적으로 새 구조로 이전된다. 대규모 TTL 데이터를 갖는 경우 배포 직후 메모리 프로파일이 점진적으로 개선되는 것을 확인한다.

# 복제 지연 모니터링 (v1.38 prometheus 추가)
# dragonfly_replication_lag_bytes

PubSub 배치 응답

v1.39.0에서 기본 활성화된다. 별도 설정이 필요없다. 단, 배치 전송은 응답이 미세하게 지연될 수 있다. 지연에 민감한 PubSub 워크로드에서는 실측 P99 latency를 비교한다.

Lua 샌드박스

v1.38~1.39에서 Lua 스크립트 샌드박스가 강화됐다. 이전에 의존하던 일부 Lua 함수가 차단될 수 있다. 기존 스크립트를 테스트 환경에서 먼저 검증한다.

Kubernetes 배포

DragonflyDB는 공식 Kubernetes Operator를 제공한다(v1.24.0). 싱글 인스턴스에 충분한 CPU 리소스를 할당하는 것이 핵심이다.

apiVersion: dragonflydb.io/v1alpha1
kind: Dragonfly
metadata:
  name: dragonfly-cache
spec:
  image: docker.dragonflydb.io/dragonflydb/dragonfly:v1.39.0
  replicas: 2                     # 읽기 복제본
  args:
    - --maxmemory=16gb
    - --proactor_threads=8        # 워커 코어 수 (CPU - 2 권장)
    - --replica_delete_expired    # 복제본에서 만료 키 삭제
  resources:
    requests:
      cpu: "10"
      memory: "18Gi"
    limits:
      cpu: "10"
      memory: "18Gi"

v1.38~1.39 운영 체크리스트


한 문장으로

DragonflyDB 1.38~1.39는 Redis 호환 API 위에 Count-Min Sketch·Top-K·FT.HYBRID 하이브리드 검색·TTL 26% 메모리 절감을 올려, 단일 멀티코어 인스턴스로 캐시·검색·확률적 집계를 통합하는 인메모리 데이터베이스다.

References