分散システムの設計において、最も重要な課題の一つは単一障害点(single point of failure (SPOF))です。あるノードがダウンした後でもシステムが正常に動作し続けられるようにするため、通常はノードに複数のレプリカをデプロイし、相互にプライマリとスタンバイとして配置します。そして、選挙プロトコルを用いて複数のレプリカの中からリーダーレプリカを選出し、リーダーレプリカに障害が発生した場合には選挙プロトコルによって自動的にスタンバイレプリカへ切り替えます。
リーダーレプリカをリーダー(Leader)、スタンバイレプリカをフォロワー(Follower)と呼びます。
分散システムにおいて、良好に機能する選挙プロトコルは、以下の二つの要件を満たす必要があります:
正確性
つまり、あるレプリカが自分自身をリーダーだと認識している場合、他のどのレプリカも同時に自分自身をリーダーだと認識してはなりません。クラスタ内で同時に2つのレプリカが自分自身をリーダーだと認識している状態を「ブレイン・スプリット」と呼びます。例えば、Raftプロトコルの選挙メカニズムでは、各Termに対してリーダーを1人しか割り当てないことでブレイン・スプリットを回避しています。しかし、ネイティブなRaftでは同一時刻に複数のレプリカが自分自身をリーダーだと認識する可能性があります(それぞれが異なるTermを担当しており、より小さいTermのリーダーレプリカがすでに失敗しているにもかかわらず、そのことに気づいていない場合です)。ネイティブなRaftプロトコルを使用する場合、読み取ったデータが最新であることを保証するためには、過半数の内容を読み取る必要があります。OceanBaseデータベースでは、Leaseメカニズムを用いて過半数へのアクセスを回避し、任意の時点で常に1つのレプリカのみが自分自身をリーダーだと認識できるようにしています。
活性
つまり、任意の時点で、リーダーがダウンした場合、クラスタ内に過半数のレプリカが生存している限り、有限時間内に生存しているレプリカの中からリーダーになるレプリカが存在するはずです。
正確性と活性を満たす基盤の上で、OceanBaseデータベースの選挙プロトコルは優先順位メカニズムとリーダー切り替えメカニズムも提供しています。優先順位メカニズムは、現在リーダーが存在しない場合に、現在リーダーに選出可能な複数のレプリカの中から、優先順位が最も高いレプリカをリーダーとして選択します。リーダー切り替えメカニズムは、現在リーダーが存在する場合に、指定されたレプリカへリーダーをシームレスに切り替えることができます。
リース期間
リーダーと過半数のレプリカが1つのリース期間以上連携できない場合、新たな選挙が開始され、次のリーダーが選出されます。
デフォルトのリース期間は10秒ですが、ユーザーは構成を変更してリース期間を変更できます。
注意
より長いリース期間は、メッセージ遅延のジッターに対する許容度が高く、堅牢性が向上しますが、同時にダウンからの復旧時間も延長されます。
より短いリース期間は、メッセージ遅延のジッターに対する許容度が低く、堅牢性が低下しますが、同時にダウンからの復旧時間も短縮されます。
優先順位
選挙プロセスにおいて、リーダーはリニューアルアクションを通じてフォロワーレプリカの優先順位の変化を感知します。フォロワーレプリカの優先順位が自分よりも高い場合、リーダーは積極的な切り替えアクションを行い、リーダーをフォロワーレプリカに移行させます。
現在の優先順位は、高い順に以下のみが含まれます:
ユーザーが指定したリーダー。
Primary Zone。
リーダー切り替え
ユーザーはALTER SYSTEM SWITCH REPLICAコマンドを使用してログストリームのリーダーの分散を制御できます。内部では、スムーズなリーダー切り替えメカニズムを通じて、外部からは感知されないようにリーダーの位置を変更します。
ユーザーはPrimary Zoneを変更することもできます。選挙はPrimary Zoneの変更を感知し、リーダーをターゲットレプリカに切り替えます。