rustfs/rustfs

⭐ 2,519 🍴 120 Rust📄 Apache License 2.0 GitHubで見る →

主な特徴

  • **完全なS3 API互換性**: Amazon S3 APIとの完全な互換性により、既存のS3対応アプリケーションとシームレスに統合
  • **高度なエラスティックコーディング**: Reed-Solomonアルゴリズムによる設定可能な冗長性(4+2、8+4、16+4など)
  • **メモリ安全性**: Rustで実装されているため、メモリリークやセグメンテーションフォルトのリスクが排除
  • **高性能**: SIMD最適化されたエラスティックコーディング、ゼロコピー操作による高速データ処理
  • **分散アーキテクチャ**: スケーラブルで障害に強い設計、自動ヒーリング機能
  • **包括的な管理機能**: Webコンソール(ポート9001)、ライフサイクル管理、バージョニング、オブジェクトロック
  • **セキュリティ機能**: AES-GCM、ChaCha20Poly1305暗号化、IAMポリシー、アクセス制御
  • **イベント通知**: Webhook、MQTT、Kafkaによる通知システム
  • **観測可能性**: OpenTelemetry統合、Prometheusメトリクス、分散トレーシング
  • **圧縮サポート**: Brotli、LZ4、Zstd、Snapによる自動圧縮

リポジトリ解析: rustfs/rustfs

基本情報

  • リポジトリ名: rustfs/rustfs
  • 主要言語: Rust
  • スター数: 2,519
  • フォーク数: 120
  • 最終更新: 継続的に更新中
  • ライセンス: Apache License 2.0
  • トピックス: S3互換, 分散オブジェクトストレージ, MinIO代替, エラスティックコーディング, 高性能ストレージ

概要

一言で言うと

Rustで構築された高性能な分散オブジェクトストレージシステムで、MinIOの代替として設計され、S3互換APIを提供する企業向けソリューション。

詳細説明

RustFSは、MinIOなどの既存のS3互換ストレージソリューションの代替として設計された、Rustで書かれた分散オブジェクトストレージシステムです。Apache 2.0ライセンスで提供され、MinIOのAGPL v3より商用利用しやすいライセンスモデルを採用しています。

Rustの特徴であるメモリ安全性、高性能、並行処理の優位性を活かし、GCによるパフォーマンス低下がなく、メモリリークの心配もないストレージシステムを実現しています。特に大規模なエンタープライズ環境での使用を想定し、高可用性、データ整合性、パフォーマンスに重点を置いて設計されています。

主な特徴

  • 完全なS3 API互換性: Amazon S3 APIとの完全な互換性により、既存のS3対応アプリケーションとシームレスに統合
  • 高度なエラスティックコーディング: Reed-Solomonアルゴリズムによる設定可能な冗長性(4+2、8+4、16+4など)
  • メモリ安全性: Rustで実装されているため、メモリリークやセグメンテーションフォルトのリスクが排除
  • 高性能: SIMD最適化されたエラスティックコーディング、ゼロコピー操作による高速データ処理
  • 分散アーキテクチャ: スケーラブルで障害に強い設計、自動ヒーリング機能
  • 包括的な管理機能: Webコンソール(ポート9001)、ライフサイクル管理、バージョニング、オブジェクトロック
  • セキュリティ機能: AES-GCM、ChaCha20Poly1305暗号化、IAMポリシー、アクセス制御
  • イベント通知: Webhook、MQTT、Kafkaによる通知システム
  • 観測可能性: OpenTelemetry統合、Prometheusメトリクス、分散トレーシング
  • 圧縮サポート: Brotli、LZ4、Zstd、Snapによる自動圧縮

使用方法

インストール

前提条件

  • OS: Linux、macOS、Windows(マルチプラットフォーム対応)
  • アーキテクチャ: x86_64、ARM64
  • Docker/Podman: コンテナ化されたデプロイの場合に必要
  • 最小メモリ: 512MB(実稼働環境では4GB以上を推奨)

