概要
- TigerBeetle は金融取引向けの分散OLTPデータベース
- Jepsenによる検証で複数の障害・バグ発見、ほとんどが修正済み
- 強力な 耐障害性 と 一貫性保証 (Strong Serializability)を実現
- データモデルは アカウントとトランスファー に特化
- 高スループット・高競合環境に最適化
TigerBeetleの検証レポート
- TigerBeetle は金融トランザクション向け分散OLTPデータベース
- バージョン0.16.11〜0.16.30で 7件のクラッシュ(クライアント・サーバ) を発見
- クライアント終了時のセグフォールト、サーバアップグレード時のpanic等
- 単一ノード障害時、 レイテンシ上昇 と リクエスト無限リトライ を確認
- 安全性問題は2件 のみ:複数条件クエリの結果欠落、デバッグAPIのタイムスタンプ誤り
- ディスク破損耐性 は非常に高く、全レプリカのファイル損傷にも耐性
- ただしノード全データ消失時の復旧手段は未提供
- バージョン0.16.30時点で Strong Serializabilityを達成
- 0.16.45で既知の問題は 無限リトライ以外全て修正済み
- Jepsen倫理方針に則り、TigerBeetle, Inc.の資金提供で実施
TigerBeetleの設計概要
- ダブルエントリー会計 向けに設計されたOLTPデータベース
- Viewstamped Replication(VR) プロトコルを採用し強一貫性を実現
- データモデル は「アカウント」と「トランスファー」のみ
- 高競合・高スループット ワークロードに最適
- 例:中央銀行スイッチ、証券取引所の大量決済
- スケールアップ型設計 :全書き込みをプライマリVRノード1コアに集約
- バッチ処理、IO並列化、固定スキーマ、ハードウェア最適化を徹底
- 障害モデル: メモリ、プロセス、クロック、ストレージ、ネットワーク 障害を明示的にサポート
- ECCメモリ前提、プロセス停止・クラッシュ、クロックジャンプ、ディスク破損、ネットワーク遅延・損失等
- Viewstamped Replication + Protocol-Aware Recovery 技術で耐障害性強化
- チェックサム、マルチコピー書き込み、ランタイムアサートで障害検知
データ損失耐性とテスト
- 単一レプリカに記録が残ればデータ消失しない 設計
- 全レプリカで記録破損時は安全停止
- 決定論的シミュレーションテスト を重視
- VOPRテストでクラスタ全体の障害を再現
- サブシステムごとのストレステストや統合テストも実施
アップグレード戦略
- バイナリに複数バージョンのコードを同梱
- 例:0.16.21は0.16.17〜0.16.21対応
- バイナリ差し替えのみで自動アップグレード
- クラスタ全体でバージョンを順次切り替え
- コミット済み操作のバージョン整合性も担保
時刻管理
- Viewstamped Replication で完全順序の論理クロックを実装
- 物理時刻(POSIXタイム)を近似しつつ強い順序保証
- 各レプリカのPOSIXタイムスタンプを収集し、クォーラム内で合意
- 20秒以上の時刻ずれが60秒続くとリクエスト拒否
- タイムスタンプ仕様は「UNIXエポックからのナノ秒」だが、実際はPOSIXタイムとの差異あり
データモデル詳細
- アカウント :128bitユーザー定義ID、元帳、フラグ、作成時刻、ユーザー定義カスタムフィールド等
- 残高フィールド(pending/postedのdebit/credit)を持つ
- トランスファー :128bit ID、コード、元帳、フラグ、カスタムフィールド
- debit_account_id、credit_account_id、転送額
- 単一フェーズ即時反映、二段階(pending→posted)も可能
- pendingトランスファーはvoidや自動expire可能
- アカウント閉鎖もpendingトランスファーで実現、voidで再開可能
- アカウントはほぼ不変 (閉鎖フラグと4種残高のみ例外)、トランスファーは完全不変
- 変更や取消は補償トランスファーで実現
操作・API
- リクエスト単位でトランザクション性 を保証
- イベントはバッチ実行(最大8190件)、順次実行
- 各イベントに単調増加タイムスタンプ
- インタラクティブトランザクションや複数リクエスト横断トランザクションは非対応
- Strong Serializability を保証
- 各リクエストは「最大1回」実行、他リクエストと非インターリーブ
- セッション安全性(自分の書き込みを自分で読める、書き込み順序の可視化)も担保
- 書き込みリクエスト :create_accounts、create_transfers
- 読み取りリクエスト :lookup_accounts、lookup_transfers、query_accounts、query_transfers、get_account_transfers、get_account_balances
- リクエストは全体でアトミック (一部イベント失敗時は失敗分のみエラーコード返却)
- チェーン機能でサブトランザクション表現も可能(全成功・全失敗保証)
Jepsenテスト設計
- Jepsenテストライブラリ でプロパティベース+障害注入テストを実施
- TigerBeetleの複数バージョンに対し、耐障害性・一貫性を徹底検証
(以降、論点や話題が変わる場合は新しい記事タイトルで続けてください)