第1回:Oracle 非同期型マルチマスタレプリケーションのデータ競合について

技術者向け・データベースの技術情報発信
はじめに
この連載コラムでは、DBA業務に奮闘しているマルチDBソリューション部のメンバーが、日々、DBA業務で発生した障害や、運用・保守作業に伴い調査した内容、技術研究・調査結果の概要などをご紹介させて頂きたいと考えております。
皆様、始めまして。記念すべき第1回目のコラムを担当するマルチDBソリューション部の三浦と申します。今回は「非同期型マルチマスタレプリケーションのデータ競合」について、お話し致します。
マルチマスタレプリケーションとは?!
マルチマスタレプリケーションとは、Oracle Databaseで使用できるレプリケーション機能の一つです(※1)。詳しい仕組みは省略しますが、異なるサイト(DB)にある複数のオブジェクト同士を、同期することができる機能です。
※1:12c以降では、マルチマスタレプリケーションを含む、アドバンストレプリケーション機能のサポートが終了しています。代わりに、Oracle GoldenGateが推奨されています。

レプリケーション処理を行うタイミングによって、同期型と非同期型にタイプが分かれ、非同期型は、同期型と比べてレスポンスが早いという利点があります。しかし、非同期型は2フェーズコミットを採用していない為、各サイトから同一タイミング(※2)でデータ更新を行うと、更新されたデータ同士が衝突(競合)し、データ不整合が発生する可能性があります。
※2:便宜上同一タイミングと記載しました。各サイトに設定されている同期処理のインターバルによって、更新タイミングが大きく異なっても、データ衝突が発生する可能性があります。
データの競合が発生するとどうなる?
では、データの競合が発生すると、どのような影響が発生するのでしょうか。
答えは、データ競合が発生した行のみが、各サイト毎に異なった値(データ)を持つことになります。※データ競合が発生した行のみ、レプリケーションされなくなります。
これでは、せっかく構築したレプリケーションの意味が無くなってしまいますので、解決策は用意されています。その解決策をお話する前に、どのような場合で競合が発生するのか、確認していきましょう。
データ競合の種類
データの競合が発生する場面としては、以下3つが存在します。なお、以下説明では全て、各サイトでの更新タイミングがほぼ同一とし、説明に使用しているテーブルの項目「NO」は、主キーであるとします。



データ競合の回避・解消方法
まず、データ競合を防ぐ最も効果的な方法として、以下があります。
- マルチマスタレプリケーションのタイプを同期型にする。
- データ競合が発生しないようなシステム設計や運用手順にする。
- 例)サイトを跨って、同一行を更新しない様な仕組みを検討する。
そうは言っても、上記対応は難しい場合もあるかと思いますので、Oracleで用意されている競合の回避・解消方法をいくつかご紹介したいと思います。
マルチマスタレプリケーションのテーブルに存在する列は、デフォルトでは、全ての列で一つのグループになっています。このグループを「列グループ」と呼び、同一列グループ内にある列の値が、各サイトで更新されると競合が発生します。
逆に、競合が発生しそうな列を、別の列グループに分けることで、競合を回避することが可能です。

このメソッドを設定すると、更新・挿入があった行に対してタイムスタンプが自動記録され、データの競合が発生した場合には、タイムスタンプを基に優劣が自動判断されます。優先と判断された更新内容がレプリケーションされます。
※最も早いタイムスタンプの更新内容か、最も遅いタイムスタンプの更新内容のどちらかを優先(レプリケーション対象)とすることができます。

このメソッドでは、タイムスタンプによる競合解消メソッドと、論理削除フラグ、物理削除を行うプロシージャを使用して、削除の競合解消を行います。
ユーザーが削除したい行を論理削除し、他サイトの更新と競合が発生した場合に、タイムスタンプによる競合解消メソッドにて競合を解消します。その後、論理削除が優先された場合には、プロシージャにより、論理削除されている行データを物理削除します。
※物理削除は、論理削除から一定期間経過後の行データのみを対象とすることで、必ず競合が解消されたデータのみを対象とすることができます。

最後に
今回は、詳細まで触れることができませんでしたが、非同期型のマルチマスタレプリケーションデータ競合概要についてご理解頂けたでしょうか。機会があれば、具体的なコマンドを含めて、詳細についてお話させて頂きたいと考えています。
最後になりますが、弊社は、「データベースのオールマイティ企業」を謳っており、DBに関する経験や知識、技術力に自信を持っております。
DB関連での課題解決等、必ずやお客様のお役に立てると確信しておりますので、何かございましたら弊社へご連絡下さい。
それでは、次回をお楽しみに!