Root Serviceの高可用性
OceanBaseクラスタでは、Root Serviceはクラスタの各種管理サービスを提供します。Root Serviceサービスの高可用性は以下の方法で実現されます:Root ServiceサービスはPaxosプロトコルを用いて高可用性を実現し、クラスタ設定によりRoot Serviceサービスのレプリカ数を指定することができます。Root Serviceの各レプリカはPaxosプロトコルに基づいてリーダーを選出し、リーダーレプリカが就任するとクラスタにRoot Serviceサービスを提供します。Root Serviceの現在のリーダーが障害で退任した場合、他のRoot Serviceレプリカが再選挙して新しいリーダーを選出し、Root Serviceサービスを継続して提供することで、Root Serviceの高可用性が順次実現されます。Root Serviceの各レプリカは独立したプロセスではなく、特定のノード上で起動するサービスにすぎません。
ノード状態監視
クラスタの中央制御サービスとして、Root Serviceはクラスタのノード管理を担当します。各ノードはハートビートパケット(heartbeat)を介して、定期的に(2秒ごとに)Root Serviceに自身のプロセス状態を報告します。Root Serviceはノードのハートビートパケットを監視することで、現在のobserverプロセスの稼働状態を取得します。
ノードハートビート状態関連パラメータ
lease_time:Root Serviceが累計で
lease_time時間以上、特定ノードから任意のハートビートパケットを受信していない場合、Root Serviceはそのobserverプロセスが一時的に切断されたと判断し、ノードのハートビート状態をlease_expiredとマークします。server_permanent_offline_time:Root Serviceが累計で
server_permanent_offline_time時間以上、特定ノードから任意のハートビートパケットを受信していない場合、Root Serviceはそのobserverプロセスが切断されたと判断し、ノードのハートビート状態をpermanent_offlineとマークします。
Root ServiceによるOBServerノード障害の処理
Root Serviceはハートビートパケットからノードの以下の稼働状態を取得できます:
ノードのハートビートパケットが存在し、パケット内のノードディスク状態が正常です。この状態では、Root Serviceはノードが正常に稼働していると判断します。
ノードのハートビートパケットが存在し、パケット内のノードディスク状態が異常です。この状態では、Root Serviceはobserverプロセスは存在するものの、ノードのディスクに障害が発生したと判断します。この状態では、Root Serviceはそのノード上の全てのリーダーレプリカを切り離そうと試みます。
ノードのハートビートパケットが存在せず、パケットの損失時間が比較的短く、ノードのハートビート状態が
lease_expiredです。この状態では、Root Serviceはノードの稼働状態をinactiveに設定するのみで、他の処理は行いません。ノードのハートビートパケットが存在せず、パケットの損失時間が
server_permanent_offline_timeを超え、ノードのハートビート状態がpermanent_offlineです。この場合、Root Serviceはそのノード上のデータレプリカを処理し、ノードに含まれるデータレプリカをPaxosメンバーグループから削除し、他の利用可能なノードでデータを補完することで、データレプリカのPaxosメンバーグループの完全性を保証します。
故障マシンの復旧
クラスタ内で障害が発生したノードには、以下の2つのケースがあります:
故障ノードは再起動可能です。この場合、故障マシンが以前どのようなハートビート状態にあったかに関わらず、再起動後、OBServerノードとRoot Service間のハートビートパケットが回復すれば、ノードは再びサービスを提供できます。
故障ノードが破損し、再起動できません。この場合、ノードが破損して再起動できないことを確認した後、データベース管理者がクラスタ管理操作を実行し、そのノードを削除する必要があります。削除プロセスについては、alter system delete server管理操作を参照してください。