Rustで実装されたHadoop互換の分散ファイルシステム(DFS)です。 Google File System (GFS) やHadoop HDFSのアーキテクチャを参考に、Raftによる強整合性とシャーディングによるスケーラビリティを実現しています。
- ✅ 分散ストレージ: 複数のChunkServerにデータを分散保存
- ✅ レプリケーション: デフォルトで3つのレプリカを作成(冗長性確保)
- ✅ 高可用性 (HA): RaftコンセンサスアルゴリズムによるMasterの冗長化
- ✅ スケーラビリティ (シャーディング): 複数のMasterグループによるメタデータの水平分割、Consistent Hashingによる負荷分散
- ✅ トランザクション: クロスシャード操作(Rename等)をAtomicに実行するTransaction Recordの実装
- ✅ データ整合性: Raftログレプリケーションによるメタデータの一貫性保証
- ✅ パイプラインレプリケーション: 効率的なデータ複製
- ✅ gRPC通信: 高性能な通信プロトコル
- ✅ Docker対応: Docker Composeで簡単にクラスタ構築(シャーディング構成対応)
┌─────────────────────────────────────────────────────────────┐
│ Config Server (Meta-Shard) │
│ [ Config1 ] ◄──► [ Config2 ] ◄──► [Config3 ] │
│ (ShardMapの管理・設定情報の保持) │
└─────────────────────────────────────────────────────────────┘
│ (ShardMap Fetch) │
▼ ▼
┌───────────────────────┐ ┌───────────────────────┐
│ Shard-1 (A-M) │ │ Shard-2 (N-Z) │
│ ┌───────────────────┐ │ │ ┌───────────────────┐ │
│ │ Master1 (Leader) │ │ │ │ Master1 (Leader) │ │
│ │ Master2 (Follower)│ │ │ │ Master2 (Follower)│ │
│ │ Master3 (Follower)│ │ │ │ Master3 (Follower)│ │
│ └───────────────────┘ │ │ └───────────────────┘ │
└───────────────────────┘ └───────────────────────┘
│ │
└──────────────────┬─────────────────┘
▼
┌─────────────────────────────┐
│ ChunkServers │
│ [CS1] [CS2] [CS3] [CS4] ... │
└─────────────────────────────┘
シャーディング対応のクラスタを起動します。
# シャーディング環境(2シャード構成 + 複数のChunkServer)の起動
docker compose -f docker-compose.yml up -d --build
# ファイルアップロードの例 (Shard 1への書き込み)
docker exec dfs-master1-shard1 /app/dfs_cli --master http://localhost:50051 put /file.txt /uploaded.txt
# ファイル操作 (Renameなど)
docker exec dfs-master1-shard1 /app/dfs_cli --master http://localhost:50051 rename /uploaded.txt /renamed.txt従来のシングルマスター/HA構成も利用可能です。
# ビルド
cargo build --release
# クラスタ起動スクリプト (Master × 3 + ChunkServer × 5)
./start_cluster.sh様々なシナリオに対応したテストスクリプトが用意されています。
# 全ての単体テストを実行(結合テストはスキップ)
cargo test
# 結合テスト(Client Integration Test)のみを実行
# ※事前にDockerクラスタが起動している必要があります
cargo test -- --ignored
# 全てのテスト(単体 + 結合)を実行
cargo test -- --include-ignored| テストスクリプト | 説明 |
|---|---|
rename_test.sh |
基本的なファイルリネーム機能(同一シャード内)のテスト |
same_shard_rename_test.sh |
シャード環境下での同一シャード内リネームのテスト |
cross_shard_test.sh |
クロスシャードリネーム(Transaction Record)の正常系テスト |
transaction_abort_test.sh |
クロスシャード操作失敗時のロールバック(Abort)テスト |
fault_recovery_test.sh |
トランザクション中のシャード障害からの復旧テスト |
chaos_test.sh |
ChunkServerの障害などをシミュレートしたカオステスト |
このプロジェクトはCargo Workspace機能を使用して複数のクレートを管理しています。
rust-hadoop/
├── dfs/ # DFS主要コンポーネント
│ ├── metaserver/ # メタデータ管理サーバー
│ │ ├── src/bin/
│ │ │ ├── master.rs # Masterサーバー (Raft + Sharding統合)
│ │ │ └── config_server.rs # Configサーバー (Meta-Shard)
│ │ └── src/ # Raft, Shardingロジックの実装
│ ├── chunkserver/ # データ格納サーバー
│ │ ├── src/bin/
│ │ │ └── chunkserver.rs # ChunkServerバイナリ
│ │ └── src/ # データ保存・レプリケーションロジック
│ └── client/ # クライアントライブラリ & CLI
│ ├── src/bin/
│ │ └── dfs_cli.rs # CLIツール
│ └── src/ # Clientライブラリ実装 (接続管理, ShardMapキャッシュ)
├── proto/
│ └── dfs.proto # gRPC定義
├── docker-compose.yml # シャーディング構成用Docker Compose
└── *.sh # 各種テスト・起動スクリプト
CreateFile: ファイル作成GetFileInfo: ファイル情報取得AllocateBlock: ブロック割り当てCompleteFile: ファイル書き込み完了ListFiles: ファイル一覧Rename: ファイル移動・名前変更(クロスシャード対応)
- GET
/health: Liveness Probe - GET
/metrics: Prometheus メトリクス (Raft状態など) - GET
/raft/state: Raftの内部状態(JSON)
PrepareTransaction: トランザクション準備(2PC)CommitTransaction: トランザクションコミットAbortTransaction: トランザクションロールバックHeartbeat: ChunkServer生存確認
WriteBlock: ブロック書き込み(パイプラインレプリケーション)ReadBlock: ブロック読み込みReplicateBlock: レプリケーション受信
- 言語: Rust
- 通信: gRPC (tonic)
- 非同期: Tokio
- 合意形成: 自作Raft実装 + Transaction Record (2PC)
- シャーディング: Consistent Hashing (Virtual Nodes)
- コンテナ: Docker
MIT
- MASTER_HA.md - Master HAとシャーディングの詳細
- REPLICATION.md - レプリケーション機能の詳細
- CHAOS_TEST.md - カオステストガイド
- Google File System
- Spanner: Google's Globally-Distributed Database