博客 / 詳情

返回

Minio 開源“官宣停擺”,開源用户該如何選擇平替?

最近(準確説是 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

測評方法為:

  1. 上傳/下載 7 個不同尺寸的文件:50 KB、200 KB、1 MB、10 MB、50 MB、100MB 以及 1GB;
  2. 重複上傳/下載 20 次,然後獲取穩定的平均數據;
  3. 所有測試均在相同的機器上進行,測試機器為每一種存儲系統使用默認的 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 實例上查看:

rustfs confirmation

官方目前給出了 Golang、Rust、TypeScript 等 SDK 來使用 RustFS。另外通過 mc(minio client)對 RustFS 進行操作。簡言之,對 Minio/S3 適用的操作,同樣適用於 RustFS。感興趣的可自行探索。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.