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