インストール手順

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

# 方法2: Docker/Podmanを使用
podman run -d \
  --name rustfs \
  -p 9000:9000 \
  -p 9001:9001 \
  -v rustfs_data:/data \
  -e RUSTFS_VOLUMES=/data/rustfs0,/data/rustfs1,/data/rustfs2,/data/rustfs3 \
  -e RUSTFS_ROOT_USER=rustfsadmin \
  -e RUSTFS_ROOT_PASSWORD=rustfsadmin \
  -e RUSTFS_CONSOLE_ENABLE=true \
  quay.io/rustfs/rustfs

# 方法3: Docker Composeを使用
curl -O https://raw.githubusercontent.com/rustfs/rustfs/main/docker-compose.yaml
docker-compose up -d

# 方法4: ソースからビルド
git clone https://github.com/rustfs/rustfs.git
cd rustfs
make build
./build_rustfs.sh

基本的な使い方

Hello World相当の例

# MinIOクライアント(mc)を設定
mc alias set rustfs http://localhost:9000 rustfsadmin rustfsadmin

# バケットを作成
mc mb rustfs/mybucket

# ファイルをアップロード
echo "Hello RustFS!" > hello.txt
mc cp hello.txt rustfs/mybucket/

# ファイルをダウンロード
mc cp rustfs/mybucket/hello.txt ./downloaded.txt

# バケットの内容を確認
mc ls rustfs/mybucket

実践的な使用例

# Python boto3を使用したS3操作
import boto3
import json

# RustFSに接続
s3 = boto3.client('s3',
    endpoint_url='http://localhost:9000',
    aws_access_key_id='rustfsadmin',
    aws_secret_access_key='rustfsadmin',
    region_name='us-east-1'
)

# バケットの作成
s3.create_bucket(Bucket='data-lake')

# バージョニングを有効化
s3.put_bucket_versioning(
    Bucket='data-lake',
    VersioningConfiguration={'Status': 'Enabled'}
)

# ライフサイクルポリシーの設定
s3.put_bucket_lifecycle_configuration(
    Bucket='data-lake',
    LifecycleConfiguration={
        'Rules': [{
            'ID': 'archive-old-files',
            'Status': 'Enabled',
            'Transitions': [{
                'Days': 30,
                'StorageClass': 'GLACIER'
            }],
            'Expiration': {'Days': 365}
        }]
    }
)

# 大量データのアップロード(マルチパート)
with open('large_file.bin', 'rb') as f:
    s3.upload_fileobj(f, 'data-lake', 'large_file.bin',
                      Config=boto3.s3.transfer.TransferConfig(
                          multipart_threshold=1024 * 25,  # 25MB
                          max_concurrency=10,
                          multipart_chunksize=1024 * 25,
                          use_threads=True
                      ))

高度な使い方

# オブジェクトロックを使用した不可変ストレージ
mc mb --with-lock rustfs/compliance-bucket
mc retention set --default GOVERNANCE "30d" rustfs/compliance-bucket
mc cp critical-data.pdf rustfs/compliance-bucket/

# イベント通知の設定
mc event add --event "put,delete" rustfs/mybucket arn:aws:sqs::primary:target

# バケット暗号化の設定
mc encrypt set sse-kms rustfs-encryption-key rustfs/secure-bucket

# S3 Selectを使用したクエリ
aws s3api select-object-content \
    --endpoint-url http://localhost:9000 \
    --bucket data-lake \
    --key records.json \
    --expression "SELECT * FROM S3Object[*] s WHERE s.age > 30" \
    --expression-type SQL \
    --input-serialization '{"JSON": {"Type": "LINES"}}' \
    --output-serialization '{"JSON": {}}' \
    output.json

# クラスタ構成(エラスティックコーディング8+4)
export RUSTFS_VOLUMES="http://node{1...12}:9000/data/rustfs{0...3}"
export RUSTFS_ERASURE_SET_DRIVE_COUNT=12
./rustfs server

