[LanBuffer]: 基于对象存储的高性能检索引擎

LanBuffer 是什么?

http://lanbuffer.infio.cloud

LanBuffer 是一个以对象存储为核心的检索引擎,灵感来自 turbopuffer

它把所有持久化状态放在 S3 兼容的对象存储上,用内存和 NVMe 作为计算侧缓存——热数据快,冷数据便宜。底层基于 Lance 格式,同时支持向量搜索、全文检索和混合查询。

query -> vector search + full-text search -> hybrid merge -> top-k docs

核心思路很简单:存储和计算分离,状态全在对象存储,计算节点无状态。

架构

                        ╔═ lanbuffer ═══════════════════════════════╗
╔════════════╗          ║                                           ║
║  client(s) ║──API──▶  ║  ┏━━━━━━━━━━━━━━━┓     ┏━━━━━━━━━━━━━━┓   ║
║            ║          ║  ┃  Memory /     ┃◀──▶ ┃     Lance    ┃   ║
╚════════════╝          ║  ┃  NVMe Cache   ┃     ┗━━━━━━━━━━━━━━┛   ║
                        ║  ┗━━━━━━━━━━━━━━━┛              │         ║
                        ║                     ┌───────────▼───────┐ ║
                        ║                     │ Object Storage    │ ║
                        ║                     │ (S3)              │ ║
                        ║                     └───────────────────┘ ║
                        ╚═══════════════════════════════════════════╝

一个 LanBuffer 实例对外暴露四种协议,共享同一个核心:

协议端口用途
HTTP (Table API)7001向量搜索 / 全文检索,兼容 LanceDB
HTTP (KV API)7002CRUD / prefix scan
NFS/9P/NBD-文件系统挂载
gRPC (Admin)7000checkpoint、统计信息

不需要为每种访问模式跑不同的服务,一个进程搞定。

核心特性

内置加密与压缩。 写入路径:数据 -> LZ4/Zstd 压缩 -> XChaCha20-Poly1305 加密 -> 缓存 -> 对象存储。读取路径反过来。密钥由 Argon2id 从密码派生,全程透明,应用层不需要处理。

多级缓存。 内存 + NVMe 两级缓存加速热数据访问。缓存大小在配置文件中指定,冷数据按需从 S3 拉取。

时间点恢复。 通过命名 checkpoint 做快照,可以随时回滚到之前的状态:

time --------------------------------------------------------->

t0  write data
t1  checkpoint "before-upgrade"  o
t2  write more data
t3  checkpoint "daily"           o

restore("before-upgrade") -> state at t1

多云后端。 支持 AWS S3、Cloudflare R2、Google GCS、Azure Blob Storage。

快速开始

安装:

curl -fsSL https://raw.githubusercontent.com/duanfuxiang0/lanbuffer-release/main/install.sh | bash

初始化配置:

lanbuffer init

编辑 ~/.config/lanbuffer/.env,填入存储凭证:

LANBUFFER_PASSWORD=your_encryption_password
STORAGE_URL=s3://your-bucket/lanbuffer-data
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key

启动:

lanbuffer run

试一下 KV API:

# 写入
curl -X PUT http://127.0.0.1:7002/kv/v1/keys/hello -d 'world'

# 读取
curl http://127.0.0.1:7002/kv/v1/keys/hello

试一下 Table API(向量搜索):

import * as lancedb from "@lancedb/lancedb";

const db = await lancedb.connect("lanbuff://127.0.0.1:7001");
const tbl = await db.createTable("items", [
  { vector: [3.1, 4.1], item: "foo", price: 10.0 },
  { vector: [5.9, 26.5], item: "bar", price: 20.0 },
], { mode: "overwrite" });

const results = await tbl.search([3.0, 4.0]).limit(5).toArray();

挂载为文件系统:

sudo mount -t nfs -o port=2049,mountport=2049,nfsvers=3,tcp 127.0.0.1:/ /mnt/lanbuffer

为什么做 LanBuffer

现有的向量数据库要么需要自己维护有状态的集群(Milvus、Qdrant),要么是纯 SaaS 无法自托管(Pinecone)。turbopuffer 提出了一个好的方向:把状态卸载到对象存储,计算节点做成无状态,既降低运维成本又能弹性伸缩。

LanBuffer 沿着这个方向,基于 Lance 格式实现了检索能力,同时扩展了 KV 和文件系统接口,让它不只是一个向量数据库,而是一个通用的存储检索服务。

更多信息见 LanBuffer

[PGLite-Native]: 嵌入式版本 PostgreSQL
[LanMachine]: 一个简易版本的 Agent 虚拟机