<写真欄>
日本オラクル株式会社
2006年07月07日
Oracle Database Lite 10g 同期アーキテクチャ解説
はじめに
y
当資料ではOracle Database Lite 10gの同期ア
ーキテクチャを解説し、アプリケーション開発者が
当製品の同期機能を引き出せるよう支援します。
–
同期アーキテクチャ全体像
–同期オブジェクトとその役割
–同期処理プロセス
3
Copyright© 2006, Oracle. All rights reserved.
Agenda
y
同期アーキテクチャ全体像
y
同期オブジェクトとその役割
y
同期プロセス解説
同期クライアント y Mobileサーバーに同期 要求を送り、結果を受け 取るOracle Database Lite
の
アーキテクチャ
モバイル・ アプリケーション 同期 クライアント Mobile サーバー Mobileサーバー・ リポジトリ
Oracle Lite データベース Oracle データベース
クライアント 中間層 データベース・サーバー Oracle Lite RDBMS MGP y リポジトリと通信 y 同期処理代行 Mobileサーバー・リポジトリ y 管理スキーマの格納 – キュー y マスター表 Mobileサーバー y クライアントとの同期通信 y 管理サービスの提供 Message Generator & Processor (MGP) Oracle Lite RDBMS y アプリケーション実行環境
5
Copyright© 2006, Oracle. All rights reserved.
クライアント
パブリケーション・アイテム (SQL)で取得した実データ
Oracle Database Liteの最も単純な同期構造
Oracle Lite データベース Oracle データベース
データベース・サーバー スナップショットの 元表 SQL定義と差分情報 のみ管理
スナップショット
パブリケーション・
マスター表
アイテム
スナップショット
定義SQL
差分情報
aaa 10 bbb aaa 20 10 SELECT * FROM TAB1WHERE COL1=10 TAB1 TAB1 PubItem_TAB1 キュー
スケーラビリティを実現する2段階の「非同期(asynchronous)」処理
同期 クライアント MGP イン・キュー エラー・キュー アウト・キュー スナップショット マスター表 3.適用 4.構成 同期 クライアント 同期 クライアント 同期 サービス 更新 1.アップロード 2.ダウンロード クライアント 中間層 データベース・サーバー Sync処理=通信処理 1. 変更行がクライアントからサーバ ーのイン・キューへアップロード 2. 変更行がサーバーのアウト・キュ ーからクライアントにダウンロード MGP処理=同期代行 3. イン・キューの変更情報をマスタ ー表に適用する 4. マスター表の変更をアウト・キュ ーに構成する 独立して動作2フェーズの非同期処理
7
Copyright© 2006, Oracle. All rights reserved.
同期方式と同時実行性の比較
Oracle Lite キュー Oracle クライアント・ データベース 同期 サーバ サーバー・ データベース 1. クライアント1同期。マスターデータ変更 2. クライアント2の同期は1の同期が完了するまで待ち 1. クライアント1同期。変更情報はキューに格納される 2. クライアント2の同期は1が同期中でも実行される 全クライアントが同時に同期した場合の同期完了時間 = 各クライアントの同期時間の合計 全クライアントが同時に同期した場合の同期完了時間 =各クライアントの同期時間で最大のもの c1 c2 c3 c4 c1 c2 c3 c4 Time TimeSynchronous(即時同期)
Asynchronous(非同期)
c1 c2 c1 c2 待ち 待ち 待ち MGP データベース・オブジェクト (スナップショットなど) データベース・オブジェクト(表など) イン・キュー アウト・キュー エラー・キュー 適用処理 構成処理 変更情報 更新トリガー 変更差分 更新トリガー データ更新 同期クライアント Mobileサーバー Oracleデータベース ダウンロード アップロード Oracle Liteデータベース同期アーキテクチャ概要図
データ更新9
Copyright© 2006, Oracle. All rights reserved. <TAB> CFM$<PI> CMP$<PI> CEQ$<TAB> 適用処理 構成処理 CLG$<TAB> CVR$<TAB> 更新トリガー データ更新 Oracleデータベース MOBILEADMIN スキーマ DBUSER スキーマ CFM$<PI> イン・キュー CMP$<PI> アウト・キュー CEQ$<TAB> CLG$<TAB> CVR$<TAB> エラー・キュー ログ生成表 行バージョン表 差分同期をサポートするため のデータベース・オブジェクトが パブリケーション・アイテム作成 時に作成される 更新トリガー
同期コンポーネントの主要テーブル一覧
<PI> パブリケーション・アイテム名 <TAB> マスター表名Agenda
y
同期アーキテクチャ全体像
y
同期オブジェクトとその役割
y
同期プロセス解説
11
Copyright© 2006, Oracle. All rights reserved. Oracle Liteデータベース
スナップショット
リポジトリ(Oracleデータベース)
マスター表
パブリケーション
サブスクリプション
クライアント(ユーザー)
ファイル
同期
アプリケーション
サブセッティング・パラメータ
パブリケーション
・アイテム
ファイル
アプリケーション
同期オブジェクト概念図
パブリケーション・アイテム
パブリケーション・
アイテム
スナップショット
定義SQL
差分情報
y
パブリケーション・アイテム=サーバー側で管理するスナップショット・クラス – 実データを持たず、定義情報と差分情報のみを格納 – リポジトリ上に作成y
定義情報(パブリケーション・アイテム・クエリー) – クライアントに送信するスナップショットを定義したクエリーを記述(詳細は後述)y
キューによる差分情報の管理 – イン・キュー(アップロードデータの管理) – アウト・キュー(ダウンロードデータの管理) – エラー・キュー(同期エラー、データ競合の管理)パブリケーション・アイテム・クエリー
例. SELECT * FROM EMP
イン・キュー
アウト・キュー
エラー・キュー
13
Copyright© 2006, Oracle. All rights reserved.
パブリケーション・アイテム
y
パブリケーション・アイテム・クエリーの定義方法 – SELECT文を記述 – バインド変数(データ・サブセッティング・パラメータ)設定可能 – ベースオブジェクト:表、ビュー、シノニム、マテリアライズド・ビュー(R10.2.0.2~) – 水平分割(条件句による行指定)、垂直分割(列指定) – 表結合クエリーにも対応 マスター表EMP(EMPNO, ENAME, DEPTNO)
Case2. バインド変数+行指定 SELECT * FROM EMP WHERE EMPNO = :eno
Case3. 列指定
SELECT EMPNO,ENAME
FROM EMP Case1. マスタと同一 SELECT*FROM EMP
Case4. 表結合
SELECT E.EMPNO,E.ENAME, D.LOC
FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO
マスター表
DEPT(DEPTNO, DNAME, LOC)
パブリケーション・アイテムの例
パブリケーション・アイテム
同期 SYNC_1 SYNC_2 SYNC_3 アウト・キューからの削除 アウト・キューへの挿入 ログ表への挿入 LDEL_1 LDEL_2 LDEL_3 パブリケーション・アイテム・クエリー •パブリケーション・アイテム定義で使用したSELECT文そのもの •完全リフレッシュではそのまま使用される パブリケーション・アイテム・クエリー・テンプレート •差分同期を実行するためにパブリケーション・アイテム・クエリーに付加(ラッパー)される •同期(アップロード、高速リフレッシュ)およびMGP処理で使用される •カテゴリ(4項目)別に複数種類のテンプレートが存在 •通常は各カテゴリ毎にデフォルトのテンプレートを使用 •Consperfツールでデフォルト以外のテンプレートを選択可能 LG_1 LG_2 LG_3 LDEL_4 LINS_1 LINS_2 LINS_3 LGN_115
Copyright© 2006, Oracle. All rights reserved.
パブリケーション・アイテム
y
定義オプション
–
更新可能 / 読取専用
–
高速リフレッシュ / 完全リフレッシュ
y
パブリケーション・アイテムの命名規則
–
パッケージ・ウィザードで定義
⇒WTGPI_xxxxx(自動作成)
–
APIおよびMobile Database Workbench(MDW)
⇒任意
パブリケーション・アイテムパブリケーション
y 同期オブジェクト・グループ – 「アプリケーション」とほぼ同義 – クライアント・アプリケーションが使用するデータベース・オ ブジェクトをグループ化 – 各データベース・オブジェクトはパブリケーションに登録され てはじめてクライアントに配信される – 同期は原則パブリケーション単位 y 含めることができるオブジェクト – パブリケーション・アイテム y 重み付け(親子関係表の同期順の設定) y 競合解消フラグ(サーバー優先/クライアント優先/カス タム) – シーケンス – SQLスクリプト(DDL) – Javaリソース(ストアド・プロシージャおよびトリガー)y
パブリケーションの命名規則 – パッケージ・ウィザードで定義 ⇒xxxxx(内部的に自動作成。アプリケーション名とは異 なる)– APIおよびMobile Database Workbench(MDW)
⇒任意 シーケンス SQLスクリプト(DDL) Javaリソース PubItem1 パ ブ リ ケ ー シ ョ ン PubItem2
17
Copyright© 2006, Oracle. All rights reserved.
サブスクリプション
y
アクセスリスト
–
クライアントとパブリケーション(アプリケーション)の紐付け
–
この情報を元にパブリケーションに登録されたオブジェクトをクライ
アントに配信する
y
データ・サブセッティング・パラメータの値とクライアントとの紐
付けにも使用される
y
APIもしくはMobile Managerで定義
クライアント1
クライアント2
クライアント3
パブリケーション1
パブリケーション2
サブスクリプション・パラメータ
y
パブリケーション・アイテム・クエ
リーで埋め込まれるバインド変
数
y
“:変数名”でパラメータを定義
y
各クライアント固有のデータを取
得する際に利用されることが多
い
y
パラメータの値はサブスクリプシ
ョン確定後、各クライアントごと
に値を設定する
SELECT * FROM EMP
WHERE EMPNO =
:eno
サブセッティング・パラメータ
クライアント1
クライアント2
クライアント3
:eno=10
:eno=20
:eno=30
データ・サブセッティング・パラメータ
19
Copyright© 2006, Oracle. All rights reserved.
クライアント
y
Mobile Managerおよびリポジトリでは「ユーザ
ー」と同義
y
Mobileサーバーにログインして同期する
クライアント1
クライアント2
クライアントN
Mobile
サーバー
Agenda
y
同期アーキテクチャ全体像
y
同期オブジェクトとその役割
y
同期プロセス解説
21
Copyright© 2006, Oracle. All rights reserved.
Mobileサーバー データベース・オブジェクト (スナップショットなど) イン・キュー アウト・キュー エラー・キュー 変更差分 更新トリガー データ更新
①
同期開始。同期クライアントが変更差分をファ イルに抽出②
同期クライアントは差分ファイルをMobileサー バーに送信(アップロード)。Mobileサーバーは イン・キューに格納 ① ② ③ ④③
Mobileサーバーはアウト・キューから前回同期 の結果を抽出し、ファイルで同期クライアントに 送信(ダウンロード)④
同期クライアントは受け取った結果ファイルをス ナップショットに適用し、同期完了 Oracle Lite データベース Oracleデータベース 同期クライアント ダウンロード アップロード同期(アップロード/ダウンロード)
0 →32 OL__ROW_STATUS 1 VER 100 →80 SAL 山田さん 10 ENAME EMPNO 80 SAL 10 EMPNO 山田さん ENAME 1 VER USER1 CLID U DML①
Oracle Liteでスナップショットの値を更新②
①と同時に内部列に更新フラグが立つ(挿入16、更新32、削除80)③
同期開始。Mobileクライアントは②を元に差分ファイルを生成。Mobileサーバー に送信④
Mobileサーバーは差分ファイルの情報をイン・キューへ格納 差分ファイル (cl2sv.bin) スナップショット emp ②行ステータス変更 ①Update 例:Oracle Liteで以下のUpdate文を実行してアップロード処理を実行UPDATE emp SET SAL=80 WHERE EMPNO=10;
③差分抽出
④イン・キュー(CFM$PI_emp)へ送信 送信の対象は変更済行。トランザクションそのものではない
23
Copyright© 2006, Oracle. All rights reserved.
y
更新可能かつ完全リフレッシュで定義されているスナップショット(パブリケーション・ア イテム)が1つでもパブリケーションに含まれる場合、パブリケーション内の全てのスナ ップショットの変更情報はイン・キューに格納せず、直接マスター表に適用される。y
ダウンロードは通常の同期処理と同じくアウト・キューから取得するアップロード時の適用(同期オプション)
イン・キュー エラー・キュー アウト・キュー エラー・キュー アウト・キュー スナップショット マスター表 スナップショット マスター表 通常のアップロード&ダウンロード処理 アップロード時に即適用 ダウンロードはアウト・キューから 高速&更新可能 パブリケーション・アイテム 完全&更新可能 パブリケーション・アイテム (ダミー定義可) パブリケーションPI_1 PI_2 PI_3
以下の構成の場合、全てのパブリケーション・ アイテムでアップロード時に変更情報をマスタ ー表に即時適用する y クライアントからのアップロードをマスター 表からリアルタイムで検索できる y アップロード時に適用処理まで行うため、 同期時間のオーバーヘッドは増える y ダウンロードではアウト・キューを使用する ため、MGPの構成処理は必要。 80 SAL 10 EMPNO 山田さん ENAME 1 VER USER1 CLID I DML 送信の対象は変更済行。 トランザクションそのもの ではない アウト・キューには各クライアント毎に送信済のマスター表の主キーが格納される。 マスター表で発生した差分更新は、MGPの構成処理でダウンロード待ちのフラグが 立ち、この情報を元に各クライアントはマスターの変更情報のみをダウンロードする Mobileサーバーは①+②でパブリケーション・アイテム・クエリー・テンプレートを生 成し、クライアントに配信する差分データを抽出する ④ Oracle Liteのスナップショットに③の内容を適用
ダウンロード処理(高速リフレッシュ)
DML マスター表の現在行のDMLステータス (I ⇒ 挿入と更新、D ⇒ 削除) DTYPE (ダウンロード・ステータス) Null ⇒ クライアントからダウンロード待ち U ⇒ クライアントで行が変更された D ⇒ クライアントで行が削除された ③ 差分ファイル(sv2cl.bin) アウト・キュー(CMP$PI_emp)パブリケーション・アイテム・クエリー(SELECT * FROM emp) I DML 10 EMPNO 1 VER USER1 CLID DTYPE ① ②
25
Copyright© 2006, Oracle. All rights reserved. I 1 100 佐藤さん 30 USER1 I 1 200 田中さん 20 USER1 I 1 80 山田さん 10 USER1 SAL
EMPNO ENAME VER
CLID DML
① SELECT * FROM emp
アウト・キューを使用しません。Mobileサーバーはスナップショット定義SQLで直接 リポジトリに問い合わせてデータを取得する ② Oracle Liteのスナップショットに①の内容を適用
ダウンロード処理(初回同期、完全リフレッシュ)
スナップショット定義のSQLでリポジトリに問合せを行い、取得データをファイルにし てOracle Liteに送信 差分ファイル(sv2cl.bin) データベース・オブジェクト(表など) イン・キュー アウト・キュー エラー・キュー 適用処理 構成処理 変更情報 更新トリガー データ更新 ① MGPはイン・キューから1件取り出し 表に適用する。このときデータ競合 が発生する場合がある ② データ競合が発生した場合、MGPは 自動解消を試みる。成功すればロジ ックに従って値を決定。解消できない 場合はエラー・キューに格納する ① ② ② ③ ④ ④ 全ての適用が終わるとMGPは変更 情報に基づいて各クライアントごとに アウト・キューを構成し、次回クライア ントからの同期要求に備える ③ 適用の結果、あるいはマスタ表に直 接更新が行われるとトリガーにより 変更情報が内部で記録される OracleデータベースMGP(適用/構成)
MGP
27
Copyright© 2006, Oracle. All rights reserved. 100 →80 山田さん 10 SAL ENAME EMPNO →I 1 →2 DML VER 80 SAL 10 EMPNO 山田さん ENAME 1 VER USER1 CLID U DML
①
マスタ表とイン・キューの主キーとVERを比較。一致したら②へ(不一致は競合)②
マスタ表のDMLがnullであれば③へ(not nullなら競合)③
イン・キューの内容(操作)をマスターに上書き④
行バージョン表のVERを1増分、DMLをIに変更 ① ① ② ③ ④ 例:Oracle Liteで以下のUpdate文を実行してイン・キューにアップロードした状態UPDATE emp SET SAL=80 WHERE EMPNO=10;
適用処理(競合なし)
イン・キュー(CFM$PI_emp) 行バージョン表(CVR$emp) マスタ表(emp) ④ 適用前にマスタでも更新発生(VER+1、DMLフラグあり) 250 田中さん 20 SAL ENAME EMPNO I 2 DML VER 200 SAL 20 EMPNO 田中さん ENAME 1 VER USER1 CLID U DML①
マスタ表とイン・キューの主キーとVERが不一致(マスタのVER値が新しい) もしくはマスタ表のDML≠nullの場合、競合発生②
競合解消ルーチンへ イン・キュー(CFM$PI_emp) 行バージョン表(CVR$emp) ① ① ② 例:Oracle Liteで以下のUpdate文を実行してイン・キューにアップロードUPDATE emp SET SAL=200 WHERE EMPNO=20;
かつ適用前にOracleでも以下のUpdate文が実行されていた場合・・・
UPDATE emp SET SAL=250 WHERE EMPNO=20;
競合の検出
29
Copyright© 2006, Oracle. All rights reserved. 競合 更新競合:サーバーで更新した行と同じ主キーの行をクライアントで更新・削除 挿入競合:クライアント、サーバー双方で同じ主キーの行を挿入 競合エラー 削除競合:サーバーで削除した行と同じ行をクライアントで更新 ※Oracleのレプリケーションでの競合エラーと動作を合わせるため その他、参照制約違反など
競合の解消
削除競合を含む 競合エラーもしく は未解決の競合 更新競合または 挿入競合 エラー・キュー へ格納 手動で解決後 トランザクション 再実行 エラー・キューの パージ(廃棄) サーバー優先 クライアント優先 カスタム解消 (要ロジック実装) 競 合 発 生 ? 競合解消試行 競 合 解 決 10 EMPNO I 2 DML VER ログ表(CLG$emp) 行バージョン表(CVR$emp) I DML 10 EMPNO 2 VER USER1 CLID DTYPE 10 EMPNO 2 VER I DML アウト・キュー(CMP$PI_emp)構成処理(ダウンロード・データの準備)
① 変更対象の表情報の収集 C$ALL_CLIENTS C$ALL_CLIENT_ITEMS C$ALL_LOGS C$ALL_SUBSCRIPTION_PARAMS ② ①を元に各表別に変更行 の情報をログ表にコピー CVR$表のDML=null C$ALL_SID_LOGGED_TABLES C$ALL_LOGGED_TABLES ③ クライアントごとに変更行 をアウト・キューに構成 ログ表(CLG$emp) ⑤ログ表の初期化 ④ DTYPEをnullに(ダウンロード準備完了)31
Copyright© 2006, Oracle. All rights reserved.
y
Oracle Liteの同期処理は複数のフェーズで構成され、それぞれ独立し
て動作する
– 同期(Sync)、MGP、マスター表更新 – クライアントの同期レスポンスタイムを向上させるためy
同一クライアント内の隣接する各フェーズ(同期⇔MGP、MGP⇔マスター
表更新)が同時に実行されないように制御される
– 各フェーズの処理中は特定の内部表および行にロックをかける – 同期処理とマスター表の更新はお互いブロックしないy
後から起動される処理は以下のいずれかの動作
– 同期: 処理を中止し、エラーをクライアントに返す – MGP: そのサイクルでの処理をスキップ。次サイクル時に試行 – マスター表更新:実行中の処理の完了を待つ同期処理内部の同時実行性の制御
同期
MGP
マスタ更新
ブロック ブロック ブロックなし クライアント1OK
NG:Error
Server Busy
NG:Error
Server Busy
同期
NG:Skip
2重起動×
MGP
NG:Skip
Next Try
NG:Skip
Next Try
マスタ更新
OK
行ロック
更新確定待ち
MGP処理
待ち
同期中
MGP中
マスタ更新中
同期処理各フェーズ間の同時実行性
同じクライアントで処理がもし重なったら?
Ex. MGPで適用/構成中のクライアントが同期を試みた
33
Copyright© 2006, Oracle. All rights reserved.
• 適用⇒構成⇒待機⇒適用・・・を繰り返す
• 待機の時間に同期を受け付ける
• MGP起動時にすでに同期中のセッションがある場合、次回起動時に適用を
試みる
• 待機時間は起動パラメータで設定(固定)
適用時間に影響を与える要素
•
クライアントの更新レコード数 • クライアント数 • パブリケーション・アイテム定義SQL • 競合の有無構成時間に影響を与える要素
•
更新対象のパブリケーション・アイテム数 • クライアント数 • スナップショットが読取専用 or 更新可能 • サブセッティング・パラメータ数 • パブリケーション・アイテム定義SQLの 実行時間適用
構成
待機
適用
構成
待機
MGPのサイクル起動
構成処理 適用処理適用
構成
待機
適用
構成
待機
MGP処理の内訳
クライアント1 イン・キュー1 イン・キュー2 行1 行2 クライアント2 クライアント1 トランザクション・ログ ログ表1 ログ表2 アウト・キュー 1 アウト・キュー 2 適用 DMLもしくはSELECT発行 クライアント2 アウト・キュー 1 アウト・キュー 2 適用 イン・キュー1 イン・キュー2 行1 行2 適用 適用 適用処理の順序 • クライアント1 •イン・キュー1 •行1 • 行2 •イン・キュー2 • クライアント235
Copyright© 2006, Oracle. All rights reserved.