ドキュメント・リソース

公式ドキュメント

  • README.md: プロジェクトの概要、特徴、クイックスタートガイド
  • README_ZH.md: 中国語の詳細ドキュメント(国産代替ソリューションとしての位置づけ)
  • 公式サイト: https://rustfs.com - 製品情報、インストールスクリプト
  • ドキュメントサイト: https://docs.rustfs.com/zh/ - 機能、アーキテクチャ、ソリューションの詳細
  • CONTRIBUTING.md: コントリビューションガイドライン
  • SECURITY.md: セキュリティポリシーと脆弱性報告手順

サンプル・デモ

  • examples/base/: 基本的な使用例
  • scripts/test.sh: MinIOクライアントを使用した包括的なテストスクリプト
  • scripts/e2e-run.sh: エンドツーエンドテストスクリプト
  • docker-compose.yaml: マルチノードクラスタ構成例

チュートリアル・ガイド

  • クイックスタートガイド(README内)
  • Dockerビルドガイド(docs/docker-build.md)
  • 各クレートのREADMEファイル(各コンポーネントの詳細)

技術的詳細

アーキテクチャ

全体構造

RustFSはマルチクレートワークスペースとして構成され、各コンポーネントが独立した責任を持ちながら協調して動作する設計です。

┌─────────────────────────────────────────────────────────────┐
│                    Storage API Layer (S3互換)              │
├─────────────────────────────────────────────────────────────┤
│  Bucket Management  │  Object Operations  │  Metadata Mgmt  │
├─────────────────────────────────────────────────────────────┤
│              Erasure Coding Engine (ecstore)               │
├─────────────────────────────────────────────────────────────┤
│    Disk Management    │    Healing System    │    Cache     │
├─────────────────────────────────────────────────────────────┤
│              Physical Storage Devices                      │
└─────────────────────────────────────────────────────────────┘

ディレクトリ構成

rustfs/
├── rustfs/           # メインサーバー実装
│   └── src/         # S3 APIハンドラ、Webコンソール
├── crates/           # モジュラークレート集
│   ├── ecstore/     # エラスティックコーディングストレージエンジン
│   ├── iam/         # 認証・認可管理
│   ├── policy/      # アクセス制御ポリシーエンジン
│   ├── crypto/      # 暗号化、JWT処理
│   ├── notify/      # イベント通知システム
│   ├── lock/        # 分散ロック機構
│   ├── rio/         # Rust I/Oユーティリティ
│   ├── filemeta/    # ファイルメタデータ管理
│   ├── workers/     # ワーカースレッドプール
│   ├── s3select-*/  # S3 Selectクエリサポート
│   ├── madmin/      # 管理APIインターフェース
│   ├── obs/         # 観測可能性、メトリクス収集
│   └── signer/      # リクエスト署名検証
├── scripts/          # デプロイ、テストスクリプト
├── deploy/           # デプロイ設定、証明書
└── cli/              # クライアントツール
    └── rustfs-gui/   # Dioxus製デスクトップGUI

主要コンポーネント

  • rustfsメインサーバー: S3 APIエンドポイントとWebコンソールの実装

    • 場所: rustfs/src/main.rs
    • 依存: 全クレート
    • インターフェース: HTTPサーバー(Axum)、S3 APIハンドラ
  • ecstore(エラスティックコーディングエンジン): システムの中核、データの冗長性と耐久性を担保

    • 場所: crates/ecstore/
    • 依存: reed-solomon-simd、crypto
    • インターフェース: エンコード/デコードAPI、ヒーリングAPI
  • IAMシステム: 認証とアクセス管理

    • 場所: crates/iam/
    • 依存: policy、crypto
    • インターフェース: ユーザー管理、ロール管理、ポリシー評価

技術スタック

