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