rustfs/rustfs

⭐ 3,828 🍴 185 Rust📄 Apache License 2.0 GitHubで見る →

主な特徴

  • **高性能**: Rustで構築され、速度と効率性を保証
  • **分散アーキテクチャ**: 大規模展開のためのスケーラブルでフォールトトレラントな設計
  • **S3互換性**: 既存のS3互換アプリケーションとのシームレスな統合
  • **イレイジャーコーディング**: Reed-Solomon符号化による高度なデータ冗長性
  • **データレイクサポート**: ビッグデータとAIワークロードに最適化
  • **包括的な管理機能**: Webコンソール、IAM、イベント通知、データ階層化
  • **メモリ安全性**: Rustの所有権システムによるメモリリークやGCの問題を回避
  • **ライセンスの自由**: Apache 2.0ライセンスでビジネス利用に制限なし

リポジトリ解析: rustfs/rustfs

基本情報

  • リポジトリ名: rustfs/rustfs
  • 主要言語: Rust
  • スター数: 3,828
  • フォーク数: 185
  • 最終更新: 活発に開発中(2024年)
  • ライセンス: Apache License 2.0
  • トピックス: object-storage, s3-compatible, distributed-storage, rust, minio-alternative

概要

一言で言うと

Rustで構築された高性能分散オブジェクトストレージシステム。MinIOの代替として、より高速で安全なS3互換ストレージを提供し、Apache 2.0ライセンスでビジネス利用に適している。

詳細説明

RustFSは、世界で最も人気のある言語の1つであるRustを使用して構築された高性能分散オブジェクトストレージソフトウェアです。MinIOと同様に、シンプルさ、S3互換性、オープンソース性、データレイク、AI、ビッグデータのサポートなど、様々な利点を共有しています。さらに、他のストレージシステムと比較して、Apacheライセンスの下で構築されており、より良く、よりビジネスフレンドリーなオープンソースライセンスを持っています。

Rustを基盤としているため、RustFSは高性能オブジェクトストレージのために、より高速で安全な分散機能を提供します。現在急速に開発中で、まだ本番環境での使用は推奨されていません。

主な特徴

  • 高性能: Rustで構築され、速度と効率性を保証
  • 分散アーキテクチャ: 大規模展開のためのスケーラブルでフォールトトレラントな設計
  • S3互換性: 既存のS3互換アプリケーションとのシームレスな統合
  • イレイジャーコーディング: Reed-Solomon符号化による高度なデータ冗長性
  • データレイクサポート: ビッグデータとAIワークロードに最適化
  • 包括的な管理機能: Webコンソール、IAM、イベント通知、データ階層化
  • メモリ安全性: Rustの所有権システムによるメモリリークやGCの問題を回避
  • ライセンスの自由: Apache 2.0ライセンスでビジネス利用に制限なし

使用方法

インストール

前提条件

  • Docker/Podman(コンテナ実行の場合)
  • 64ビットLinux/macOS/Windows
  • 最小4GB RAM(推奨8GB以上)
  • ストレージ用のディスク容量

インストール手順

# 方法1: ワンクリックインストールスクリプト
curl -O https://rustfs.com/install_rustfs.sh && bash install_rustfs.sh

# 方法2: Dockerを使用
docker run -d -p 9000:9000 -p 9001:9001 \
  -v /data:/data \
  -e RUSTFS_ACCESS_KEY=rustfsadmin \
  -e RUSTFS_SECRET_KEY=rustfsadmin \
  quay.io/rustfs/rustfs

# 方法3: Podmanを使用
podman run -d -p 9000:9000 -p 9001:9001 -v /data:/data quay.io/rustfs/rustfs

基本的な使い方

Hello World相当の例

# RustFSサーバーの起動(単一ノード)
docker run -d --name rustfs \
  -p 9000:9000 -p 9001:9001 \
  -v /data:/data \
  quay.io/rustfs/rustfs

# AWS CLIを使用したバケット作成
aws --endpoint-url http://localhost:9000 \
    s3 mb s3://my-bucket \
    --region us-east-1