コア技術

  • 言語: Rust (2024 edition, stable channel)
  • 非同期ランタイム: Tokio (マルチスレッド非同期I/O)
  • Webフレームワーク: Axum (HTTPサーバー実装)
  • S3実装: s3sライブラリ
  • RPC: gRPC with Tonic
  • 主要ライブラリ:
    • reed-solomon-simd: SIMD最適化されたエラスティックコーディング
    • async-compression: 非同期圧縮処理
    • brotli, lz4, zstd: 圧縮アルゴリズム
    • AES-GCM, ChaCha20Poly1305: 暗号化
    • Blake3, SHA2: ハッシュ関数
    • OpenTelemetry, tracing: 観測可能性
    • DataFusion: S3 Selectサポート用SQLエンジン
    • Dioxus: デスクトップGUIフレームワーク

開発・運用ツール

  • ビルドツール:
    • Cargo (マルチクレートワークスペース)
    • Make (build_rustfs.shでクロスコンパイル)
    • クロスコンパイルターゲット: x86_64-unknown-linux-musl, aarch64-unknown-linux-gnu
  • テスト:
    • 単体テスト、統合テスト、E2Eテスト
    • ベンチマークスイート(特にエラスティックコーディング性能)
  • CI/CD:
    • GitHub Actionsによる自動ビルド
    • マルチアーキテクチャDockerイメージビルド
  • デプロイ:
    • Docker/Podmanコンテナ
    • Docker Composeによるマルチノード構成
    • Kubernetesサポート

