Skip to content

Commit b6d25b1

Browse files
committed
Add Redis transaction support and Jepsen tests
1 parent 82e6185 commit b6d25b1

File tree

9 files changed

+803
-17
lines changed

9 files changed

+803
-17
lines changed

.github/workflows/jepsen-test.yml

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,42 @@ jobs:
1010
test:
1111
runs-on: ubuntu-latest
1212
env:
13-
RUN_JEPSEN: 'true'
1413
steps:
1514
- uses: actions/checkout@v6
15+
with:
16+
submodules: recursive
1617
- uses: actions/setup-java@v5
1718
with:
1819
distribution: temurin
1920
java-version: '21'
21+
- uses: actions/setup-go@v5
22+
with:
23+
go-version-file: 'go.mod'
24+
- name: Install netcat
25+
run: sudo apt-get update && sudo apt-get install -y netcat
2026
- name: Install Leiningen
2127
run: |
2228
curl -L https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein > ~/lein
2329
chmod +x ~/lein
2430
~/lein version
25-
- name: Run Jepsen tests
26-
if: env.RUN_JEPSEN == 'true'
31+
- name: Run Jepsen unit tests
2732
working-directory: jepsen
2833
run: ~/lein test
34+
- name: Launch demo cluster
35+
run: |
36+
mkdir -p "$GOCACHE"
37+
nohup go run cmd/server/demo.go > /tmp/elastickv-demo.log 2>&1 &
38+
echo $! > /tmp/elastickv-demo.pid
39+
for i in {1..30}; do
40+
nc -z 127.0.0.1 63791 && nc -z 127.0.0.1 63792 && nc -z 127.0.0.1 63793 && break
41+
sleep 1
42+
done
43+
- name: Run Redis Jepsen workload against elastickv
44+
working-directory: jepsen
45+
run: |
46+
~/lein run -m elastickv.redis-workload --time-limit 5 --rate 5 --concurrency 5 --ports 63791,63792,63793 --host 127.0.0.1
47+
- name: Stop demo cluster
48+
run: |
49+
if [ -f /tmp/elastickv-demo.pid ]; then
50+
kill "$(cat /tmp/elastickv-demo.pid)" || true
51+
fi

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,5 @@ go.work
2727
jepsen/target/
2828
jepsen/.lein-*
2929
jepsen/.nrepl-port
30+
.m2/
31+
jepsen/store/

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "jepsen/redis"]
2+
path = jepsen/redis
3+
url = https://github.com/jepsen-io/redis

JEPSEN_TODO.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Jepsen 本番相当テストを行うための構成メモ
2+
3+
本家 Jepsen Redis テストに近いレベルで Elastickv/Redis プロトコルを検証するために必要な構成要素と TODO です。
4+
5+
## 1. クラスタ構成
6+
- 最低 5 台のノードを用意する:
7+
- 1 台: コントロールノード(Jepsen runner)
8+
- 4〜5 台: DB ノード(Elastickv を起動)
9+
- 全ノードで SSH 鍵認証(root または sudo 無パス)をセットアップ。
10+
- `/etc/hosts` 等でノード名解決をそろえる。
11+
12+
## 2. DB ドライバの拡張
13+
- `jepsen/src/elastickv/redis_workload.clj` を拡張し、`jepsen.os.debian` などを使って以下を実装:
14+
- 各ノードへのバイナリ配布(ビルド or 配布)。
15+
- 起動/停止/リスタートを `Remote` 経由で管理。
16+
- データ/ログディレクトリをノードごとに初期化・掃除。
17+
- ポート割り当て (Redis/GRPC/Raft) をノードごとに設定。
18+
19+
## 3. 故障注入 (Nemesis)
20+
- 本家に近いセットを有効化する:
21+
- ネットワーク分断(partition-random-halves, majorities-ring 等)
22+
- プロセス kill / 再起動
23+
- ノード停止/再起動(必要なら再デプロイ)
24+
- 時刻ずれ(clock-skew)
25+
- `jepsen.nemesis` を使い、複数 nemesis の組み合わせをテスト。
26+
27+
## 4. ワークロード
28+
- 既存 append ワークロードに加え、以下を追加検討:
29+
- 混合 read/write、トランザクション長バリエーション
30+
- キー数増加、コンカレンシ/レート可変
31+
- テスト時間 5〜10 分 / 試行、複数試行
32+
33+
## 5. バイナリ配布/ビルド
34+
- DB ノード上で Elastickv をビルドするか、事前ビルド済みバイナリを `scp` 配布。
35+
- systemd/supervisor か Jepsen 管理スクリプトでプロセスを起動・監視。
36+
37+
## 6. 計測と証跡
38+
- Raft/Redis/アプリログをノード別に収集。
39+
- Jepsen history/analysis の保管。
40+
- 可能なら tcpdump やメトリクス(Prometheus/Grafana)も併設。
41+
42+
## 7. CI への統合
43+
- GitHub Actions 単体では不足するため、外部の VM/ベアメタルクラスタを用意し、Actions から SSH で制御するワークフローを作成。
44+
- サブモジュール(`jepsen/redis`)取得を忘れず `submodules: recursive` を設定。
45+
46+
## 8. 作業ステップ案
47+
1. ワークロードドライバを `db` / `os` / `nemesis` 付きに書き換える。
48+
2. デプロイ・起動スクリプトを用意(ビルド or 配布を選択)。
49+
3. 小規模 (2~3 ノード) でローカル VM を用いた疎通テスト。
50+
4. 故障注入を広げ、本家標準セットに近づける。
51+
5. 外部クラスタで長時間テストを回し、結果を保存。

0 commit comments

Comments
 (0)