# ファイルのアップロード
echo "Hello, RustFS!" > hello.txt
aws --endpoint-url http://localhost:9000 \
    s3 cp hello.txt s3://my-bucket/

実践的な使用例

# docker-compose.yml - 4ノードクラスタ構成
version: '3.7'

services:
  rustfs1:
    image: quay.io/rustfs/rustfs
    hostname: rustfs1
    volumes:
      - data1-1:/data1
      - data1-2:/data2
    environment:
      RUSTFS_VOLUMES: "/data1,/data2"
      RUSTFS_ACCESS_KEY: minioadmin
      RUSTFS_SECRET_KEY: minioadmin
      RUSTFS_CONSOLE_ENABLE: "true"
    command: rustfs server /data{1...2}
    expose:
      - "9000"
      - "9001"
    ports:
      - "9001:9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  rustfs2:
    image: quay.io/rustfs/rustfs
    hostname: rustfs2
    volumes:
      - data2-1:/data1
      - data2-2:/data2
    environment:
      RUSTFS_VOLUMES: "/data1,/data2"
      RUSTFS_ACCESS_KEY: minioadmin
      RUSTFS_SECRET_KEY: minioadmin
    command: rustfs server /data{1...2}
    expose:
      - "9000"

  # rustfs3, rustfs4も同様に設定

  nginx:
    image: nginx:alpine
    hostname: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "9000:9000"
    depends_on:
      - rustfs1
      - rustfs2
      - rustfs3
      - rustfs4

volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  # 他のボリュームも定義

高度な使い方

// Rust SDKを使用した例(aws-sdk-s3クレート使用)
use aws_sdk_s3::{Client, Config, Endpoint};
use aws_credential_types::Credentials;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // RustFS用のS3クライアント設定
    let creds = Credentials::new(
        "rustfsadmin",
        "rustfsadmin",
        None,
        None,
        "rustfs"
    );
    
    let config = Config::builder()
        .credentials_provider(creds)
        .endpoint_resolver(
            Endpoint::immutable("http://localhost:9000")
        )
        .region(Region::new("us-east-1"))
        .build();
    
    let client = Client::from_conf(config);
    
    // バケットの作成
    client.create_bucket()
        .bucket("my-rust-bucket")
        .send()
        .await?;
    
    // マルチパートアップロード
    let multipart = client.create_multipart_upload()
        .bucket("my-rust-bucket")
        .key("large-file.bin")
        .send()
        .await?;
    
    // 各パートをアップロード(並列処理可能)
    let mut parts = Vec::new();
    for part_number in 1..=10 {
        let data = vec![0u8; 5 * 1024 * 1024]; // 5MB
        
        let part = client.upload_part()
            .bucket("my-rust-bucket")
            .key("large-file.bin")
            .upload_id(&multipart.upload_id.unwrap())
            .part_number(part_number)
            .body(data.into())
            .send()
            .await?;
        
        parts.push((part_number, part.e_tag));
    }
    
    // マルチパートアップロードの完了
    client.complete_multipart_upload()
        .bucket("my-rust-bucket")
        .key("large-file.bin")
        .upload_id(&multipart.upload_id.unwrap())
        .multipart_upload(
            CompletedMultipartUpload::builder()
                .parts(parts.into_iter().map(|(num, etag)| {
                    CompletedPart::builder()
                        .part_number(num)
                        .e_tag(etag)
                        .build()
                }).collect())
                .build()
        )
        .send()
        .await?;
    
    Ok(())
}

ドキュメント・リソース

公式ドキュメント

サンプル・デモ

  • deploy/: デプロイメント設定例
    • docker-compose.yaml: マルチノードクラスタ構成
    • config/: 環境変数設定例
  • scripts/: 各種スクリプト
    • test.sh: テスト実行スクリプト
    • dev_deploy.sh: 開発環境デプロイスクリプト

チュートリアル・ガイド

  • Getting Started Guide(公式ドキュメント)
  • Docker/Podmanデプロイメントガイド
  • S3 APIリファレンス(S3互換のため既存のS3ドキュメントも参照可能)

