Milvus
Zilliz
  • Home
  • Blog
  • MinIO smette di accettare le modifiche della comunità: Valutazione di RustFS come backend di archiviazione degli oggetti compatibile con S3 per Milvus

MinIO smette di accettare le modifiche della comunità: Valutazione di RustFS come backend di archiviazione degli oggetti compatibile con S3 per Milvus

  • Tutorials
January 14, 2026
Min Yin

Questo post è stato scritto da Min Yin, uno dei più attivi collaboratori della comunità di Milvus, e viene pubblicato qui con l'autorizzazione.

MinIO è un sistema di archiviazione a oggetti open-source, ad alte prestazioni e compatibile con S3, ampiamente utilizzato in AI/ML, analisi e altri carichi di lavoro ad alta intensità di dati. Per molte implementazioni di Milvus, è stato anche la scelta predefinita per lo storage di oggetti. Recentemente, tuttavia, il team di MinIO ha aggiornato il suo README su GitHub per dichiarare che questo progetto non accetta più nuove modifiche.

In realtà, nel corso degli ultimi anni, MinIO ha gradualmente spostato la sua attenzione verso le offerte commerciali, rafforzando il suo modello di licenza e distribuzione e riducendo lo sviluppo attivo nel repository della comunità. Il passaggio del progetto open-source alla modalità di manutenzione è il risultato naturale di questa transizione più ampia.

Per gli utenti di Milvus che si affidano a MinIO di default, questo cambiamento è difficile da ignorare. Lo storage di oggetti è il cuore del livello di persistenza di Milvus e la sua affidabilità nel tempo dipende non solo da ciò che funziona oggi, ma anche dal fatto che il sistema continui a evolversi insieme ai carichi di lavoro che supporta.

In questo contesto, questo articolo esplora RustFS come potenziale alternativa. RustFS è un sistema di archiviazione di oggetti compatibile con S3 e basato su Rust che enfatizza la sicurezza della memoria e la progettazione di sistemi moderni. È ancora sperimentale e questa discussione non è una raccomandazione per la produzione.

L'architettura di Milvus e la posizione del componente di archiviazione degli oggetti

Milvus 2.6 adotta un'architettura storage-compute completamente disaccoppiata. In questo modello, il livello di archiviazione è composto da tre componenti indipendenti, ognuno dei quali svolge un ruolo distinto.

Etcd memorizza i metadati, Pulsar o Kafka gestisce i log in streaming e lo storage degli oggetti, tipicamente MinIO o un servizio compatibile con S3, fornisce una persistenza duratura per i dati vettoriali e i file di indice. Poiché lo storage e l'elaborazione sono separati, Milvus può scalare i nodi di elaborazione in modo indipendente, pur facendo affidamento su un backend di storage condiviso e affidabile.

Il ruolo dello storage a oggetti in Milvus

L'archiviazione a oggetti è il livello di archiviazione durevole di Milvus. I dati vettoriali grezzi sono conservati come binlog e le strutture di indice, come HNSW e IVF_FLAT, sono anch'esse memorizzate.

Questo design rende i nodi di calcolo senza stato. I nodi di interrogazione non memorizzano i dati localmente, ma caricano segmenti e indici dallo storage degli oggetti su richiesta. Di conseguenza, i nodi possono aumentare o diminuire liberamente, riprendersi rapidamente dai guasti e supportare il bilanciamento dinamico del carico in tutto il cluster senza riequilibrare i dati a livello di storage.

my-milvus-bucket/
├── files/                          # rootPath (default)
│   ├── insert_log/                 # insert binlogs
│   │   └── {Collection_ID}/
│   │       └── {Partition_ID}/
│   │           └── {Segment_ID}/
│   │               └── {Field_ID}/
│   │                   └── {Log_ID}     # Per-field binlog files
│   │
│   ├── delta_log/                  # Delete binlogs
│   │   └── {Collection_ID}/
│   │       └── {Partition_ID}/
│   │           └── {Segment_ID}/
│   │               └── {Log_ID}        
│   │
│   ├── stats_log/                  # Statistical data (e.g., Bloom filters)
│   │   └── {Collection_ID}/
│   │       └── {Partition_ID}/
│   │           └── {Segment_ID}/
│   │               └── {Field_ID}/
│   │                   └── {Log_ID}
│   │
│   └── index_files/                # Index files
│       └── {Build_ID}_{Index_Version}_{Segment_ID}_{Field_ID}/
│           ├── index_file_0
│           ├── index_file_1
│           └── ...

Perché Milvus utilizza l'API S3

