ダブリケートテーブルは、OceanBaseデータベースにおける特殊なテーブルです。このテーブルは、任意の「正常」なレプリカでデータの最新の変更を読み取ることができます。書き込み頻度が低く、読み取り操作の遅延やロードバランシングに対する要求が高いユーザーにとって、ダブリケートテーブルは理想的な選択肢です。
ダブリケートテーブルとは
ダブリケートテーブルと通常のテーブルの主な違いは、読み取りレプリカが最新データの読み取りをサポートするかどうかにあります。通常のテーブルのレプリカは弱い整合性の読み取りリクエストしか実行できず、古いバージョンのデータを読み取ります。一方、ダブリケートテーブルのレプリカは強い整合性の読み取りをサポートし、最新バージョンのデータを読み取ります。
ユーザーがダブリケートテーブルを作成すると、現在のテナントのすべてのOBServerノードにそのテーブルのレプリカが作成されます。そのうち1つのレプリカがリーダーとして選出され、書き込みリクエストを受け付けます。残りのレプリカは読み取りリクエストのみを受け付けることができます。
すべてのレプリカはリーダーに状態を報告する必要があり、主にデータ同期の進捗状況、すなわちレプリケーションの進捗状況を報告します。通常、フォロワーのレプリケーション進捗はリーダーより若干遅れますが、その遅れが一定のしきい値を超えない限り、リーダーはそのレプリカを「正常」状態と判断し、リーダー上の変更を迅速に再現できると見なします。リーダーが特定のレプリカが一定期間「正常」状態を維持していると判断すると、そのフォロワーに一定期間のリースを付与します。簡単に言えば、リーダーはその期間中、フォロワーが「正常」状態を維持し、強い整合性の読み取りサービスを提供できると「信頼」しています。この「信頼」期間中、リーダーはダブリケートテーブルのトランザクションをコミットするたびに、フォロワーのレプリケーション進捗を確認します。フォロワーがそのトランザクションの変更を再現した後にのみ、リーダーはユーザーにトランザクションのコミット成功を報告します。この場合、ユーザーは「正常」なフォロワー上で、ちょうどコミットされたトランザクションの変更を読み取ることができます。ただし、そのフォロワーのレプリケーション進捗がトランザクションコミット時の状態に追いついている必要があります。
なぜダブリケートテーブルが必要なのか
「1書き込み・複数読み取り」はデータベースでよく見られるデプロイメント方式の1つで、1つのノードがすべての書き込み操作を処理し、その後論理ログを他の読み取りノード(例:Amazon Aurora)へ非同期または同期します。このデプロイメント方式の利点は、読み取り負荷を複数のノードに分散させることで障害回復能力を向上させられる点、およびクライアントから物理的に近いノードほど読み取り遅延が低くなる点です。
OceanBaseでは、通常は弱い整合性の読み取りと複数レプリカの組み合わせでこの要件を実現しています。そのうち1つのレプリカ(リーダー)が書き込みサービスと即時の強い整合性の読み取りを提供し、他のフォロワーは比較的古いコミット済みデータを読み取ることができます。弱い整合性の読み取りは、非同期レプリケーションのデータ同期方式下で一般的な選択肢であり、リーダーは書き込み時にフォロワーのデータレプリケーション進捗を気にする必要がなく、フォロワーは一貫した古いバージョンのデータ読み取りを提供できます。
しかし、一部のシナリオでは、ユーザーの書き込み頻度は非常に低く、書き込み操作の遅延には敏感ではありません。相対的に、これらのユーザーは読み取り操作の遅延とロードバランシングを重視し、最新データをタイムリーに読み取りたいと考えています。ダブリケートテーブル機能は、このようなニーズを満たすために設計されており、わずかなトランザクションコミット性能を犠牲にすることで、任意の「正常」なフォロワー上で最新データを読み取ることが可能です。ここで言う「正常」とは、フォロワーとリーダー間のネットワークがスムーズで、レプリケーション進捗の差が大きくないことを指します。
V3.xバージョンとV4.xバージョンにおけるダブリケートテーブルの違い
ダブリケートテーブル機能はOceanBaseデータベースV3.xバージョンから存在していましたが、V4.xバージョンではOceanBaseデータベースのアーキテクチャが大きく変更されたため、V4.xバージョンのダブリケートテーブルは単一マシンログストリームの新アーキテクチャに適応し、パーティションに基づく読み取り可能バージョン番号の検証およびログストリームに基づくリース付与メカニズムを導入し、強い整合性の読み取りの正確性を保証しています。
さらに、V4.xバージョンのダブリケートテーブル機能では、リーダー切り替え時の未コミットトランザクションの継続能力が向上しています。ユーザーまたはロードバランシングがリーダー切り替えを開始すると、未コミットのダブリケートテーブルトランザクションはV3.xバージョンのように中断されることなく、リーダー切り替え後も実行を続けることができます。V3.xバージョンと比較して、V4.xのダブリケートテーブル機能は書き込みトランザクションの性能と障害回復能力の両面で向上しており、レプリカのダウンが読み取り操作に与える影響が低くなっています。