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