OceanBaseデータベースは、Paxosを最適化したMulti-Paxosを用いて、マルチレプリカデータの同期およびクラスタの高可用性を実現しています。
Paxos一貫性プロトコルの原理
Paxosの原理については、以下のリンクを参照してください。
OceanBaseデータベースにおけるPaxosプロトコルと選挙プロトコルの関係
OceanBaseデータベースのPaxos実装は、選挙プロトコルと共に一貫性プロトコル(ログサービス)の実装を構成しています。両者には一定の関連性がありますが、実装上では結合をできるだけ減らすよう努めています。
選挙プロトコルはまず、複数のレプリカの中からリーダー(Leader)ノードを選出し、Leaseメカニズムによってリーダーの正当性を保証します。ログは選出されたリーダーに基づいてMulti-Paxosの状態機械を進め、未確認ログの復元を行い、復元フェーズ終了後にサービスを開始します。
Paxosプロトコルによるフォールト・トリプリテーションの回避方法
「フォールト・トリプリテーション」とは?
従来のデータベースのプライマリ/スタンバイ同期による災害復旧方式では、システムが正常に動作している間は、プライマリノード(Masterとも呼ばれる)が外部に対してデータの読み書きサービスを提供し、残りのノードはスタンバイノード(Slaveとも呼ばれる)としてプライマリノードからログ形式でデータを同期し、災害復旧ノードとして待機します。
システムに異常が発生した場合、プライマリノードとスタンバイノード間でネットワーク分断が発生した例を挙げます:
プライマリノードは同一データセンター内のアプリケーションサーバーと正常に接続しており、引き続きプライマリノードとしてデータの読み書きサービスを提供します。
災害復旧を決定する人または自動管理ツールは、プライマリノードのネットワークが切断されたことを検出した場合、サービスの連続性を保証するため、スタンバイノードをプライマリノードに昇格させてデータの読み書きサービスを提供しようと試みます。
このような場合、同時に2つ以上のプライマリノードが存在し、アプリケーションが多重書き込みを行うことで、深刻なデータの正確性問題が発生します。この現象を「フォールト・トリプリテーション」と呼びます。
「フォールト・トリプリテーション」の回避方法
OceanBaseデータベースは、Paxosプロトコルに基づいて高可用性の選挙およびログ同期プロトコルを実装しており、一方でデータの安全性を保証し、他方で優れたサービスの連続性を提供します。
Paxosプロトコルは多数派に基づくプロトコルであり、簡単に言えば、いかなる決定も多数派ノードの一致によって成立します。
OceanBaseデータベースの高可用性選挙は、いかなる瞬間においても、多数派の承認を得た場合にのみ、あるノードがプライマリノードとして読み書きサービスを提供できることを保証します。集合内の任意の2つの多数派には必ず共通部分が存在するため、同時に2つのプライマリノードが選出されることはありません。
あるノードがプライマリノードに選出された後、サービスの連続性はリース(Lease)メカニズムによって保証されます。
少数派のスタンバイノードに障害が発生した場合、プライマリノードのサービスは一切影響を受けません。
プライマリノードに障害が発生したり、ネットワークが分断されたりした場合、多数派のスタンバイノードはまずリースの期限が切れるのを待ちます。リースの期限が切れた後、元のプライマリノードは読み書きサービスを提供しなくなることを保証し、その時点でOceanBaseデータベースは残りのノード集合から新しいプライマリノードを自動的に選出してサービスを継続します。
OceanBaseデータベースのログ同期プロトコルは、書き込み待ちのデータが多数派ノードで正常に永続化されていることを要求します。典型的な同一都市内の3データセンター構成を例にとると、任意のトランザクションの永続化されたログは、少なくとも2つのデータセンターに同期された後、トランザクションは最終的にコミットされます。
少数派のスタンバイノードに障害が発生した場合、同様に、プライマリノードのサービスは一切影響を受けず、データは損失されません。
プライマリノードに障害が発生したり、ネットワークが分断されたりした場合、残りのノードには依然として完全なデータが保持されています。高可用性選挙はまず新しいプライマリノードを選出し、そのノードが復元プロセスを実行して残りのノードから完全なデータを復元し、その後サービスを再開できるようにします。このプロセスは完全に自動的です。
上記の分析に基づき、OceanBaseデータベースはPaxosプロトコルに基づいて実装された高可用性選挙およびログ同期プロトコルにより、「フォールト・トリプリテーション」を回避するとともに、データの安全性とサービスの連続性を保証しています。