An open API service indexing awesome lists of open source software.

https://github.com/akam1o/arca-storage

arca-storage is Software-Defined Storage system with Storage Virtual Machine (SVM) functionality, built using Linux standard technologies.
https://github.com/akam1o/arca-storage

drbd sds software-defined-storage storage

Last synced: 23 days ago
JSON representation

arca-storage is Software-Defined Storage system with Storage Virtual Machine (SVM) functionality, built using Linux standard technologies.

Awesome Lists containing this project

README

          

# Arca Storage

[English](README.md) | 日本語

[![CI](https://github.com/akam1o/arca-storage/actions/workflows/ci.yml/badge.svg)](https://github.com/akam1o/arca-storage/actions/workflows/ci.yml)
[![Python Tests](https://github.com/akam1o/arca-storage/actions/workflows/python-tests.yml/badge.svg)](https://github.com/akam1o/arca-storage/actions/workflows/python-tests.yml)
[![Ansible Lint](https://github.com/akam1o/arca-storage/actions/workflows/ansible-lint.yml/badge.svg)](https://github.com/akam1o/arca-storage/actions/workflows/ansible-lint.yml)

Linux標準技術を使用して構築された、Storage Virtual Machine (SVM) 機能を備えたソフトウェア・デファインド・ストレージシステム。

## 概要

Arca Storageは、Linux標準技術を使用してNetApp ONTAPのようなSVM機能を提供するソフトウェア・デファインド・ストレージシステムです:

- **マルチプロトコル**: NFS v4.1 / v4.2 (デフォルト)、オプションでNFSv3サポート
- **マルチテナンシー**: SVMごとの Ganesha bind アドレス分離。必要に応じて Network Namespace/VLAN 分離も利用可能
- **高可用性**: Pacemakerベースのアクティブ/アクティブ・フェイルオーバー
- **データ効率**: LVM Thin Provisioningによるオーバーコミット
- **クライアント統合**: Kubernetes (CSI)([ドキュメント](csi-arca-storage/README.ja.md))および OpenStack([Cinder NFS Driver](docs/openstack-cinder.ja.md)、[Manila](docs/openstack-manila.ja.md))サポート

## アーキテクチャ

システムは以下のコンポーネントを組み合わせています:
- **Pacemaker + Corosync**: HAクラスタリングとリソース管理
- **NFS-Ganesha**: ユーザースペースNFSサーバー (SVM毎に1プロセス)
- **Network Namespace**: VLAN-backed SVM で利用する任意のテナントネットワーク分離
- **XFS**: NVMe最適化ファイルシステム
- **LVM Thin Provisioning**: 仮想ボリューム管理とスナップショット
- **DRBD**: ノード間同期データミラーリング

### 内部設計

Python コードベースは **宣言的リコンシリエーション** アーキテクチャを採用しています:

- **リソースモデル** (`models/`): SVM・Volume・Snapshot・Export の各リソースに対して Spec(期待状態)と Status(実際の状態)を持つ Pydantic モデル。
- **リコンサイラー** (`reconcilers/`): リソースを期待状態から実際の状態へ冪等に遷移させるループ。各ステップの結果を永続化し、リトライ時は最後の成功ステップから再開。
- **アダプター** (`adapters/`): システム操作(LVM, XFS, Network Namespace, Pacemaker, NFS-Ganesha, systemd)の Protocol ベース抽象化。本番実装は実コマンドを呼び出し、Fake 実装により root 権限なしのインメモリテストが可能。
- **状態ストア** (`db/`): SQLite WAL バックエンドの状態データベース。ACID トランザクション対応。
- **構造化エラー** (`errors.py`): マシンリーダブルなエラーコード(`NOT_FOUND`, `ALREADY_EXISTS` など)。HTTP ステータスコードにマッピングされ、Go CSI ドライバから利用可能。
- **統合設定** (`config.py`): Pydantic で検証される TOML ベースの設定。
- **アプリケーションコンテキスト** (`context.py`): 依存性の配線 — `AppContext` が DB・アダプター・リコンサイラーを CLI と API の両方に提供。

## クイックスタート

### 前提条件

- RHEL/Alma/Rocky Linux 8/9, Debian, または Ubuntu
- Pacemaker/Corosync/pcs, NFS-Ganesha, LVM2, DRBD がインストール済み
- 2ノードクラスター構成

### インストール

1. **OS 依存パッケージのインストール(例):**

```bash
# EL9 (RHEL/Alma/Rocky 9)
sudo dnf install -y pacemaker corosync pcs resource-agents \
nfs-ganesha nfs-ganesha-utils \
lvm2 xfsprogs \
drbd-utils drbd-kmod

# Debian/Ubuntu(パッケージ名はディストリ/リポジトリにより異なる場合があります)
sudo apt-get update
sudo apt-get install -y pacemaker corosync pcs resource-agents \
nfs-ganesha \
lvm2 xfsprogs \
drbd-utils
```

2. **`arca-storage` パッケージのインストール(rpm/deb):**

GitHub Releases から最新のパッケージを取得してインストールします。

```bash
# EL9 (rpm)
sudo dnf install -y ./arca-storage-*.rpm

# Debian/Ubuntu (deb)
sudo apt-get install -y ./arca-storage_*.deb
```

3. **MVPセットアップガイドに従う:**

詳細なセットアップ手順については [docs/mvp-setup.md](docs/mvp-setup.md) を参照してください。

## 設定

### NFSv3サポート (オプション)

デフォルトでは、Arca StorageはNFSv4のみを使用します。NFSv3サポートを有効にするには:

1. **設定の編集:**

`/etc/arca-storage/config.toml` に設定します:

```toml
[ganesha]
# NFSv3 を有効化(v3 + v4 の両方を利用)
protocols = [3, 4]

# 固定ポート(NFSv3 利用時に推奨)
mountd_port = 20048
nlm_port = 32768
```

2. **設定の再生成と reload:**

```bash
# 設定変更後に env を同期(任意だが推奨)
sudo arca bootstrap render-env

# SVM ごとの ganesha.conf を再生成して reload
sudo arca export sync --all
```

3. **NFSv3有効時に必要なファイアウォールポート:**

```
111/tcp,udp (rpcbind/portmapper)
2049/tcp,udp (NFS)
20048/tcp,udp (mountd)
32768/tcp,udp (NLM)
```

4. **クライアントマウント例:**

```bash
# NFSv4 (デフォルト)
mount -t nfs4 server:/101 /mnt

# NFSv3 (有効時)
mount -t nfs -o vers=3 server:/exports /mnt
```

**注意**: NFSv3 を利用する場合、`rpcbind` がインストールされて起動していることを確認してください。NFSv3 と NFSv4 の両プロトコルが同時に利用可能になります。

## 使い方

### CLIツール (arca)

```bash
# Ansibleなしでのブートストラップ
sudo arca bootstrap install

# (任意) 設定の編集
sudo vi /etc/arca-storage/config.toml

# 設定変更後に /etc/arca-storage/arca-storage.env を再生成
sudo arca bootstrap render-env

# SVMの作成
# --vlan は省略可です。省略時は host namespace で SVM VIP に Ganesha を bind します。
# VLAN-backed SVM では --gateway は省略可です(未指定の場合は --ip から推定。/31,/32 は指定してください)
arca svm create tenant_a --vlan 100 --ip 192.168.10.5/24
# VLAN を使わない場合:
arca svm create tenant_b --ip 192.168.20.5/32

# ボリュームの作成
arca volume create vol1 --svm tenant_a --size 100

# エクスポートの追加
arca export add --volume vol1 --svm tenant_a --client 10.0.0.0/24 --access rw

# SVMの一覧表示
arca svm list
```

### REST API

Bearer token 認証を有効にして API サーバーを起動します:

```bash
export ARCA_API_TOKEN="$(openssl rand -hex 32)"
arca-storage-api --host 127.0.0.1 --port 8080
```

クライアントからのリクエストでは同じ token を使用します:

```bash
curl -H "Authorization: Bearer " http://localhost:8080/v1/svms
```

または systemd サービスとして起動します(パッケージインストール時):

```bash
API_TOKEN="$(openssl rand -hex 32)"
sudo install -m 0600 /dev/null /etc/arca-storage/api.env
printf 'ARCA_API_TOKEN=%s\n' "$API_TOKEN" | sudo tee /etc/arca-storage/api.env >/dev/null
unset API_TOKEN
sudo systemctl enable --now arca-storage-api
```

loopback のみの開発用途では、明示的に無認証アクセスを許可できます:

```bash
unset ARCA_API_TOKEN ARCA_AUTH_TOKEN
ARCA_ALLOW_UNAUTHENTICATED_LOOPBACK=true arca-storage-api --host 127.0.0.1 --port 8080
```

APIエンドポイント:

- `POST /v1/svms` - SVM作成
- `GET /v1/svms` - SVM一覧
- `GET /v1/svms/{name}` - SVM詳細取得
- `DELETE /v1/svms/{name}` - SVM削除
- `POST /v1/directories` - CSI 管理ボリューム用ディレクトリ作成
- `DELETE /v1/directories/{svm_name}` - ディレクトリ削除
- `POST /v1/quotas` - ディレクトリ quota 設定
- `PATCH /v1/quotas` - ディレクトリ quota 拡張
- `GET /v1/quotas/{svm_name}` - ディレクトリ quota 取得
- `POST /v1/volumes` - ボリューム作成
- `GET /v1/volumes` - ボリューム一覧
- `PATCH /v1/volumes/{name}` - ボリュームリサイズ
- `DELETE /v1/volumes/{name}` - ボリューム削除
- `POST /v1/volumes/{name}/clone` - Snapshot からのボリューム clone
- `PATCH /v1/volumes/{name}/qos` - QoS 制限適用
- `GET /v1/volumes/{name}/qos` - QoS 設定取得
- `DELETE /v1/volumes/{name}/qos` - QoS 制限削除
- `POST /v1/exports` - エクスポート追加
- `GET /v1/exports` - エクスポート一覧
- `DELETE /v1/exports` - エクスポート削除
- `POST /v1/snapshots` - Snapshot 作成
- `GET /v1/snapshots` - Snapshot 一覧
- `DELETE /v1/snapshots/{name}` - Snapshot 削除

サーバー起動時に `http://localhost:8080/docs` でAPIドキュメントを参照できます。
token 認証が有効な場合、このエンドポイントも API と同じように保護されます。
Swagger UI をブラウザで開く開発用途では、loopback のみの明示的な無認証モードを使用してください。

### OpenStack (Cinder)

[docs/openstack-cinder.ja.md](docs/openstack-cinder.ja.md) を参照してください。

### OpenStack (Manila)

[docs/openstack-manila.ja.md](docs/openstack-manila.ja.md) を参照してください。

## プロジェクト構成

```
arca-storage/
├── arca_storage/ # Pythonパッケージ
│ ├── arca_storage/ # パッケージソースコード
│ │ ├── api/ # FastAPI REST API
│ │ │ ├── main.py # APIアプリケーション & エラーハンドラ
│ │ │ ├── models.py # リクエスト/レスポンス Pydantic モデル
│ │ │ └── services/ # サービス層(リコンサイラーに委譲)
│ │ ├── cli/ # CLIツール (Typer)
│ │ │ ├── cli.py # メインCLIエントリ
│ │ │ ├── commands/ # コマンド実装
│ │ │ └── lib/ # バリデータ、ヘルパー
│ │ ├── models/ # リソースモデル (Spec/Status)
│ │ │ ├── svm.py # SVM リソース
│ │ │ ├── volume.py # Volume リソース
│ │ │ ├── snapshot.py # Snapshot リソース
│ │ │ └── export.py # Export リソース
│ │ ├── reconcilers/ # リコンシリエーションループ
│ │ │ ├── svm.py # SVM リコンサイラー
│ │ │ ├── volume.py # Volume リコンサイラー
│ │ │ ├── snapshot.py # Snapshot リコンサイラー
│ │ │ └── export.py # Export リコンサイラー
│ │ ├── adapters/ # システム操作アダプター
│ │ │ ├── lvm.py # LVM (Protocol + Subprocess + Fake)
│ │ │ ├── xfs.py # XFS
│ │ │ ├── netns.py # Network Namespace
│ │ │ ├── pacemaker.py # Pacemaker
│ │ │ ├── ganesha.py # NFS-Ganesha
│ │ │ └── systemd.py # systemd
│ │ ├── db/ # SQLite WAL 状態ストア
│ │ ├── errors.py # 構造化エラーコード
│ │ ├── config.py # TOML 設定 (Pydantic)
│ │ ├── context.py # 依存性の配線 (AppContext)
│ │ ├── openstack/ # OpenStack ドライバ (Cinder, Manila)
│ │ ├── resources/ # Pacemaker RA, systemd ユニット
│ │ └── templates/ # 設定テンプレート
│ ├── tests/ # テストスイート
│ │ ├── unit/ # ユニットテスト (models, errors, db, reconcilers)
│ │ └── integration/ # 統合テスト (CLI, API, シナリオ)
│ ├── pyproject.toml # パッケージ設定
│ └── pytest.ini # テスト設定
├── csi-arca-storage/ # Go CSI ドライバ
│ ├── pkg/arca/ # ARCA API クライアント & 構造化エラー
│ ├── cmd/ # CLI エントリポイント
│ └── deploy/ # Kubernetes マニフェスト
├── ansible/ # Ansibleプレイブック
│ ├── roles/ # Ansibleロール
│ └── site.yml # メインプレイブック
├── docs/ # プロジェクトドキュメント
│ └── mvp-setup.md # MVPセットアップガイド
└── README.md # このファイル
```

## 開発

### 開発環境のセットアップ

```bash
# リポジトリのクローン
git clone https://github.com/akam1o/arca-storage.git
cd arca-storage/arca_storage

# 仮想環境の作成
python3 -m venv venv
source venv/bin/activate

# 開発モードで開発用依存関係と共にインストール
pip install -e ".[dev]"
```

### テストの実行

```bash
cd arca_storage

# 全テストの実行
pytest

# カバレッジ付きで実行
pytest --cov=arca_storage --cov-report=html

# 特定のテストの実行
pytest tests/unit/
pytest tests/integration/
```

### コーディングスタイル

Pythonコードは PEP 8 に従ってください。

## ドキュメント

- [docs/mvp-setup.md](docs/mvp-setup.md) - MVPセットアップガイド
- [csi-arca-storage/docs/quickstart.ja.md](csi-arca-storage/docs/quickstart.ja.md) - CSI クイックスタート
- [csi-arca-storage/docs/deployment.ja.md](csi-arca-storage/docs/deployment.ja.md) - CSI デプロイガイド
- [csi-arca-storage/docs/deployment-checklist.ja.md](csi-arca-storage/docs/deployment-checklist.ja.md) - CSI デプロイチェックリスト
- [arca_storage/arca_storage/resources/pacemaker/](arca_storage/arca_storage/resources/pacemaker/) - Pacemaker RAドキュメント
- [arca_storage/arca_storage/resources/systemd/](arca_storage/arca_storage/resources/systemd/) - systemd ユニットファイル
- [arca_storage/arca_storage/templates/](arca_storage/arca_storage/templates/) - テンプレートドキュメント

## ライセンス

Apache License 2.0

## コントリビューション

コントリビューションを歓迎します![CONTRIBUTING.ja.md](CONTRIBUTING.ja.md) を参照してください。

## Contact

お問い合わせは [GitHub Issues](https://github.com/akam1o/arca-storage/issues) に Issue を作成してください。セキュリティ報告は [GitHub Security Advisories](https://github.com/akam1o/arca-storage/security/advisories) をご利用ください。

## ステータス

このプロジェクトは活発に開発中です。MVP実装は完了していますが、追加機能と最適化が計画されています。