技術的詳細

アーキテクチャ

全体構造

RustFSは、モジュラーなクレート構造を採用した分散オブジェクトストレージシステムです:

  1. APIレイヤー: S3互換API、管理API、内部通信API
  2. サービスレイヤー: 認証、認可、イベント通知、データライフサイクル管理
  3. ストレージレイヤー: イレイジャーコーディング、データ分散、レプリケーション
  4. 永続化レイヤー: ローカルディスク、リモートストレージバックエンド

ディレクトリ構成

rustfs/
├── rustfs/              # メインサーバーアプリケーション
│   ├── src/
│   │   ├── main.rs     # エントリーポイント
│   │   ├── service.rs  # サービス定義
│   │   ├── auth.rs     # 認証処理
│   │   └── console.rs  # Webコンソール
├── cli/
│   └── rustfs-gui/     # Dioxusベースのデスクトップクライアント
└── crates/            # 機能別クレート
    ├── ecstore/       # イレイジャーコーディングストレージエンジン
    ├── iam/          # アイデンティティ・アクセス管理
    ├── policy/       # ポリシーエンジン
    ├── notify/       # イベント通知システム
    ├── s3select-api/ # S3 Select API実装
    ├── s3select-query/ # S3 Selectクエリエンジン
    ├── crypto/       # 暗号化・署名
    ├── rio/          # I/O抽象化
    ├── lock/         # 分散ロック
    ├── signer/       # リクエスト署名
    └── utils/        # ユーティリティ

主要コンポーネント

  • ECStore (Erasure Coding Store): データの冗長性と復元力を提供

    • 場所: crates/ecstore/
    • 依存: crypto、utils
    • インターフェース: StorageAPI trait
  • IAMシステム: ユーザー、グループ、ポリシー管理

    • 場所: crates/iam/
    • 依存: policy、crypto
    • インターフェース: AuthService、PolicyEngine
  • 通知システム: イベント駆動アーキテクチャの中核

    • 場所: crates/notify/
    • 依存: 各種メッセージングシステム
    • インターフェース: NotificationTarget trait

技術スタック

コア技術

  • 言語: Rust 1.85+(unsafe_code = "deny"設定)
  • 非同期ランタイム: Tokio(マルチスレッドエグゼキュータ)
  • Webフレームワーク: Axum(HTTPサービス)
  • 主要ライブラリ:
    • s3s(S3プロトコル実装)
    • tonic(gRPC)
    • serde(シリアライゼーション)
    • reed-solomon-simd(イレイジャーコーディング)

開発・運用ツール

  • ビルドツール: Cargo(Rustワークスペース)
  • テスト: 組み込みテスト、統合テスト、ベンチマーク
  • CI/CD: GitHub Actions
  • デプロイ: Docker、バイナリ配布

設計パターン・手法

  • trait指向設計: 抽象化と拡張性のためのトレイト活用
  • 非同期処理: async/awaitパターンの全面採用
  • ゼロコピーI/O: パフォーマンス最適化
  • イミュータブルデータ構造: スレッドセーフティの保証

データフロー・処理フロー

  1. S3 APIリクエスト受信
  2. 認証・認可チェック
  3. リクエストルーティング
  4. データのイレイジャーコーディング(書き込み時)
  5. 複数ノードへのデータ分散
  6. メタデータ更新
  7. イベント通知(設定されている場合)
  8. レスポンス返却

API・インターフェース

公開API

S3互換API

  • 目的: Amazon S3と互換性のあるオブジェクトストレージAPI
  • 使用例:
# オブジェクトのアップロード
curl -X PUT http://localhost:9000/bucket/object \
  -H "Authorization: AWS4-HMAC-SHA256..." \
  -H "Content-Type: application/octet-stream" \
  --data-binary @file.txt

# オブジェクトの取得
curl http://localhost:9000/bucket/object \
  -H "Authorization: AWS4-HMAC-SHA256..."

管理API

  • 目的: サーバー管理、統計情報取得
  • 使用例:
