|
3 | 3 | 本家 Jepsen Redis テストに近いレベルで Elastickv/Redis プロトコルを検証するために必要な構成要素と TODO です。 |
4 | 4 |
|
5 | 5 | ## 1. クラスタ構成 |
6 | | -- 最低 5 台のノードを用意する: |
| 6 | +- [x] 最低 5 台のノードを用意する: |
7 | 7 | - 1 台: コントロールノード(Jepsen runner) |
8 | 8 | - 4〜5 台: DB ノード(Elastickv を起動) |
9 | | -- 全ノードで SSH 鍵認証(root または sudo 無パス)をセットアップ。 |
10 | | -- `/etc/hosts` 等でノード名解決をそろえる。 |
| 9 | +- [x] 全ノードで SSH 鍵認証(root または sudo 無パス)をセットアップ。 |
| 10 | +- [x] `/etc/hosts` 等でノード名解決をそろえる。 |
11 | 11 |
|
12 | 12 | ## 2. DB ドライバの拡張 |
13 | | -- `jepsen/src/elastickv/redis_workload.clj` を拡張し、`jepsen.os.debian` などを使って以下を実装: |
14 | | - - 各ノードへのバイナリ配布(ビルド or 配布)。 |
15 | | - - 起動/停止/リスタートを `Remote` 経由で管理。 |
16 | | - - データ/ログディレクトリをノードごとに初期化・掃除。 |
17 | | - - ポート割り当て (Redis/GRPC/Raft) をノードごとに設定。 |
| 13 | +- [x] `jepsen/src/elastickv/redis_workload.clj` を拡張し、`jepsen.os.debian` などを使って以下を実装: |
| 14 | + - [x] 各ノードへのバイナリ配布(ビルド or 配布)。 |
| 15 | + - [x] 起動/停止/リスタートを `Remote` 経由で管理。 |
| 16 | + - [x] データ/ログディレクトリをノードごとに初期化・掃除。 |
| 17 | + - [x] ポート割り当て (Redis/GRPC/Raft) をノードごとに設定。 |
| 18 | + - [x] 起動時のサービス待機(gRPCポート待機など)の実装。 |
18 | 19 |
|
19 | 20 | ## 3. 故障注入 (Nemesis) |
20 | | -- 本家に近いセットを有効化する: |
21 | | - - ネットワーク分断(partition-random-halves, majorities-ring 等) |
22 | | - - プロセス kill / 再起動 |
23 | | - - ノード停止/再起動(必要なら再デプロイ) |
24 | | - - 時刻ずれ(clock-skew) |
25 | | -- `jepsen.nemesis` を使い、複数 nemesis の組み合わせをテスト。 |
| 21 | +- [x] 本家に近いセットを有効化する: |
| 22 | + - [x] ネットワーク分断(partition-random-halves, majorities-ring 等) |
| 23 | + - [x] プロセス kill / 再起動 (server 側の bootstrap エラー無視対応済み) |
| 24 | + - [x] ノード停止/再起動(必要なら再デプロイ) |
| 25 | + - [x] 時刻ずれ(clock-skew) |
| 26 | +- [x] `jepsen.nemesis` を使い、複数 nemesis の組み合わせをテスト。 |
26 | 27 |
|
27 | 28 | ## 4. ワークロード |
28 | | -- 既存 append ワークロードに加え、以下を追加検討: |
29 | | - - 混合 read/write、トランザクション長バリエーション |
30 | | - - キー数増加、コンカレンシ/レート可変 |
31 | | - - テスト時間 5〜10 分 / 試行、複数試行 |
| 29 | +- [x] 既存 append ワークロード (基本動作確認済み) |
| 30 | +- [ ] 以下を追加検討: |
| 31 | + - [ ] 混合 read/write、トランザクション長バリエーション |
| 32 | + - [ ] キー数増加、コンカレンシ/レート可変 |
| 33 | + - [ ] テスト時間 5〜10 分 / 試行、複数試行 (現在は 60秒程度で検証中) |
32 | 34 |
|
33 | 35 | ## 5. バイナリ配布/ビルド |
34 | | -- DB ノード上で Elastickv をビルドするか、事前ビルド済みバイナリを `scp` 配布。 |
35 | | -- systemd/supervisor か Jepsen 管理スクリプトでプロセスを起動・監視。 |
| 36 | +- [x] DB ノード上で Elastickv をビルドするか、事前ビルド済みバイナリを `scp` 配布。 |
| 37 | +- [x] systemd/supervisor か Jepsen 管理スクリプトでプロセスを起動・監視。 |
36 | 38 |
|
37 | 39 | ## 6. 計測と証跡 |
38 | | -- Raft/Redis/アプリログをノード別に収集。 |
39 | | -- Jepsen history/analysis の保管。 |
40 | | -- 可能なら tcpdump やメトリクス(Prometheus/Grafana)も併設。 |
| 40 | +- [x] Raft/Redis/アプリログをノード別に収集。 |
| 41 | +- [x] Jepsen history/analysis の保管。 |
| 42 | +- [ ] 可能なら tcpdump やメトリクス(Prometheus/Grafana)も併設。 |
41 | 43 |
|
42 | 44 | ## 7. CI への統合 |
43 | | -- GitHub Actions 単体では不足するため、外部の VM/ベアメタルクラスタを用意し、Actions から SSH で制御するワークフローを作成。 |
44 | | -- サブモジュール(`jepsen/redis`)取得を忘れず `submodules: recursive` を設定。 |
| 45 | +- [x] GitHub Actions 単体では不足するため、外部の VM/ベアメタルクラスタを用意し、Actions から SSH で制御するワークフローを作成。 |
| 46 | +- [x] サブモジュール(`jepsen/redis`)取得を忘れず `submodules: recursive` を設定。 |
45 | 47 |
|
46 | 48 | ## 8. 作業ステップ案 |
47 | | -1. ワークロードドライバを `db` / `os` / `nemesis` 付きに書き換える。 |
48 | | -2. デプロイ・起動スクリプトを用意(ビルド or 配布を選択)。 |
49 | | -3. 小規模 (2~3 ノード) でローカル VM を用いた疎通テスト。 |
50 | | -4. 故障注入を広げ、本家標準セットに近づける。 |
51 | | -5. 外部クラスタで長時間テストを回し、結果を保存。 |
| 49 | +1. [x] ワークロードドライバを `db` / `os` / `nemesis` 付きに書き換える。 |
| 50 | +2. [x] デプロイ・起動スクリプトを用意(ビルド or 配布を選択)。 |
| 51 | +3. [x] 小規模 (2~3 ノード) でローカル VM を用いた疎通テスト。 |
| 52 | +4. [x] 故障注入を広げ、本家標準セットに近づける (Partition, Kill, Clock 対応)。 |
| 53 | +5. [ ] 外部クラスタで長時間テストを回し、結果を保存。 |
| 54 | + |
| 55 | +## 9. 実装済みの足回り (最新ステータス) |
| 56 | +- **Vagrant Cluster**: `jepsen/Vagrantfile` と `jepsen/VM.md` でコントロール + 5 ノードの VM クラスタ構築済み。 |
| 57 | +- **DB Adapter**: `jepsen/src/elastickv/db.clj` 実装済み。Go バイナリのビルド/配布、起動・停止、Raft 参加、再起動時の待機処理を管理。 |
| 58 | +- **Fault Tolerance**: `elastickv` サーバー側で `raft.ErrCantBootstrap` を無視する修正を適用し、Kill Nemesis 耐性を獲得。 |
| 59 | +- **Workload**: `jepsen/src/elastickv/redis_workload.clj` は Debian/SSH/combined nemesis(partition, kill, clock)対応済み。 |
| 60 | +- **CI**: `.github/workflows/jepsen.yml` で self-hosted ランナー向けワークフローを用意。 |
| 61 | +- **Result**: `partition`, `kill`, `clock` 障害下での `append` ワークロードテストをパス (`{:valid? true}`)。 |
0 commit comments