前不久,被誉为开源对象存储系统界瑞士军刀的MinIO 在 GitHub的 README中,增加了这样一段话:
This project is currently under maintenance and is not accepting new changes.
说白了,就是项目部搞新功能、不搞PR,进入仅维护的摆烂状态了。
对于默认使用 MinIO 的 Milvus 用户来说,是时候看看有没有别的选择了。本文将探索 RustFS 作为替代方案的可行性。
备注:RustFS 目前仍处于实验性阶段,本文更多是技术探索而非生产推荐。
Milvus 2.6 完全采用存储计算分离架构,这是云原生数据库的典型设计模式。存储层由三个独立组件构成:etcd 负责元数据存储,Pulsar/Kafka 承担流式日志,而对象存储(MinIO/S3)则持久化向量数据和索引文件。
对象存储是Milvus 唯一的持久化存储,向量原始数据以 binlog 格式存储,HNSW、IVF_FLAT 等索引结构也保存于此。其次,它支撑了计算节点的无状态化——Query Node 可以随时扩缩容,因为数据不在本地,而是按需从对象存储加载,这带来了弹性伸缩、快速故障恢复和动态负载均衡的能力。
my-milvus-bucket/├──files/#rootPath(默认值)│├──insert_log/#插入数据binlog││└──{Collection_ID}/││└──{Partition_ID}/││└──{Segment_ID}/││└──{Field_ID}/││└──{Log_ID}#每个字段的binlog文件│││├──delta_log/#删除数据binlog││└──{Collection_ID}/││└──{Partition_ID}/││└──{Segment_ID}/││└──{Log_ID}│││├──stats_log/#统计信息(如bloomfilter)││└──{Collection_ID}/││└──{Partition_ID}/││└──{Segment_ID}/││└──{Field_ID}/││└──{Log_ID}│││└──index_files/#索引文件│└──{Build_ID}_{Index_Version}_{Segment_ID}_{Field_ID}/│├──index_file_0│├──index_file_1│└──...Milvus 选择 S3 API 作为对象存储接口,而非自定义协议,是因为 S3 已成为事实上的对象存储标准。AWS S3、阿里云 OSS、腾讯云 COS 都原生支持,开源实现如 MinIO、Ceph RGW、SeaweedFS 也完全兼容。成熟的 Go SDK 让 Milvus 只需调用标准接口,无需为每个存储后端单独适配。
通过抽象 S3 API,用户可以自由选择对象存储实现:开发环境用本地 MinIO,生产环境用 AWS S3 或阿里云 OSS,私有化部署则可选 Ceph 或 RustFS。只要提供符合 S3 API 的 endpoint,Milvus 完全不关心底层是什么存储。
#Milvus配置文件milvus.yamlminio:address:localhostport:9000accessKeyID:minioadminsecretAccessKey:minioadminuseSSL:falsebucketName:milvus-bucket
项目地址:https://github.com/rustfs/rustfs
RustFS 是一个使用 Rust 编写的分布式对象存储系统,目前处于 Alpha 阶段(版本 1.0.0.alpha.68)。它的定位是结合 MinIO 的简洁性与 Rust 的内存安全和高性能。
需要明确的是:RustFS 目前仍在快速迭代,分布式模式尚未正式发布,不建议直接用于生产环境的核心业务。
RustFS 采用了与 MinIO 类似的架构:HTTP Server 提供 S3 兼容接口,Object Manager 管理对象元数据,Storage Engine 处理数据块,底层依赖 XFS/ext4 文件系统。分布式模式规划使用 etcd 进行元数据协调,多个 RustFS 节点组成集群。
在决定测试替换之前,我们需要验证 RustFS 是否满足 Milvus 的核心需求:
RustFS 的S3 API 实现满足 Milvus 的基本需求,可以进行实战测试。
本实战目标是替换默认 Minio 对象存储服务,使用 rustfs 对象存储部署 Milvus2.6.7 版本。
环境准备:
1.Docker &Docker-Compose 已安装(版本≥20.10),能够正常拉取镜像并运行容器。
2。用于挂载对象数据的本地路径/volume/data/(或自定义路径)
3。确保主机端口 9000 对外部访问开放(或与自定义端口一致)。
4.RustFS 容器以非 root 用户rustfs,请确保主机目录的所有者已更改为10001
#创建项目目录mkdir-pmilvus-rustfs&&cdmilvus-rustfs#创建数据目录mkdir-pvolumes/{rustfs,etcd,milvus}#修改rustfs目录权限sudochown-R10001:10001volumes/rustfswgethttps://github.com/milvus-io/milvus/releases/download/v2.6.7/milvus-standalone-docker-compose.yml-Odocker-compose.yml
说明:ak-sk 需要和 milvus 服务保持一致
rustfs:container_name:milvus-rustfsimage:registry.cn-hangzhou.aliyuncs.com/rustfs/rustfs:latestenvironment:RUSTFS_ACCESS_KEY:minioadminRUSTFS_SECRET_KEY:minioadminRUSTFS_CONSOLE_ENABLE:“true”RUSTFS_REGION:us-east-1#RUSTFS_SERVER_DOMAINS:localhost#可选,本地部署可不配置ports:-“9001:9001”-“9000:9000”volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/rustfs:/datacommand:>--address:9000--console-enable/datahealthcheck:test:[“CMD”,“curl”,“-f”,“http://localhost:9000/health"]interval:30stimeout:20sretries:3说明:Milvus 存储部分代码仍然默认支持 Minio,暂时不支持自定义 aksk。
version:‘3.5’services:etcd:container_name:milvus-etcdimage:registry.cn-hangzhou.aliyuncs.com/etcd/etcd:v3.5.25environment:-ETCD_AUTO_COMPACTION_MODE=revision-ETCD_AUTO_COMPACTION_RETENTION=1000-ETCD_QUOTA_BACKEND_BYTES=4294967296-ETCD_SNAPSHOT_COUNT=50000volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcdcommand:etcd-advertise-client-urls=http://etcd:2379-listen-client-urlshttp://0.0.0.0:2379--data-dir/etcdhealthcheck:test:[“CMD”,“etcdctl”,“endpoint”,“health”]interval:30stimeout:20sretries:3rustfs:container_name:milvus-rustfsimage:registry.cn-hangzhou.aliyuncs.com/rustfs/rustfs:latestenvironment:RUSTFS_ACCESS_KEY:minioadminRUSTFS_SECRET_KEY:minioadminRUSTFS_CONSOLE_ENABLE:“true”RUSTFS_REGION:us-east-1#RUSTFS_SERVER_DOMAINS:localhost#可选,本地部署可不配置ports:-“9001:9001”-“9000:9000”volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/rustfs:/datacommand:>--address:9000--console-enable/datahealthcheck:test:[“CMD”,“curl”,“-f”,“http://localhost:9000/health"]interval:30stimeout:20sretries:3standalone:container_name:milvus-standaloneimage:registry.cn-hangzhou.aliyuncs.com/milvus/milvus:v2.6.7command:[”milvus“,”run“,”standalone“]security_opt:-seccomp:unconfinedenvironment:MINIO_REGION:us-east-1ETCD_ENDPOINTS:etcd:2379MINIO_ADDRESS:rustfs:9000MINIO_ACCESS_KEY:minioadminMINIO_SECRET_KEY:minioadminMINIO_USE_SSL:”false“MQ_TYPE:rocksmqvolumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvushealthcheck:test:[”CMD“,”curl“,”-f“,”http://localhost:9091/healthz"]interval:30sstart_period:90stimeout:20sretries:3ports:-“19530:19530”-“9091:9091”depends_on:-“etcd”-“rustfs”networks:default:name:milvusdocker-compose-fdocker-compose.yamlup-d
docker-composeps-a
说明:账号密码是 minioadmin
http://localhost:9001
frompymilvusimportconnections,Collection,FieldSchema,CollectionSchema,DataType#连接Milvusconnections.connect(alias=“default”,host=‘localhost’,port=‘19530’)print(“✓成功连接到Milvus!”)#创建测试集合fields=[FieldSchema(name=“id”,dtype=DataType.INT64,is_primary=True,auto_id=True),FieldSchema(name=“embedding”,dtype=DataType.FLOAT_VECTOR,dim=128)]schema=CollectionSchema(fields=fields,description=“testcollection”)collection=Collection(name=“test_collection”,schema=schema)print(“✓成功创建集合!”)print(“✓RustFS作为S3存储工作正常!”)
在相同硬件配置(16C/32GB/NVMe SSD)上部署两套Milvus,分别使用 RustFS 和 MinIO 作为对象存储后端。测试数据规模为 1,000,000 × 768 维向量,HNSW 索引(M=16, efConstruction=200),batch=5000。
关注指标:Insert 吞吐量、Index Build 耗时、Load 冷/热启动时间、Search 延迟、存储占用。
说明:仅展示核心部分
defmilvus_load_bench(dim=768,rows=1_000_000,batch=5000):collection=Collection(...)#插入测试t0=time.perf_counter()foriinrange(0,rows,batch):collection.insert([rng.random((batch,dim),dtype=np.float32).tolist()])insert_time=time.perf_counter()-t0#索引构建collection.flush()collection.create_index(field_name="embedding",index_params={"index_type":"HNSW",...})#Load测试(冷启动+2次热启动)collection.release()load_times=[]foriinrange(3):ifi>0:collection.release();time.sleep(2)collection.load()load_times.append(...)#查询测试search_times=[]for_inrange(3):collection.search(queries,limit=10,...)测试命令#RustFS:--port19530--s3-endpointhttp://localhost:9000--s3-bucketbench#MinIO:--port19531--s3-endpointhttp://localhost:9001--s3-bucketa-bucketpythonbench.pymilvus-load-bench--dim768--rows1000000--batch5000\--index-typeHNSW--repeat-load3--release-before-load--do-search--drop-after
rustfs
Minio
RustFS 优势:写入快57%,存储省57%,热启动快67%。适合写入密集、成本敏感场景。
RustFS 短板:查询慢330%(7.96ms vs 1.85ms),且存在波动(第3轮达17.14ms)。索引构建慢43%。不适合查询密集型应用。
MinIO 优势:查询性能碾压(1.85ms),小文件随机读写优化成熟,生态完善。
RustFS 在写入性能和存储效率上显著优于 MinIO(均快/省57%),证明 Rust 生态的系统级优势。但查询延迟差距达330%,限制了其在查询密集型场景的应用。
生产环境优先推荐云厂商对象存储(AWS S3、阿里云 OSS 等),成熟稳定且免运维。自建方案适用于特定场景:成本敏感或写入为主可考虑 RustFS,查询密集型选MinIO,数据主权要求选 Ceph。RustFS 随机读性能优化后,有潜力成为自建方案的有力选择。
Milvus 依赖 S3 兼容的对象存储,但 S3 API 标准化使其可灵活切换后端。
整体的MinIO 替换方案商,生产环境优先推荐云厂商对象存储(AWS S3、阿里云 OSS 等),成熟免运维。
自建方案(MinIO/Ceph)适合成本敏感或数据主权场景,但需承担运维成本和技术风险。
RustFS 虽有Apache 2.0 许可证和 Rust 优势,但仍处于 Alpha 阶段,查询性能差距明显,分布式模式未发布,不建议用于生产环境。可作为技术储备关注。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |