Skip to content

Commit 4930215

Browse files
authored
Merge pull request #275 from bootjp/feature/fix-create-node
Add Redis transaction support and Jepsen tests
2 parents 5bef5c1 + ad0c792 commit 4930215

File tree

13 files changed

+879
-37
lines changed

13 files changed

+879
-37
lines changed

.github/workflows/jepsen-test.yml

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