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) | 7002 | CRUD / prefix scan |
| NFS/9P/NBD | - | 文件系统挂载 |
| gRPC (Admin) | 7000 | checkpoint、统计信息 |
不需要为每种访问模式跑不同的服务,一个进程搞定。
内置加密与压缩。 写入路径:数据 -> 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
现有的向量数据库要么需要自己维护有状态的集群(Milvus、Qdrant),要么是纯 SaaS 无法自托管(Pinecone)。turbopuffer 提出了一个好的方向:把状态卸载到对象存储,计算节点做成无状态,既降低运维成本又能弹性伸缩。
LanBuffer 沿着这个方向,基于 Lance 格式实现了检索能力,同时扩展了 KV 和文件系统接口,让它不只是一个向量数据库,而是一个通用的存储检索服务。
更多信息见 LanBuffer 。