※これはGlobal Active Tables and Conflict Free Replicated Data Type (CRDT)の翻訳です。
ビジネスは急速に変化しています。 顧客はより優れたアプリケーション体験と満足度の向上を求めています。顧客は高速なブラウジング体験を楽しみ、期待しています。 ページ読み込みのわずかな遅延でも、ビジネスに悪影響を与える可能性があります。今日の世界の経済状況では、サイトは応答性が高く、低遅延でページ読み込みを実行できる必要があります。
Active – Active 構成においては、すべてのリージョンが読み取りリクエストと書き込みリクエストを同時にアクティブに処理します。 このアーキテクチャには次の利点があります。
- 世界的に分散した視聴者 – 地理的に分散した顧客のサポートが必要な場合、リモート処理よりもローカル地域での処理を提供する方が有利です。ローカル地域での処理では、遅延が最小限に抑えられ、最高のパフォーマンスが得られ、広域ネットワークアクセスが回避されます。
- どこでも読み取り・書き込み – いつでも、どのリージョンでも同じレコードを読み取り・書き込みできる機能。これにより、OCI リソースが最適に使用され、すべてのリージョンが読み取りだけでなく書き込みも処理できるようになります。
- シームレスな災害復旧 – 高度な災害復旧の柔軟性が提供され、地域的な災害が発生した場合に、読み取りリクエストと書き込みリクエストの両方を任意のリージョンにルーティングできます。
Global Active Tableは、リージョン間でデータレプリケーションにおける問題とエラーが発生しやすい作業を排除し、開発者がアプリケーションのビジネスロジックに集中できるようにするグローバルな論理テーブルです。 1 つのリージョンで実行されたすべての更新は、他のすべてのリージョンに自動的に伝播されます。しかし、競合の検出と解決についてはどうでしょうか?
詳細は Oracle NoSQL Global Active Tables deliver extreme performance for globally distributed applications をご覧ください。
競合のないレプリケートされたデータ型
Active – Active レプリケーション・ソリューションの実装は簡単ではありません。成功の鍵は、リアルタイムのデータ移動、競合の検出と解決、および異種環境のサポートにあります。 3 つの中で、競合の検出と解決は最も複雑です。複数のシステムがトランザクションを処理し、そのアクティビティがシステム間で共有される場合、Active -Activeレプリケーション構成では競合を検出して対処することが不可欠になります。Oracle NoSQL には、後勝ちの優先アルゴリズムに基づいた競合解決ソリューションが組み込まれており、ほとんどの場合にうまく機能します。しかし、データの値をリージョン間で合算する必要があるデータオブジェクトのクラスについてはどうでしょうか?
特定の状況では、リージョン全体で更新を集約し、結果を合計し、アプリケーションが値の読み取りを要求したときに合計結果を表示したいとします。 この場合、後勝ちの仕組みは最適なアプローチではありません。これはどのように対処できますか? Oracle NoSQLは、開発者がグローバル・カウンタを処理・計算するための競合のないレプリケート・データ型であるCRDTと呼ばれるメカニズムを提供し、グローバル・カウンタを使用して計算記録の負担を軽減し、グローバル・カウンタを使用してリージョン全体で値を集計するため、アプリケーションを再設計したり書き直す必要はありません。
CRDT は、共通のプロパティセットを備えたレプリケートされたデータ型のファミリーであり、CRDT に対して実行される操作を、すべてのリージョン・レプリカ間で正しく一貫した共通の状態に常に収束できるようにします。 競合が発生してアプリケーションに問題が発生しないようにするには、CRDT の操作で特定の算術プロパティのセットに留意する必要があります。
CRDT には複数のタイプがあり、Oracle NoSQL Database でリリースされた最初のタイプは、Positive-Negative (PN) Counter タイプです。 他の CRDT が将来提供される可能性があります。
まず、このブログに基づいた例を見てみましょう。 通信会社の一般的な使用例、つまり「ファミリー プラン」の提供についてお話しました。 このオプションを使用すると、アカウント所有者とその家族がプラン上のデータ使用量を共有します。アカウントには、家族全員がまとめて使用する 1 か月のデータ使用量制限が割り当てられます。 アカウントを共有している家族全員の合計データ使用量がデータ制限の 90% に達すると、通信プロバイダはアカウント所有者に SMS アラートを送信します。
注: Global Active Tableは、マルチリージョン・テーブルに基づいた拡張機能です。
この例では、家族が 3 人いて、これらの家族が遠く離れた異なる地理的地域に住んでいるとします。 アカウント所有者は、アカウントが 90% のしきい値に達すると通信プロバイダからアラートを受け取り、使用量が契約制限を超えた場合に超過料金が請求される可能性があることをアカウント所有者に通知します。
データは異なるリージョンにレプリケートされるため、各ファミリー メンバーはデータをローカルに表示できるため、レイテンシ、スループット、全体的なパフォーマンスが向上します。 つまり、複数のリージョンがあり、それぞれに顧客のデータ使用量の詳細を含むデータのコピーが存在します。 個々の使用状況はさまざまなリージョンで更新する必要があり、いつでも合計使用状況を監視できます。
CRDT データ型は、この状況で、異なるリージョン間でデータ使用量を競合なく追跡するのに最適です。 上記の例では、マルチリージョンテーブルの増分カウンターが、各リージョンのデータ使用量を追跡します。合算されたデータ使用量は、CRDT値がOracle NoSQL Database Cloud Serviceから読み取られるときに自動的に計算されます。 Oracle NoSQL は、各リージョンからのデルタ値を自動的にマージします。
MR_COUNTER データ型
Oracle NoSQL Databaseには、Global Active Tableで使用するMR_COUNTERと呼ばれるCRDTデータ型があります。 Global Active Tableのセットアップでは、CRDT は、個別に更新できるサーバ間でレプリケーションできるデータ型です。 CRDT を正しい状態に収束させることは常に可能です。 リージョン内の変更は同時に行われ、相互に同期されません。 つまり、CRDT は、ユーザーの介入なしに複数のリージョン間で同時変更をマージする方法を提供します。 MR_COUNTER データ型は、INTEGER、LONG、または NUMBER データ型のサブタイプです。
競合が決して起こらないようにするには、CRDT の演算では加算の可換特性を尊重する必要があります。 つまり、CRDT の更新は、加算または減算によってのみ行う必要があります。Positive-Negative (PN) カウンタの場合:
- 新しい行を挿入する場合は、DEFAULT 値のみが許可されます。 挿入中に CRDT フィールドに明示的な値を割り当てると、可換プロパティが壊れるため、エラーが投げられます(throwされる)。
- 行を更新する場合は、インクリメント操作とデクリメント操作のみが許可されます。

まとめ
このブログでは、Active -Active レプリケーションにおいて競合の検出と解決がいかに重要であるかについて説明しました。
- Oracle NoSQL Global Active Tableソリューションにより、世界中のどこからでも予測可能な低遅延と応答時間を実現
- Oracleは、リージョン間で値更新の自動マージと簿記を実行する CRDT を導入することで開発者体験を向上し続け、アプリ開発体験から生じるマルチリージョン調整の苦痛を軽減します。
Global Active Tableは、リージョン間でデータをレプリケーションするという問題があり、エラーが発生しやすい作業を排除するグローバルな論理テーブルであり、開発者がアプリケーションのビジネス ロジックに集中できるようにします。