設計パターン・手法

  • モジュラーアーキテクチャ: 関心事の分離を明確にしたクレート構成
  • トレイトベースの抽象化: ストレージバックエンドの拡張性
  • ゼロコピー操作: 効率的なデータハンドリング
  • SIMD最適化: ハードウェアアクセラレーションの活用
  • 完全非同期設計: 高並行性の実現
  • メモリ安全性: unsafeコードの使用禁止(unsafe_code = "deny"
  • グレースフルシャットダウン: 適切なシグナルハンドリングと接続ドレイン

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

オブジェクトアップロードフロー

  1. クライアントリクエスト: S3 PUTリクエスト受信
  2. 認証・認可: IAMモジュールでの検証
  3. データ分割: エラスティックコーディング用にデータブロック化
  4. エラスティックコーディング: Reed-Solomonアルゴリズムでパリティ生成
  5. 圧縮(オプション): 設定に基づくデータ圧縮
  6. 暗号化(オプション): バケット設定に基づく暗号化
  7. 分散保存: 複数のノード/ディスクにデータとパリティを分散
  8. メタデータ記録: オブジェクト情報をメタデータストアに保存
  9. 通知: 設定されたイベント通知を送信

オブジェクトダウンロードフロー

  1. クライアントリクエスト: S3 GETリクエスト受信
  2. 認証・認可: アクセス権限の確認
  3. メタデータ取得: オブジェクト情報の読み込み
  4. データ収集: 分散されたデータブロックを収集
  5. エラスティックデコーディング: 必要に応じてデータを再構築
  6. 復号化: 暗号化されたデータの復号
  7. 解凍: 圧縮されたデータの解凍
  8. ストリーミング: クライアントへのデータストリーミング

API・インターフェース

公開API

S3互換API

  • 目的: Amazon S3との完全な互換性を提供
  • 主要エンドポイント:
    • バケット操作: PUT/GET/DELETE /bucket
    • オブジェクト操作: PUT/GET/DELETE /bucket/object
    • マルチパートアップロード: POST /bucket/object?uploads
    • S3 Select: POST /bucket/object?select&select-type=2

管理API

  • 目的: システム管理とモニタリング
  • エンドポイント:
    • ヘルスチェック: /minio/health/live
    • メトリクス: /minio/v2/metrics/cluster
    • 管理コンソール: http://localhost:9001

設定・カスタマイズ

環境変数による設定

# 基本設定
RUSTFS_ROOT_USER=rustfsadmin
RUSTFS_ROOT_PASSWORD=rustfsadmin
RUSTFS_VOLUMES="/data/rustfs{0...3}"
RUSTFS_ADDRESS=":9000"
RUSTFS_CONSOLE_ADDRESS=":9001"

# ストレージ設定
RUSTFS_ERASURE_SET_DRIVE_COUNT=5
RUSTFS_STORAGE_CLASS_INLINE_BLOCK="512 KB"
RUSTFS_COMPRESSION_ENABLED=true

# 観測可能性設定
RUSTFS_OBS_ENDPOINT=http://localhost:4317
RUSTFS_OBS_LOGGER_LEVEL=debug

# イベント通知設定
RUSTFS_NOTIFY_WEBHOOK_ENABLE=true
RUSTFS_NOTIFY_WEBHOOK_ENDPOINT="http://localhost:3020/webhook"

拡張・カスタマイズ

  • ストレージバックエンド: Traitベースの抽象化によりカスタム実装可能
  • 通知システム: Webhook、MQTT、Kafkaなどのカスタムハンドラを追加可能
  • 認証プロバイダ: カスタムIAMプロバイダの統合可能

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

パフォーマンス特性

  • エラスティックコーディング性能: SIMD最適化により従来実装の2-3倍高速
  • メモリ効率: GCのないRust実装により一定のレイテンシを維持
  • 並行処理: Tokioによる高効率な非同期I/O処理
  • 最適化手法:
    • ゼロコピー操作によるデータ移動の最小化
    • インラインストレージによる小オブジェクトの最適化
    • 適応的圧縮によるストレージ効率の向上

スケーラビリティ

  • 水平スケーリング: ノード追加による線形スケール
  • ストレージ容量: エラスティックコーディングにより物理容量の60-80%を有効活用
  • クラスタサイズ: 単一ノードから数百ノードまで対応
  • オブジェクト数: 数億オブジェクトの管理が可能

制限事項

  • 技術的な制限:
    • 最大オブジェクトサイズ: 5TB(S3互換)
    • 最小エラスティックコーディングセット: 4ドライブ
    • 同時接続数: ノードあたり10,000接続(調整可能)
  • 運用上の制限:
    • クラスタ構成変更時のデータ再バランシングが必要
    • エラスティックコーディング設定はクラスタ初期化時に固定

評価・所感

技術的評価

強み

  • Rustによるメモリ安全性: セグメンテーションフォルトやメモリリークのリスクがない
  • 高性能なエラスティックコーディング: SIMD最適化による高速なデータ保護
  • 商用利用しやすいライセンス: Apache 2.0でMinIOのAGPLより柔軟
  • 包括的な機能セット: エンタープライズに必要な機能が一通り揃っている
  • モダンな技術スタック: 最新のRustエコシステムを活用

改善の余地

  • ドキュメントの充実: 英語ドキュメントが中国語に比べて少ない
  • コミュニティの成熟度: MinIOやCephに比べてコミュニティが小さい
  • エコシステムの整備: サードパーティツールや統合がまだ限定的
  • プロダクション実績: 新しいプロジェクトのため大規模実績が少ない

向いている用途

  • 高性能オブジェクトストレージが必要なシステム
  • MinIOからの移行を検討している組織
  • メモリ安全性と信頼性が重要な環境
  • AI/MLワークロードのデータレイク
  • 大量の非構造化データの保存と配信
  • プライベートクラウドやオンプレミス環境

向いていない用途

  • 小規模な個人プロジェクト(オーバースペック)
  • リアルタイム性が極めて重要なシステム
  • 既存の特殊なS3拡張機能に依存したシステム
  • ファイルシステムセマンティクスが必要な場合

総評

RustFSは、Rustの強みを活かしたモダンな分散オブジェクトストレージシステムで、特にメモリ安全性と高性能を重視するエンタープライズ環境に適しています。Apache 2.0ライセンスとS3完全互換性により、MinIOからの移行もスムーズに行えるでしょう。

まだ若いプロジェクトであるため、コミュニティの成長とエコシステムの整備が今後の課題ですが、技術的な基盤はしっかりしており、将来性のあるプロジェクトと評価できます。