Invece di definire un protocollo di archiviazione personalizzato, Milvus utilizza l'API S3 come interfaccia di archiviazione degli oggetti. S3 è diventato lo standard di fatto per l'archiviazione degli oggetti: i principali fornitori di cloud come AWS S3, Alibaba Cloud OSS e Tencent Cloud COS lo supportano in modo nativo, mentre i sistemi open-source come MinIO, Ceph RGW, SeaweedFS e RustFS sono pienamente compatibili.

Standardizzando l'API S3, Milvus può contare su SDK Go maturi e ben collaudati, invece di mantenere integrazioni separate per ogni backend di storage. Questa astrazione offre agli utenti anche flessibilità di distribuzione: MinIO per lo sviluppo locale, cloud object storage in produzione o Ceph e RustFS per gli ambienti privati. Finché è disponibile un endpoint compatibile con S3, Milvus non ha bisogno di sapere, o di interessarsi, a quale sistema di archiviazione viene utilizzato.

# Milvus configuration file milvus.yaml
minio:
 address: localhost
 port: 9000
 accessKeyID: minioadmin
 secretAccessKey: minioadmin
 useSSL: false
 bucketName: milvus-bucket

Valutazione di RustFS come backend di archiviazione a oggetti compatibile con S3 per Milvus

Panoramica del progetto

RustFS è un sistema di archiviazione distribuita di oggetti scritto in Rust. Attualmente è in fase alfa (versione 1.0.0-alpha.68) e mira a combinare la semplicità operativa di MinIO con i punti di forza di Rust in termini di sicurezza della memoria e prestazioni. Maggiori dettagli sono disponibili su GitHub.

RustFS è ancora in fase di sviluppo attivo e la sua modalità distribuita non è ancora stata rilasciata ufficialmente. Di conseguenza, RustFS non è raccomandato per la produzione o per carichi di lavoro mission-critical in questa fase.

Design dell'architettura

RustFS segue un design concettualmente simile a MinIO. Un server HTTP espone un'API compatibile con S3, mentre un Object Manager gestisce i metadati degli oggetti e uno Storage Engine è responsabile della gestione dei blocchi di dati. A livello di storage, RustFS si basa su file system standard come XFS o ext4.

Per la modalità distribuita prevista, RustFS intende utilizzare etcd per il coordinamento dei metadati, con più nodi RustFS che formano un cluster. Questo design si allinea strettamente alle comuni architetture di archiviazione di oggetti, rendendo RustFS familiare agli utenti con esperienza MinIO.

Compatibilità con Milvus

Prima di considerare RustFS come backend alternativo per l'archiviazione degli oggetti, è necessario valutare se soddisfa i requisiti di archiviazione fondamentali di Milvus.

Requisiti di MilvusAPI S3Supporto RustFS
Persistenza dei dati vettorialiPutObject, GetObjectCompletamente supportato
Gestione dei file indiceListObjects, DeleteObject✅ Completamente supportato
Operazioni di unione dei segmentiCaricamento multiparte✅ Completamente supportato
Garanzie di coerenzaForte lettura-dopo-scritturaForte coerenza (singolo nodo)

Sulla base di questa valutazione, l'attuale implementazione dell'API S3 di RustFS soddisfa i requisiti funzionali di base di Milvus. Ciò la rende adatta a test pratici in ambienti non di produzione.

Esercitazione pratica: sostituzione di MinIO con RustFS in Milvus

L'obiettivo di questo esercizio è quello di sostituire il servizio predefinito di archiviazione degli oggetti MinIO e distribuire Milvus 2.6.7 utilizzando RustFS come backend di archiviazione degli oggetti.

Prerequisiti

  1. Docker e Docker Compose sono installati (versione ≥ 20.10) e il sistema può estrarre le immagini ed eseguire normalmente i container.

  2. È disponibile una directory locale per l'archiviazione dei dati degli oggetti, come /volume/data/ (o un percorso personalizzato).

  3. La porta 9000 dell'host è aperta per l'accesso esterno o una porta alternativa è configurata di conseguenza.

  4. Il contenitore RustFS viene eseguito come utente non root (rustfs). Assicurarsi che la directory dei dati dell'host sia di proprietà dell'UID 10001.

Passo 1: Creare la directory dei dati e impostare i permessi

# Create the project directory
mkdir -p milvus-rustfs && cd milvus-rustfs
# Create the data directory
mkdir -p volumes/{rustfs, etcd, milvus}
# Update permissions for the RustFS directory
sudo chown -R 10001:10001 volumes/rustfs

