OceanBaseデータベースのアーキテクチャと実装方法は、データの強い一貫性、完全性、および高可用性を保証します。
OceanBaseデータベースのアーキテクチャ
図に示すように、データサービス層はOceanBaseデータベースクラスタを表します。このクラスタは3つのサブクラスタ(ゾーン)で構成されており、1つのゾーンは複数の物理マシンで構成され、各物理マシンはデータノード(OBServerノード)と呼ばれます。OceanBaseデータベースはShared-Nothingの分散アーキテクチャを採用しており、各データノードは対等です。
OceanBaseデータベースに保存されるデータは、1つのゾーン内の複数のデータノードに分散して配置され、他のゾーンには複数のデータレプリカが格納されます。図に示すOceanBaseデータベースクラスタのデータには3つのレプリカがあり、各ゾーンに1つずつ配置されています。これら3つのゾーンが一体となってデータベースクラスタを形成し、ユーザーにサービスを提供します。
デプロイ方式によって、OceanBaseデータベースはさまざまなレベルの災害復旧機能を実現できます:
サーバー(Server)レベルの無損失災害復旧:単一のサーバーが利用不可能になった場合でも、自動的に無損失で切り替えることができます。
データセンター(Zone)レベルの無損失災害復旧:単一のデータセンターが利用不可能になった場合でも、自動的に無損失で切り替えることができます。
リージョン(Region)レベルの無損失災害復旧:特定の都市全体が利用不可能になった場合でも、自動的に無損失で切り替えることができます。
データベースクラスタが1つのデータセンターの複数のサーバーにデプロイされている場合、サーバーレベルの災害復旧が実現されます。クラスタのサーバーが1つのリージョン内の複数のデータセンターに配置されている場合、データセンターレベルの災害復旧が実現されます。クラスタのサーバーが複数のリージョンの複数のデータセンターに配置されている場合、リージョンレベルの災害復旧が実現されます。
OceanBaseデータベースの災害復旧機能は、RPO=0、RTO<8秒という国標最高の6級基準を達成できます。
高可用性
OceanBaseの分散クラスタでは、複数のマシンが同時にデータベースサービスを提供し、その高可用性を実現しています。上図では、アプリケーション層からのリクエストはプロキシサービス(ODP、またはobproxyとも呼ばれる)に送信されます。プロキシサービスによるルーティングを経て、実際のサービスデータを提供するデータベースノード(OBServerノード)に送信され、リクエストの結果は逆の経路でアプリケーション層に返されます。このプロセス全体において、異なるコンポーネントがそれぞれ独自の方法で高可用性を実現しています。
データベースノード(OBServerノード)で構成されるクラスタでは、すべてのデータがパーティション単位で保存され、高可用性サービスが提供されます。各パーティションには複数のレプリカが存在します。一般的に、一つのパーティションの複数のレプリカは複数の異なるゾーンに分散配置されます。複数のレプリカのうち、変更操作を受け入れるのは主レプリカ(Leader)のみであり、他はフォロワーレプリカ(Follower)と呼ばれます。主レプリカとフォロワーレプリカ間では、Multi-Paxosに基づく分散合意プロトコルによってデータの一貫性が保証されています。主レプリカが存在するノードに障害が発生した場合、新たなプライマリノードが選出され、サービスを継続します。
選出サービスは高可用性の基盤です。OceanBaseデータベースの以前のバージョンとは異なり、V4.x系では選出サービスの粒度がパーティションからログストリームへと変更され、パーティションはログストリーム上にマウントされます。ログストリームの複数のレプリカのうち、選出プロトコルによって一つが主レプリカ(Leader)として選ばれます。この選出は、クラスタの再起動時や主レプリカに障害が発生した場合に行われます。
さらに、V4.x系では選出サービスはNTPや他の時計同期サービスに依存せず、ローカル時計と改良されたレンタル機構によってクラスタ内の各マシンの時計の一貫性を保証します。選出サービスは優先順位メカニズムによって、より適切なレプリカを主レプリカとして選択することを保証しており、この優先順位メカニズムはユーザー指定のPrimaryゾーンやマシンの異常状態などを考慮します。
主レプリカがサービスを開始すると、ユーザーの操作によって新たなデータの変更が生じ、すべての変更はログとして生成され、他のスタンバイレプリカ(Follower)に同期されます。OceanBaseデータベースがログ情報を同期するプロトコルはMulti-Paxos分散合意プロトコルです。Multi-Paxosプロトコルは、合意が必要なログ情報がレプリカリスト内の過半数のレプリカに永続化された後に保証されるため、少数派のレプリカに障害が発生しても情報は失われません。Multi-Paxosプロトコルによる複数のレプリカへの同期は、少数のノードに障害が発生した場合でも、システムの二つの重要な特性を保証します:データの損失がないこと、サービスの停止がないことです。ユーザーが書き込んだデータは少数のノードの障害に耐えることができ、またノードに障害が発生した場合でも、システムは常に自動的に新しいレプリカを主レプリカとして選出し、データベースのサービスを継続します。
OceanBaseデータベースの各テナントにはグローバルタイムスタンプサービス(GTS)も備えており、テナント内で実行されるすべてのトランザクションに対して、トランザクションの読み取りスナップショットバージョンとコミットバージョンを提供し、グローバルなトランザクションの順序を保証します。グローバルタイムスタンプサービスに異常が発生すると、テナントのトランザクション関連操作に影響が及びます。OceanBaseデータベースは、パーティションレプリカと同一の仕組みを用いてグローバルタイムスタンプサービスの信頼性と可用性を保証しています。テナント内のグローバルタイムスタンプサービスの実際の位置は、特別なパーティションによって決定され、この特別なパーティションも他のパーティションと同様に複数のレプリカを持ち、選出サービスによって一つの主レプリカが選ばれます。主レプリカが存在するノードがグローバルタイムスタンプサービスのノードとなります。このノードに障害が発生した場合、特別なパーティションは別のレプリカを主レプリカとして選出し、グローバルタイムスタンプサービスも自動的に新しい主レプリカのノードに移行してサービスを継続します。
以上がデータベースクラスタノードが高可用性を実現するための主要なコンポーネントです。プロキシサービス(ODP、またはobproxyとも呼ばれる)もまた、そのサービスを保証するために高可用性が求められます。ユーザーのリクエストは最初にプロキシサービスに到達し、プロキシサービスが正常でなければユーザーのリクエストは正常に処理されません。プロキシサービスはまた、データベースクラスタノードの障害を処理し、それに応じたフォールトトレランス処理を行う必要があります。
プロキシサービスはデータベースクラスタとは異なり、永続化された状態を持たず、その業務に必要なすべてのデータ情報はデータベースサービスへのアクセスによって得られるため、プロキシサービスの障害によってデータが失われることはありません。プロキシサービスも複数のノードで構成されるクラスタサービスであり、ユーザーのリクエストが具体的にどのプロキシサービスノードで実行されるかは、ユーザーのF5やその他のロードバランシングコンポーネントが担当します。また、プロキシサービスの特定のノードに障害が発生した場合も、ロードバランシングコンポーネントが自動的に除外し、その後のリクエストが障害ノードに送信されないようにします。
プロキシサービスの動作過程では、データベースクラスタの状態をリアルタイムで監視します。一方でプロキシサービスはクラスタのシステムテーブルをリアルタイムで取得し、システムテーブルを通じて各マシンのヘルス状態とパーティションのリアルタイム位置を把握します。他方でプロキシサービスはネットワーク接続を通じてデータベースクラスタノードのサービス状態を検出し、異常が発生した場合は該当ノードを障害状態としてマークし、適切なサービス切り替えを行います。