SeaweedFS 是否适合作为 Milvus (向量数据库) 的透明 S3 读缓存?
作者: ImYkD创建于 2026年9月28日更新于 2026年9月28日
使用案例 我们使用 Milvus(向量数据库,v2.6.21)进行生物识别搜索(1:N 面部/指纹匹配)。Milvus 将分段数据存储在 Ceph RGW S3 对象存储中。在每次搜索时,Milvus 从 S3 加载一部分(约 512MB 的分段)到 GPU VRAM 中,进行搜索,然后释放。 我们希望在 Milvus 和 Ceph 之间添加一个 读缓存层,以加快重复的分段加载。我们部署了 SeaweedFS 4.47 作为一个 S3 缓存代理,使用 tmpfs(RAM)存储。 ## 当前配置 SeaweedFS 部署:单节点(主机 + 卷 + 文件系统 + S3 网关)在 Kubernetes 上,固定到一个具有 1TB RAM 的节点。 启动命令:sh weed server -s3 -filer -dir=/data -master.volumeSizeLimitMB=30000 -master.defaultReplication=000 -volume.max=100 -volume.allowUntrustedRemoteEndpoints -filer.allowUntrustedRemoteEndpoints -s3.config=/data/s3_config.json 远程挂载:sh remote.configure -name=ceph -type=s3 -s3.endpoint=https://10.10.103.14:443 -s3.region=us-east-1 -s3.access_key=$CEPH_ACCESS_KEY -s3.secret_key=$CEPH_SECRET_KEY remote.mount -dir=/buckets/abis-milvus-storage -remote=ceph/abis-milvus-storage 存储:tmpfs(RAM 后备的 emptyDir),400Gi 限制 S3 凭据:静态 JSON 配置文件通过 -s3.config 加载 Milvus S3 配置:指向 seaweedfs-s3:8333(HTTP,无 TLS)而不是直接指向 Ceph ## 工作正常 - S3 API 工作 - Milvus 可以通过 SeaweedFS 读/写/删除 - 首次读取从 Ceph 获取,缓存到 tmpfs - 重复读取命中 tmpfs 缓存(比 Ceph 直接更快) ## 我们遇到的问题 1. 持续负载下不可靠:当 Milvus 连续发出加载+搜索+释放循环(6 个工作线程,每批 13 个分段)时,批次在分段加载时出现“上下文超时”错误。连续 13 个批次中有 10 个失败。使用 Ceph 直接(无 SeaweedFS)时,所有批次都成功。 2. 删除时缓存失效:Milvus 删除旧 WAL 分段(S3 DeleteObject),作为其垃圾收集的一部分。SeaweedFS 将这些删除转发到 Ceph,但我们不确定本地 tmpfs 缓存是否已正确失效。 过期的缓存项是否会导致读取失败? 3. remote.sync 不稳定:我们添加了 remote.sync 以将本地写入的文件上传回 Ceph 并驱逐本地副本。这需要使用 tail -f /dev/null | 编程技巧来在后台保持 weed shell 进程运行。是否有更好的方法来处理写回 + 本地驱逐? 4. Vacuum 干扰:SeaweedFS 卷清理定期运行,我们担心它可能会驱逐仍然需要的缓存数据。是否有方法来排除远程挂载路径从清理中? ## 问题 1. 是否支持此用例? 使用 SeaweedFS 作为透明的 S3 读缓存(remote.mount + tmpfs),放在另一个 S3 兼容存储(Ceph RGW)前面? 2. 对于读/写密集的缓存工作负载,有没有推荐的配置? 我们的工作负载是: ~90% 读取(分段加载), ~10% 写入/删除(WAL 文件) 3. 是否有更好的方式来处理写回 + 本地驱逐? 我们添加了 remote.sync 以将本地写入的文件上传回 Ceph 并驱逐本地副本。这需要使用 tail -f /dev/null | 编程技巧来在后台保持 weed shell 进程运行。是否有更好的方法来处理写回 + 本地驱逐? 4. Vacuum 干扰:SeaweedFS 卷清理定期运行,我们担心它可能会驱逐仍然需要的缓存数据。是否有方法来排除远程挂载路径从清理中?
内容来源: seaweedfs/seaweedfs