Scaricare il file Docker Compose ufficiale

wget https://github.com/milvus-io/milvus/releases/download/v2.6.7/milvus-standalone-docker-compose.yml -O docker-compose.yml

Passo 2: modificare il servizio di archiviazione a oggetti

Definire il servizio RustFS

Nota: Assicurarsi che la chiave di accesso e la chiave segreta corrispondano alle credenziali configurate nel servizio Milvus.

rustfs:
 container_name: milvus-rustfs
 image: registry.cn-hangzhou.aliyuncs.com/rustfs/rustfs: latest
 environment:
 RUSTFS_ACCESS_KEY: minioadmin
 RUSTFS_SECRET_KEY: minioadmin
 RUSTFS_CONSOLE_ENABLE: “true”
 RUSTFS_REGION: us-east-1
 # RUSTFS_SERVER_DOMAINS: localhost# Optional; not required for local deployments
 ports:
 - “9001:9001”
 - “9000:9000”
 volumes:
 - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/rustfs:/data
 command: >
 --address :9000
 --console-enable
 /data
 healthcheck:
 test: [“CMD”, “curl”, “-f”, “http://localhost:9000/health"]
 interval: 30s
 timeout: 20s
 retries: 3

Completare la configurazione

Nota: la configurazione dello storage di Milvus assume attualmente valori predefiniti di tipo MinIO e non consente ancora valori personalizzati per la chiave di accesso o la chiave segreta. Quando si usa RustFS come sostituto, si devono usare le stesse credenziali predefinite previste da Milvus.

version: ‘3.5’
services:
 etcd:
 container_name: milvus-etcd
 image: registry.cn-hangzhou.aliyuncs.com/etcd/etcd: v3.5.25
 environment:
 - ETCD_AUTO_COMPACTION_MODE=revision
 - ETCD_AUTO_COMPACTION_RETENTION=1000
 - ETCD_QUOTA_BACKEND_BYTES=4294967296
 - ETCD_SNAPSHOT_COUNT=50000
 volumes:
 - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
 command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
 healthcheck:
 test: [“CMD”, “etcdctl”, “endpoint”, “health”]
 interval: 30s
 timeout: 20s
 retries: 3
 rustfs:
 container_name: milvus-rustfs
 image: registry.cn-hangzhou.aliyuncs.com/rustfs/rustfs: latest
 environment:
 RUSTFS_ACCESS_KEY: minioadmin
 RUSTFS_SECRET_KEY: minioadmin
 RUSTFS_CONSOLE_ENABLE: “true”
 RUSTFS_REGION: us-east-1
 # RUSTFS_SERVER_DOMAINS: localhost# Optional; not required for local deployments
 ports:
 - “9001:9001”
 - “9000:9000”
 volumes:
 - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/rustfs:/data
 command: >
 --address :9000
 --console-enable
 /data
 healthcheck:
 test: [“CMD”, “curl”, “-f”, “http://localhost:9000/health"]
 interval: 30s
 timeout: 20s
 retries: 3
 standalone:
 container_name: milvus-standalone
 image: registry.cn-hangzhou.aliyuncs.com/milvus/milvus: v2.6.7
 command: [”milvus“, ”run“, ”standalone“]
 security_opt:
 - seccomp: unconfined
 environment:
 MINIO_REGION: us-east-1
 ETCD_ENDPOINTS: etcd:2379
 MINIO_ADDRESS: rustfs:9000
 MINIO_ACCESS_KEY: minioadmin
 MINIO_SECRET_KEY: minioadmin
 MINIO_USE_SSL: ”false“
 MQ_TYPE: rocksmq
 volumes:
 - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
 healthcheck:
 test: [”CMD“, ”curl“, ”-f“, ”http://localhost:9091/healthz"]
 interval: 30s
 start_period: 90s
 timeout: 20s
 retries: 3
 ports:
 - “19530:19530”
 - “9091:9091”
 depends_on:
 - “etcd”
 - “rustfs”
networks:
 default:
 name: milvus

Avviare i servizi

docker-compose -f docker-compose.yaml up -d

Controllare lo stato del servizio

docker-compose ps -a

Accedere all'interfaccia web di RustFS

Aprire l'interfaccia web di RustFS nel browser: http://localhost:9001.

Accedere utilizzando le credenziali predefinite: nome utente e password sono entrambi minioadmin.

Testare il servizio Milvus

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
# connect to Milvus
connections.connect(
 alias="default",
 host='localhost',
 port='19530'
)
print("✓ Successfully connected to Milvus!")
# create test collection
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="test collection")
collection = Collection(name="test_collection", schema=schema)
print("✓ Test collection created!")
print("✓ RustFS verified as the S3 storage backend!")

### Step 3: Storage Performance Testing (Experimental)

Test Design

Two Milvus deployments were set up on identical hardware (16 cores / 32 GB memory / NVMe SSD), using RustFS and MinIO respectively as the object storage backend. The test dataset consisted of 1,000,000 vectors with 768 dimensions, using an HNSW index with parameters M = 16 and efConstruction = 200. Data was inserted in batches of 5,000.

The following metrics were evaluated: Insert throughput, Index build time, Cold and warm load time, Search latency, Storage footprint.

Test Code

Note: Only the core parts of the test code are shown below.

def milvus_load_bench(dim=768, rows=1_000_000, batch=5000): collection = Collection(...) # Test di inserimento t0 = time.perf_counter() for i in range(0, rows, batch): collection.insert([rng.random((batch, dim), dtype=np.float32).tolist()]) insert_time = time.perf_counter() - t0 # Costruzione indice collection.flush() collection.create_index(field_name="embedding", index_params={"index_type": "HNSW", ...}) # Test di carico (avvio a freddo + due avvii a caldo) collection.release() load_times = [] for i in range(3): if i > 0: collection.release(); time.sleep(2) collection.load() load_times.append(...) # Query test search_times = [] for _ in range(3): collection.search(queries, limit=10, ...)


**Test Command**

python bench.py milvus-load-bench --dim 768 --rows 1000000 --batch 5000
-index-type HNSW --repeat-load 3 --release-before-load --do-search --drop-after


**Performance Results**
  • RustFS

Faster writes (+57%), lower storage usage (57%), and faster warm loads (+67%), making it suitable for write-heavy, cost-sensitive workloads.

Much slower queries (7.96 ms vs. 1.85 ms, ~+330% latency) with noticeable variance (up to 17.14 ms), and 43% slower index builds. Not suitable for query-intensive applications.

  • MinIO

Excellent query performance (1.85 ms average latency), mature small-file and random I/O optimizations, and a well-established ecosystem.

MetricRustFSMinIODifference
Insert Throughput4,472 rows/s2,845 rows/s0.57
Index Build Time803 s562 s-43%
Load (Cold Start)22.7 s18.3 s-24%
Load (Warm Start)0.009 s0.027 s0.67
Search Latency7.96 ms1.85 ms-330%
Storage Usage7.8 GB18.0 GB0.57

RustFS significantly outperforms MinIO in write performance and storage efficiency, with both showing roughly 57% improvement. This demonstrates the system-level advantages of the Rust ecosystem. However, the 330% gap in query latency limits RustFS’s suitability for query-intensive workloads.

For production environments, cloud-managed object storage services like AWS S3 are recommended first, as they are mature, stable, and require no operational effort. Self-hosted solutions are better suited to specific scenarios: RustFS for cost-sensitive or write-intensive workloads, MinIO for query-intensive use cases, and Ceph for data sovereignty. With further optimization in random read performance, RustFS has the potential to become a strong self-hosted option.

Conclusion

MinIO’s decision to stop accepting new community contributions is disappointing for many developers, but it won’t disrupt Milvus users. Milvus depends on the S3 API—not any specific vendor implementation—so swapping storage backends is straightforward. This S3-compatibility layer is intentional: it ensures Milvus stays flexible, portable, and decoupled from vendor lock-in.

For production deployments, cloud-managed services such as AWS S3 and Alibaba Cloud OSS remain the most reliable options. They’re mature, highly available, and drastically reduce the operational load compared to running your own object storage. Self-hosted systems like MinIO or Ceph still make sense in cost-sensitive environments or where data sovereignty is non-negotiable, but they require significantly more engineering overhead to operate safely at scale.

RustFS is interesting—Apache 2.0-licensed, Rust-based, and community-driven—but it’s still early. The performance gap is noticeable, and the distributed mode hasn’t shipped yet. It’s not production-ready today, but it’s a project worth watching as it matures.

If you’re comparing object storage options for Milvus, evaluating MinIO replacements, or weighing the operational trade-offs of different backends, we’d love to hear from you.

Join our[ Discord channel](https://discord.com/invite/8uyFbECzPX) and share your thoughts. You can also book a 20-minute one-on-one session to get insights, guidance, and answers to your questions through[ Milvus Office Hours](https://milvus.io/blog/join-milvus-office-hours-to-get-support-from-vectordb-experts.md).

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Continua a Leggere