KiviDB
<p align="center">
<img src="https://raw.githubusercontent.com/kividbio/kividb/HEAD/assets/kiwi.png" alt="KiviDB" width="180">
</p>
KiviDB는 Rust로 작성된 Redis®와 Valkey의 빠르고 멀티스레드 대안입니다. Redis 프로토콜(RESP2 및 RESP3)을 사용하므로 기존 Redis 클라이언트, redis-cli 및 라이브러리는 변경 없이 작동하며, 전체 텍스트 검색과 벡터 검색 기능이 내장되어 있습니다. 샤딩된 인메모리 키-값 디자인으로 모든 코어에서 실행되며, 스냅샷 및 선택적 추가 전용 파일(append-only file)에 영속화됩니다.
동일한 32개 코어에서 KiviDB는 초당 21백만 개의 파이프라인 GET을 처리합니다. 이는 Redis 8 대비 약 9배, Dragonfly 대비 2.3배 수준입니다. p99 지연 시간은 Dragonfly보다 절반 이하입니다 (벤치마크).
docker run -d -p 6380:6380 kividb/kividb
redis-cli -p 6380 PING
KiviDB는 Redis의 6379가 아닌 6380 포트에서 수신 대기하므로 두 서비스를 나란히 실행할 수 있습니다. 클라이언트를 해당 포트로 지정하거나 --port 6379를 전달하세요.
- 프로토콜: Redis 호환 명령어 표면 (지원되는 명령어는 COMMANDS.md 참조)
- 검색 및 벡터: 전체 텍스트, 태그, 숫자 및 벡터(FLAT / HNSW) 검색을 위한 Redis Stack 스타일의
FT.* 명령어
- Lua 스크립팅: 선택적 Cargo 기능.
--features lua로 빌드된 경우 EVAL, SCRIPT, FUNCTION, FCALL 및 관련 명령어를 사용할 수 있습니다 ( Scripting commands (Lua) 참조)
- TLS: 선택적 Cargo 기능 (
--features tls)
- 기본 리스닝 주소:
0.0.0.0:6380, 보호 모드 활성화됨
- 라이선스: GNU Affero General Public License v3 (AGPL-3.0-only), 오픈 소스; KiviDB를 사용한다고 해서 귀하의 애플리케이션이 AGPL에 종속되는 것은 아닙니다. License 참조
Repository: github.com/kividbio/kividb · Website: kividb.io
비교 방법
| KiviDB | Redis 8 | Valkey 8 | Dragonfly | KeyDB |
|---|
| License | AGPL-3.0 | RSALv2, SSPLv1 or AGPL-3.0 | BSD-3-Clause | BSL 1.1 | BSD-3-Clause |
| ... | | | | | |
| As of October 2026. Something out of date or wrong? Please open an issue. | | | | | |
<a href="assets/benchmarks/kividb-benchmarks.mp4">
<img src="https://raw.githubusercontent.com/kividbio/kividb/HEAD/assets/benchmarks/kividb-benchmarks.webp" alt="KiviDB 벤치마크: 처리량, 지연 시간, 벡터 검색 및 벡터 수집" width="720">
</a>
처리량(Throughput), 지연 시간(latency), 벡터 검색(vector search) 및 벡터 수집(vector ingest). 전체 해상도 비디오를 클릭하세요.
아래의 모든 수치는 2026년 10월 AWS Graviton3 베어 메탈 환경에서 진행된 단일 세션 결과입니다. 서버는 c7gn.metal (64 vCPU)에 제한되어 32개 코어를 사용했으며, 부하 생성기(load generator)는 동일한 배치 그룹 내의 두 번째 c7gn.metal에서 사용되었습니다. 각 엔진은 순차적으로 서버에서 단독으로 실행되었습니다.
키-값 (Key-value)
memtier_benchmark를 kivi-benchmark의 run-matrix.sh로 실행: 1,000만 개의 키, 100바이트 값, 시나리오당 30초, 두 라운드의 평균; 파이프라인(pipelined) 연결 300개, 파이프라인 없음 1,200개.
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/benchmarks/throughput-pipelined-dark.png">
<img src="https://raw.githubusercontent.com/kividbio/kividb/HEAD/assets/benchmarks/throughput-pipelined-light.png" alt="파이프라인 처리량: KiviDB, Dragonfly, Redis, Redis Cluster" width="720">
</picture>
| ops/s | KiviDB 1.1.0 | Dragonfly 2.0.2 | Redis 8.10 | Redis Cluster (32 shards) |
|---|
| GET, pipeline 16 | 21.2M | 9.1M | 2.4M | 4.7M |
| ... | | | | |
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/benchmarks/latency-p99-pipelined-dark.png">
<img src="https://raw.githubusercontent.com/kividbio/kividb/HEAD/assets/benchmarks/latency-p99-pipelined-light.png" alt="p99 지연 시간, 파이프라인" width="720">
</picture>
벡터 검색 (Vector search)
redis/vector-db-benchmark를 사용하여
glove-25-angular (1.18M 벡터, 25 차원) 환경에서 테스트했습니다: M=16 및 EF_CONSTRUCTION=256을 사용한 HNSW 방식을 채택했으며, 100개의 클라이언트가 배치 크기 64로 데이터를 업로드하고, ef 값 64, 128, 256, 512에서 질의를 수행했습니다.
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/benchmarks/vector-qps-recall-dark.png">
<img src="https://raw.githubusercontent.com/kividbio/kividb/HEAD/assets/benchmarks/vector-qps-recall-light.png" alt="벡터 검색: 재현율(recall) 대비 초당 질의 수" width="720">
</picture>
| KiviDB 1.1.0 | Dragonfly 2.0.2 | Redis 8.10 (쿼리 엔진) |
|---|
| ef 64에서의 Queries/s (recall@10) | 59.3k (0.943) | 41.3k (0.912) | 31.8k (0.912) |
| ... | | | |
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/benchmarks/vector-ingest-dark.png">
<img src="https://raw.githubusercontent.com/kividbio/kividb/HEAD/assets/benchmarks/vector-ingest-light.png" alt="벡터 수집 시간" width="720">
</picture>
결과는 환경에 따라 달라집니다. 게시된 수치는 통제된 캡처로 간주해야 하며, 보장 사항이 아니므로 사용자의 하드웨어 및 워크로드에서 직접 측정하시기 바랍니다.
벡터 검색 (Redis Stack 스타일의 FT.*)
KiviDB는 Redis Stack과 호환되는 검색 및 벡터 명령을 구현했기 때문에 기존 클라이언트와 튜토리얼 대부분이 변경 없이 작동합니다. 이를 사용하여 해시 필드에 대한 전문 검색(BM25), 태그/숫자, 그리고 벡터 ANN(FLAT 또는 HNSW) 기능을 사용할 수 있습니다.
빠른 시작 (Quick start)
- 접두사(prefix)가 지정된 키에 인덱스를 생성합니다. 이때 최소한 하나의
VECTOR 필드(HNSW 또는 FLAT)와 선택적으로 TEXT / TAG / NUMERIC 필드를 선언해야 합니다:
edis-cli -p 6380 FT.CREATE idx ON HASH PREFIX 1 doc: SCHEMA \
vec VECTOR HNSW 10 TYPE FLOAT32 DIM 128 DISTANCE_METRIC COSINE M 16 EF_CONSTRUCTION 128
-
해시 필드에 원시 FLOAT32 리틀 엔디안 바이트로 벡터를 저장합니다 (DIM × 4 bytes). 이는 Redis Stack 및 redis-py / numpy 블롭과 동일한 규칙을 따릅니다. 클라이언트의 바이너리 안전한 HSET (통합 테스트는 tests/e2e/에 예시가 있습니다)를 사용하세요.
-
KNN으로 쿼리합니다(방언 2). 쿼리 벡터를 이름 지정된 바이너리 매개변수로 전달합니다:
redis-cli -p 6380 FT.SEARCH idx '*=>[KNN 10 @vec $q]' PARAMS 2 q <blob> DIALECT 2
전체 명령어 표면, 필터, 하이브리드 검색 및 예외 사례는 **COMMANDS.md**에 있습니다 (FT.CREATE, FT.SEARCH, FT.HYBRID 등을 검색하세요).
영속성 및 재시작
- 네이티브 스냅샷 (
dump.kdb)은 키, 인덱스 스키마와, 인덱스가 채워진 상태로 **SAVE / BGSAVE**를 실행할 경우 각 벡터 필드의 HNSW 그래프를 저장하므로, 재시작 후 검색 품질이 종료 전의 그래프와 일치합니다.
- 검색 인덱스를 시작 시 다시 구축하는 동안 대부분의 명령어는 재구축이 완료될 때까지 **
LOADING**을 반환하지만, PING, INFO 및 몇몇 다른 명령어는 여전히 작동합니다.
- 대규모 데이터 수집(ingest) 후에는 다음 시작 시 해시에서 그래프를 다시 구축하는 대신 디스크에서 로드하도록
SAVE (또는 BGSAVE 예약)를 실행하세요.
빌드
KiviDB는 빌드 시 Cargo 기능을 통해 선택되는 네 가지 변형으로 제공됩니다:
| Variant | Cargo features | Adds |
|---|
default | none | Lua 또는 TLS가 없는 핵심 서버 |
| ... | | |
빌드 시 Lua가 없으면 스크립팅 명령이 오류를 반환합니다. TLS가 없는 빌드는 평문으로 서비스를 제공하는 대신 --tls-port가 주어지면 시작을 거부합니다. | | |
소스에서 빌드하기
stable Rust 툴체인(rust-toolchain.toml은 rustfmt 및 clippy와 함께 stable을 선택함)이 필요합니다. 이 크레이트는 2024 edition을 사용하며, 가장 오래된 툴체인은 Dockerfile가 빌드하는 버전인 Rust 1.89입니다.
git clone https://github.com/kividbio/kividb.git
cd kividb
...
Linux 환경에서 서버는 커널이 허용하는 경우 io_uring을 사용하며, 그렇지 않으면 Tokio로 폴백합니다 (기본값인 --io-model auto).
Docker 이미지를 직접 빌드하려면 docker build -t kividb . 명령어로 기본 변형(default variant)을 빌드하고, docker build --build-arg KIVIDB_FEATURES=lua,tls -t kividb:full . 명령어로 다른 버전을 빌드합니다.
KiviDB 실행하기
./target/release/kividb
redis-cli -p 6380 PING
모든 Redis 클라이언트가 작동하며, 포트 6380으로 연결하면 됩니다.
보호 모드 (Protected mode)
보호 모드는 Redis와 마찬가지로 기본적으로 **활성화(on)**되어 있습니다. 이 기능이 활성화된 상태에서는 바인딩 주소(bind address)가 설정되지 않았으며 (--bind 또는 설정 파일의 bind), default 사용자는 비밀번호가 없습니다. 오직 동일한 머신에 있는 클라이언트(loopback)만 연결할 수 있습니다. 다른 모든 클라이언트는 옵션을 설명하는 -DENIED 오류를 받고 연결이 끊어집니다.
다른 머신의 클라이언트를 허용하려면 다음 중 하나를 수행해야 합니다:
- 비밀번호 설정:
--requirepass <비밀번호> 또는 ACL SETUSER default ><비밀번호>;
- 바인딩 주소 설정:
--bind <주소>;
- 보호 모드 비활성화:
--protected-mode no, 설정 파일의 protected-mode no로 지정, 또는 로컬 클라이언트에서 CONFIG SET protected-mode no를 실행합니다.
만약 이 기능을 끄거나 공용 주소에 바인딩하는 경우, 서버가 비밀번호 없이 인터넷으로부터 접근할 수 없도록 확실히 조치해야 합니다.
Docker
이미지는 Docker Hub와 GitHub Container Registry에 게시되며, 두 곳 모두 동일한 태그를 사용합니다:
docker pull kividb/kividb:latest
docker pull ghcr.io/kividbio/kividb:latest
latest와 같은 버전 태그(예: v1.1.0)가 기본 변형이며, v1.1.0-lua, v1.1.0-tls, v1.1.0-full이 다른 버전들입니다. 이미지는 amd64와 arm64용으로 빌드됩니다.
docker run -p 6380:6380 kividb/kividb
컨테이너는 루프백(loopback)을 통해서가 아닌 네트워크를 통해 접근되므로, 이미지의 기본 명령어는 --protected-mode no입니다. 사용자가 전달하는 인수가 이 기본값을 대체하며, 이는 보호 모드를 다시 활성화합니다. 사용자 지정 플래그를 전달할 때는 비밀번호를 설정하거나(권장) 직접 --protected-mode no를 추가하십시오:
docker run -p 6380:6380 ghcr.io/kividbio/kividb \
--requirepass "change-me" \
--databases 8 \
...
AOF 영속성(persistence) 사용 시 (데이터가 재시작 후에도 유지되도록 볼륨을 마운트하고, 서버는 /home/kividb의 kividb 사용자로 실행됨):
docker run -p 6380:6380 \
-v $(pwd)/data:/home/kividb \
ghcr.io/kividbio/kividb --aof --requirepass "change-me"
--aof를 사용하면 모든 쓰기 작업이 appendonly.aof에 추가되고 파일은 시작 시 재생되므로, 스냅샷 이후의 모든 데이터가 손실되는 대신 최대 마지막 1초 분량의 쓰기 작업(fsync 간격)만 손실됩니다. AOF가 존재하는 경우 이것이 진실의 원천(source of truth)이며 스냅샷은 로드되지 않습니다. 자세한 내용은 docs/PERSISTENCE.md를 참조하십시오.
컨테이너 내 io_uring: Docker의 기본 seccomp 프로파일은 최신 버전에서 io_uring을 차단하며, KiviDB는 토키오(Tokio)로 폴백합니다. Linux 호스트에서 이를 허용하려면 --security-opt seccomp=unconfined를 사용하여 실행하십시오 (운영 환경에 사용하기 전에 이것이 무엇을 허용하는지 이해하십시오).
릴리스 바이너리
Linux(x86_64, aarch64) 및 macOS(Apple silicon, Intel)용 릴리스 바이너리는 GitHub Releases에 게시됩니다. 아래의 latest/download 링크는 항상 최신 릴리스로 해결되며, 버전을 고정하려면 latest/download를 download/v1.1.0으로 대체하십시오.
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb-linux-x86_64.tar.gz
tar xzf kividb-linux-x86_64.tar.gz
...
기본값 외의 각 변형(variant)은 파일 이름에 포함되어 있습니다: kividb-lua-linux-x86_64.tar.gz, kividb-tls-..., kividb-full-.... 기본 변형은 또한 Linux용으로 kividb_amd64.deb / kividb_arm64.deb 및 kividb.x86_64.rpm / kividb.aarch64.rpm으로 패키징되었으며, 이는 packaging/nfpm.yaml에서 nfpm을 사용하여 빌드되었습니다. SHA256SUMS.txt 파일은 릴리스의 모든 파일에 대한 체크섬(checksum) 목록을 제공합니다.
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb_amd64.deb && sudo dpkg -i kividb_amd64.deb
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb.x86_64.rpm && sudo rpm -i kividb.x86_64.rpm
설정 (Configuration)
KiviDB는 명령줄 플래그(command-line flags) 또는 Redis 스타일의 설정 파일로 구성할 수 있습니다 (예: port 6380 또는 appendonly yes와 같이 줄마다 하나의 지시어(directive)). 이 파일은 /etc/kividb/kividb.conf에서 읽으며, --configfile <경로>를 사용하면 다른 파일을 지정할 수 있습니다. 명령줄에 제공된 플래그가 파일 내의 동일한 설정보다 우선합니다. 전체 목록을 보려면 kividb --help를 실행하세요.
| 플래그 (Flag) | 기본값 (Default) | 설명 (Description) |
|---|
--port | 6380 | 리스닝할 포트 (Port to listen on) |
| ... | | |
TLS