最近(準確説是 12 月 3 日),分佈式對象存儲領域的頂級玩家 Minio,官宣其開源項目 Minio 正式進入維護模式,具體包括:
- 代碼庫處於僅維護狀態;
- 不再接受新功能、增強改進以及 PR 等;
- 嚴重的安全漏洞會視情況而定(case by case);
- 既有的 Issue 和 PR 將不再積極處理(目前有 42 處於 open 狀態的 Issue,33 個處於 open 狀態的 PR);
- 對於社區支持,將通過 Slack 盡力而為;
此舉意味着 Minio 將全面轉向其商業版產品 Minio AIStor。對於 Minio 這種已經發展了 10 年(2014 年公司成立,2015 年發佈首個版本)的基礎設施開源項目,已經在全球積累了百萬甚至千萬用户,此變更也在圈裏激起大浪。
辱罵無國界
事件發生後,就有用户在 Minio 的 GitHub Repo 下面建了一個主題為 Maintenance Mode 的 Issue,諸多用户在下面進行了討論(甚至可以説是“發泄”)”:
有用户提出,這種做法難道不是違反了 AGPL 協議麼?當然,也有用户給他解釋了一番:AGPL 不適用於提交者/維護者,只適用於使用者:
有“憤怒”用户説,這是“誘騙”(估計意思是先讓大家用上開源項目,然後閉源再來收費,這味道有沒有很熟悉),而且點贊者還不少:
更有甚者,直接開始“辱罵”(稱之為叛徒):
到了最後,Minio 官方下場鎖定了這個 Issue,提出這種 Issue 的討論已經違反了Code of Conduct,辱罵、威脅這一類的行為在 Minio 社區是不允許的。對於想要繼續討論 fork Minio 或者想繼續維護甚至重寫的用户,可以到 Discussion 繼續討論:
只能説,在貢獻開源項目這件事情上,開發者無國界,在 Diss 開源項目這件事情上,開發者同樣無國界。
逝者已矣,生者如斯
中國有句古話叫做“逝者已矣,生者如斯”,Minio 開源項目已經”官宣停擺“,任何沒有結果的討論甚至辱罵都是沒有任何意義的,對於依賴對象存儲的用户來講,出路無非以下幾種:
- 尋找替代品並遷移
- fork 過來繼續維護
- 自己擼一個(藉助於現在流行的 AI Coding,貌似也不是不可能)
對於絕大多數用户來講,估計只能選擇第一條了。在替代品方面,也有不少選擇,比如 S3、Ceph、RustFS、Garage 等。
最近,正好看到一個關於私有化部署、S3 兼容的對象存儲項目的測評(Benchmarking Self-Hosted S3-Compatible Storage。
參與評測的項目有:
- MinIO
- Ceph
- SeaweedFS
- Garage
- Zenko (Scality Cloudserver)
- LocalStack
- RustFS
測評方法為:
- 上傳/下載 7 個不同尺寸的文件:50 KB、200 KB、1 MB、10 MB、50 MB、100MB 以及 1GB;
- 重複上傳/下載 20 次,然後獲取穩定的平均數據;
- 所有測試均在相同的機器上進行,測試機器為每一種存儲系統使用默認的 Docker 容器,且沒有額外的卷、掛載或緩存;
測評結果:在並行/非並行上傳/下載速率方面,RustFS 和 Seaweedfs 都領先於其他項目。
由於在開篇提到的 Issue 中,多個用户也提到了可行的替代品 —— RustFS:
下面來看一下 RustFS 的相關情況。
分佈式存儲新貴 —— RustFS
從 GitHub 上看rustfs是一個用 Rust 語言編寫的分佈式對象存儲系統,兼容 S3 協議,是 Minio 的平替。自今年 7 月份開源(採用 Apache 2.0 協議)以來,已經獲得 15K star(在基礎設施類開源項目中還是挺不錯的數據),更新比較頻繁,目前發佈了 73 個版本。從官方發佈的內容看,RustFS 的優勢在於:
- 開源:採用商業友好的 Apache 2.0 協議;
- S3 兼容:無縫集成現有的 S3 兼容的應用或工具;
- 分佈式架構:可擴展和容錯設計適用於大規模部署;
- 安裝便捷:支持二進制、Docker 以及 Helm Chart,可一鍵式安裝;
官方也給出了和其他對象存儲的對比:
更多內容可自行查看 GitHub Repo 或官網。
RustFS 之初體驗
RustFS 支持多種安裝方式:
- 二進制安裝
curl -O https://rustfs.com/install_rustfs.sh && bash install_rustfs.sh
- Docker 安裝
docker pull rustfs/rustfs:latest
docker run -d \
--name rustfs \
-p 9000:9000 \
-p 9001:9001 \
-v /data:/data \
rustfs/rustfs:latest
注意:RustFS 容器以10001運行,需要將掛載的宿主機目錄的權限修改為10001,否則會出現permission denied錯誤。
或使用 docker-compose.yaml:
services:
rustfs:
image: rustfs/rustfs:latest
container_name: rustfs
hostname: rustfs
environment:
- RUSTFS_VOLUMES=/data/rustfs{1...4}
- RUSTFS_ADDRESS=0.0.0.0:9000
- RUSTFS_CONSOLE_ENABLE=true
- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
- RUSTFS_EXTERNAL_ADDRESS=0.0.0.0:9000 # Same as internal since no port mapping
- RUSTFS_ACCESS_KEY=rustfsadmin
- RUSTFS_SECRET_KEY=rustfsadmin
- RUSTFS_CMD=rustfs
healthcheck:
test:
[
"CMD-SHELL",
"curl -f http://localhost:9000/health && curl -f http://localhost:9001/health"
]
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
ports:
- "9000:9000" # API endpoint
- "9001:9001" # Console
volumes:
- rustfs-data1:/data/rustfs1
- rustfs-data2:/data/rustfs2
- rustfs-data3:/data/rustfs3
- rustfs-data4:/data/rustfs4
volumes:
rustfs-data1:
rustfs-data2:
rustfs-data3:
rustfs-data4:
直接執行如下命令即可
docker compose up -d
#查看容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a957ec319ca rustfs/rustfs:latest "/entrypoint.sh rust…" 14 hours ago Up 14 hours (healthy) 0.0.0.0:9000-9001->9000-9001/tcp, :::9000-9001->9000-9001/tcp rustfs
- Helm Chart 安裝
# 添加 repo
helm repo add rustfs https://charts.rustfs.com
# 安裝
helm install rustfs -n rustfs --create-namespace ./ --set ingress.className="nginx"
安裝完畢後,可使用 http://ip:9001(Helm Chart 安裝可根據 ingress 進行登錄)登錄,默認用户名和密碼均為 rustfsadmin。
登錄後,可以創建存儲、AK & SK 使用:
可以通過性能來查看節點和磁盤的信息:
集成實踐
比如可以將 RustFS 配置為 Docker Registry 的存儲後端。docker-compose.yaml 內容如下:
services:
registry:
restart: always
image: registry:3
ports:
- 5000:5000
environment:
REGISTRY_STORAGE: s3
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
REGISTRY_STORAGE_S3_ACCESSKEY: rustfsadmin
REGISTRY_STORAGE_S3_SECRETKEY: rustfsadmin
REGISTRY_STORAGE_S3_REGION: cn-east-1
REGISTRY_STORAGE_S3_REGIONENDPOINT: http://rustfs.instance.ip:9000
REGISTRY_STORAGE_S3_BUCKET: docker-registry
REGISTRY_STORAGE_S3_ROOTDIRECTORY: /var/lib/registry
REGISTRY_STORAGE_S3_FORCEPATHSTYLE: true
REGISTRY_STORAGE_S3_LOGLEVEL: debug
volumes:
- ./auth:/auth
- ./certs:/certs
networks:
- rustfs-oci
networks:
rustfs-oci:
driver: bridge
name: rustfs-oci
拉取鏡像並推送到 Docker Registry:
# 拉取鏡像
docker pull rustfs/rustfs:1.0.0.-alpha.72
# 重新打 tag
docker tag rustfs/rustfs:1.0.0-alpha.72 localhost:5000/rustfs/rustfs:1.0.0-alpha.72
# 推送至 Docker Registry
docker push localhost:5000/rustfs/rustfs:1.0.0-alpha.72
在 RustFS 實例上查看:
官方目前給出了 Golang、Rust、TypeScript 等 SDK 來使用 RustFS。另外通過 mc(minio client)對 RustFS 進行操作。簡言之,對 Minio/S3 適用的操作,同樣適用於 RustFS。感興趣的可自行探索。