- Remove gitlinks (160000 mode) for chainfire, flaredb, iam - Add workspace contents as regular tracked files - Update flake.nix to use simple paths instead of builtins.fetchGit This resolves the nix build failure where submodule directories appeared empty in the nix store. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
6.7 KiB
Feature Specification: Distributed KVS Consistency Modes
Feature Branch: 003-kvs-consistency
Created: 2025-12-01
Status: Draft
Input: User description: "とりあえず分散KVSの部分を使えるようにし、強整合性モードと結果整合性モードを実用可能な状態に持っていくまでの仕様を考えてください。"
User Scenarios & Testing (mandatory)
User Story 1 - 強整合性クラスタを安全に稼働 (Priority: P1)
SRE/オペレータは、固定メンバー(例: 3ノード)のKVSクラスタを強整合性モードで起動し、書き込み・読み出しが常に最新状態で返ることを保証したい。
Why this priority: 強整合性がS3メタデータやSNSイベントの正確さの土台になるため。
Independent Test: 少なくとも3ノード構成で、リーダー経由のPut/Getが直ちに反映し、ダウン直後もコミット済みデータが失われないことを検証。
Acceptance Scenarios:
- Given 3ノードが強整合性モードで起動済み、When リーダーにキーを書き込み、Then 即座に全ノードで最新値が読み出せる(リーダーからの再取得)。
- Given 1ノードを停止、When 残り2ノードで読み書き、Then コミットは継続しデータ欠損がない(クォーラム成立時のみコミット)。
User Story 2 - 結果整合性モードで高スループット運用 (Priority: P1)
オペレータは、イベント処理や一時的なスパイク負荷向けに結果整合性モードを選択し、高スループットな書き込みを許容しつつ、一定時間内に最終的に同期させたい。
Why this priority: 書き込み偏重ワークロードでの性能確保とコスト最適化のため。
Independent Test: 結果整合性モードで大量Put後、一定のタイムウィンドウ内に全ノードへ反映し、古い値が一定時間内に整合することを確認。
Acceptance Scenarios:
- Given 結果整合性モードでキーを書き込み、When 1秒以内に別ノードから読み出し、Then 必ずしも最新とは限らないが一定時間後(例: 数秒以内)に最新値へ収束する。
- Given ネットワーク分断後に復旧、When 再同期処理が走る、Then コンフリクトは定義済みポリシー(例: last-write-wins)で解決される。
User Story 3 - モード切替と運用観測 (Priority: P2)
オペレータは、環境やワークロードに応じて強整合性/結果整合性モードを設定単位で切り替え、状態監視と異常検知ができることを望む。
Why this priority: 運用現場での柔軟性と安全性の両立が必要なため。
Independent Test: モード設定変更後の再起動またはローリング適用で、設定が反映され、メトリクス/ログで確認できる。
Acceptance Scenarios:
- Given クラスタ設定を強整合性→結果整合性に変更、When ローリングで適用、Then 全ノードが新モードで稼働し、メトリクスにモードが反映される。
- Given モード不一致のノードが存在、When オペレータが状況を確認、Then 管理UI/CLI/ログで不一致を検知でき、是正手順が明示される。
Edge Cases
- メンバー数がクォーラムを下回った状態での書き込み要求(強整合性では拒否、結果整合性ではキューイング/部分反映)。
- ネットワーク分断後の再結合時、双方が進んだログを持つ場合の解決順序。
- モード切替途中に障害が発生した場合のリカバリ手順と一貫性確保。
- データサイズやホットキー偏重時のスロットリング/バックプレッシャー挙動。
Requirements (mandatory)
Functional Requirements
- FR-001: システムは強整合性モードでクォーラム書き込み/読み出しを行い、コミット済みデータを即時参照可能にする。
- FR-002: システムは結果整合性モードで書き込みを受け付け、定義された収束時間内に全ノードへ反映させる。
- FR-003: モード設定は名前空間単位で指定でき、クラスタは複数モードを同居させられる。
- FR-004: 結果整合性モードのコンフリクト解決はデフォルトで last-write-wins(LWW)を採用し、設定で他方式を選択できる。
- FR-005: モード変更は安全な手順(ローリング適用または再起動)で反映され、途中失敗時はロールバック手段がある。
- FR-006: 強整合性モードではクォーラム未達時に書き込みを拒否し、明示的なエラーを返す。
- FR-007: 結果整合性モードではクォーラム未達時も書き込みを受け付け、後続の同期で補填し、未反映の可能性をクライアントに示せる。
- FR-008: 再起動/障害復旧後、保存されたログ/スナップショットから整合した状態へ自動復元し、必要な再同期を実行する。
- FR-009: モード別の観測指標(レイテンシ、未同期レプリカ数、収束時間、拒否率)をメトリクス/ログとして出力する。
- FR-010: 運用者がモード状態や不一致を確認できるCLI/ログ/メトリクス情報を提供する。
Key Entities
- ClusterConfig: クラスタID、ノード一覧、レプリカ数、現在の整合性モード、適用ステータス。
- ConsistencyPolicy: モード種別(強整合/結果整合)、コンフリクト解決ポリシー、収束目標時間、適用範囲(クラスタ/名前空間)。
- ReplicationState: ノードごとのログ進行度、未同期エントリ数、最後の収束時刻、ヘルス状態。
Success Criteria (mandatory)
Measurable Outcomes
- SC-001: 強整合性モードでの書き込み→読み出しがクォーラム成立時に最新値を即時返し、可用ノードがクォーラム未満なら明示的に失敗を返すことが確認できる。
- SC-002: 結果整合性モードでの書き込みは、許容する収束時間内(例: 数秒以内)に全レプリカへ反映し、反映遅延をメトリクスで観測できる。
- SC-003: ネットワーク分断からの復旧時、コンフリクト解決ポリシーに従ってデータが一貫した状態に自動で収束することをテストで確認できる。
- SC-004: モード変更操作が安全に完了し、変更後のモードと各ノードの適用状況をメトリクス/ログで確認できる。