レプリケーションテーブルは、OceanBaseデータベースにおける特殊なテーブルです。このテーブルでは、任意の「正常」なレプリカでデータの最新の変更を読み取ることができます。書き込み頻度が低く、読み取り操作の遅延やロードバランシングに対する要求が高いユーザーにとって、レプリケーションテーブルは理想的な選択肢です。
レプリケーションテーブルとは
レプリケーションテーブルと通常のテーブルの主な違いは、読み取りレプリカが最新データの読み取りをサポートするかどうかにあります。通常のテーブルのレプリカは弱い整合性の読み取りリクエストのみを実行し、古いバージョンのデータを読み取ります。一方、レプリケーションテーブルのレプリカは強い整合性の読み取りをサポートし、最新バージョンのデータを読み取ります。
ユーザーがレプリケーションテーブルを作成すると、現在のテナントのすべてのOBServerノードにそのレプリケーションテーブルのレプリカが作成されます。そのうち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のレプリケーションテーブル機能は、書き込みトランザクションの性能と災害復旧能力の両面で向上しており、レプリカのダウンが読み取り操作に与える影響が低くなっています。