# サーバー情報の取得
curl http://localhost:9002/admin/info \
  -H "Authorization: Bearer <token>"

# ストレージ統計
curl http://localhost:9002/admin/storage/stats

設定・カスタマイズ

設定ファイル

# rustfs.toml - 設定例
[server]
address = "0.0.0.0:9000"
console_address = "0.0.0.0:9001"
region = "us-east-1"

[storage]
erasure_sets = 4
erasure_parity = 2
compression = "zstd"
encryption = "aes-gcm"

[iam]
default_access_key = "${RUSTFS_ACCESS_KEY}"
default_secret_key = "${RUSTFS_SECRET_KEY}"

[notify]
[[notify.targets]]
type = "webhook"
endpoint = "https://example.com/webhook"
events = ["s3:ObjectCreated:*", "s3:ObjectRemoved:*"]

[cache]
enabled = true
max_size = "10GB"
ttl = "1h"

拡張・プラグイン開発

新しいストレージバックエンドの追加:

// StorageAPI traitの実装
pub trait StorageAPI: Send + Sync {
    async fn get_object(&self, bucket: &str, key: &str) -> Result<Object>;
    async fn put_object(&self, bucket: &str, key: &str, data: Bytes) -> Result<()>;
    async fn delete_object(&self, bucket: &str, key: &str) -> Result<()>;
    async fn list_objects(&self, bucket: &str, prefix: &str) -> Result<Vec<ObjectInfo>>;
}

パフォーマンス・スケーラビリティ

パフォーマンス特性

  • ベンチマーク結果: MinIOと比較して読み書き両方で高いスループット
  • 最適化手法:
    • jemallocアロケータ使用(Linux)
    • ゼロコピーI/O操作
    • 効率的なバッファプーリング
    • SIMD命令を使用したイレイジャーコーディング

スケーラビリティ

  • 水平スケーリング: ノード追加による容量とスループットの増加
  • イレイジャーセット: 設定可能なデータ/パリティ比(4+2、8+3など)
  • 自動負荷分散: リクエストの自動分散
  • 自動修復: バックグラウンドでのデータ整合性チェックと修復

制限事項

  • 開発段階: 本番環境での使用は非推奨
  • 機能の完成度: 一部のS3 API機能が未実装の可能性
  • ドキュメント: 英語と中国語のみ(日本語ドキュメントなし)

評価・所感

技術的評価

強み

  • メモリ安全性: Rustによるメモリ安全性の保証、GCによる遅延なし
  • 高性能: Cレベルの性能をより安全に実現
  • ライセンス: Apache 2.0によるビジネス利用の自由度
  • モダンな設計: 最新のベストプラクティスに基づいた設計
  • 包括的な機能: S3互換性、イレイジャーコーディング、IAM、通知機能など

改善の余地

  • 成熟度: まだ開発初期段階で本番利用には不適
  • エコシステム: MinIOと比較してツールやインテグレーションが少ない
  • コミュニティ: 比較的新しいプロジェクトでコミュニティが小規模

向いている用途

  • 高性能が必要な環境: レイテンシやスループットが重要なワークロード
  • セキュリティ重視: メモリ安全性が重要な環境
  • ライセンス制約: AGPLを避けたい商用利用
  • 実験的プロジェクト: 新技術の評価や研究開発

向いていない用途

  • 本番環境: 現時点では開発段階のため非推奨
  • 既存MinIOからの移行: エコシステムの違いによる移行コスト
  • 保守的な環境: 実績のあるソリューションが求められる場合

総評

RustFSは、Rustの強力な型システムとメモリ安全性を活用した野心的なオブジェクトストレージプロジェクトです。MinIOの代替として、より高性能で安全な実装を目指しており、特にライセンス面でのビジネスフレンドリーさが魅力的です。技術的には非常に興味深い実装で、イレイジャーコーディングやS3互換APIなど、必要な機能を網羅的に実装しています。ただし、現時点では開発段階であり、本番環境での使用は推奨されていない点に注意が必要です。将来的には、MinIOの有力な代替選択肢となる可能性を秘めたプロジェクトと言えるでしょう。