パラレル・レプリケーションの構成
デフォルトでは、レプリケーションは、レプリケーション・スキーム内のノードにソース・データベース上の1つのログ・リーダー(トランスミッタ・スレッド)とターゲット・データベース上の1つの適用側スレッド(受信側スレッド)が含まれるシングル・スレッドで実行されます。
これらのスレッドは、レプリケーションと、レプリケーション・スキーム内のノードへのトランザクションの変更の適用を並行して行います。デフォルトでは、パラレル・レプリケーションは、トランザクションの依存性を強制し、コミット順に変更を適用しますが、コミット順の強制は無効化できます。
ノート:
パラレル・レプリケーションを有効にした場合、同じトランザクション内でDDL文とDML文の両方を実行することはできません。
パラレル・レプリケーションのオプション:
-
自動パラレル・レプリケーション: トランザクションの依存性が自動的に強制され、すべての変更がコミット順に適用される、複数のスレッドにわたるパラレル・レプリケーション。これはデフォルトです。
-
コミット依存性を無効にした自動パラレル・レプリケーション: トランザクションの依存性を自動的に強制するが、サブスクライバ・データベース上でマスター・データベース上と同じ順序でコミットされるトランザクションは強制しない、複数スレッドでのパラレル・レプリケーション。
これらのオプションは、ReplicationApplyOrdering
およびReplicationParallelism
のデータ・ストア作成属性で構成され、これはデータベースの作成時に設定する必要があります。
ノート:
パラレル・レプリケーションを使用したレプリケーション・スキーム内のすべてのデータベースは、同じタイプのパラレル・レプリケーションおよび同じ数のスレッドまたはトラックを使用して同一に構成する必要があります。
パラレル・レプリケーションの属性に異なる値を設定できるのは、アップグレード中のみです。
『Oracle TimesTen In-Memory Databaseインストレーション、移行およびアップグレード・ガイド』のパラレル・レプリケーション使用時のアップグレードを参照してください
次の項では、パラレル・レプリケーションのオプションについて説明します。
自動パラレル・レプリケーションの構成
自動パラレル・レプリケーションを使用すると、レプリケーションと、クラシックまたはスタンバイ・ペアのレプリケーション・スキーム内のノードへのトランザクションの変更の適用を並行して行う複数のスレッドを構成できます。
自動パラレル・レプリケーションでは、トランザクションの依存性が強制され、変更がコミット順に適用されます。
自動パラレル・レプリケーションを有効にするには、データベース作成時に、次のようにデータ・ストア属性を設定します。
-
ReplicationApplyOrdering
=0に設定します。これはデフォルトでもあります。 -
ReplicationParallelism
を2から32の数値に設定します。この数値は、ソース・データベースでのTRANSMITTERスレッド数およびターゲット・データベースでのRECEIVERスレッド数を示します。ただし、シングル・スレッド・レプリケーションを使用している場合、ReplicationParallelism
を1 (デフォルト)に設定します。LogBufParallelism
およびReplicationParallelism
接続属性は関連しています。LogBufParallelism
は、ReplicationParallelism
で指定されたスレッドにマップされるストランドの数を指定します。たとえば、LogBufParallelism
= 4およびReplicationParallelism
= 4の場合、1つのストランドが1つのスレッドにマップされます。LogBufParallelism
= 8およびReplicationParallelism
= 4の場合、2つのストランドが1つのスレッドにマップされます。したがって、
ReplicationParallelism
が1より大きい場合は、LogBufParallelism
接続属性はReplicationParallelism
の値以上である必要があります。ReplicationParallelism
接続属性は、LogBufParallelism
の値を超えることはできません。ストランドの数をスレッド数に均等に分散するために、LogBufParallelism
をReplicationParallelism
で指定されたスレッド数の倍数にすることができます。
レプリケーション・スキームがAWTキャッシュ・グループをレプリケートするアクティブ・スタンバイ・ペアである場合は、データ・ストア属性ReplicationApplyOrdering
、ReplicationParallelism
およびCacheAWTParallelism
の設定によって、TimesTenキャッシュ表の変更を対応するOracle Database表に適用するのに使用されるスレッド数が決定されます。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のOracle Databaseへのパラレル伝播によるAWTスループットの向上を参照してください。
『Oracle TimesTen In-Memory Databaseリファレンス』のReplicationParallelism、ReplicationApplyOrderingおよびLogBufParallelismを参照してください。
コミット依存性を無効にした自動パラレル・レプリケーションの構成
トランザクションの依存性に必ず従い、変更内容がコミット順で適用されるようにするために、自動パラレル・レプリケーションでは、通常は開始依存性およびコミット依存性が追跡されます。
-
開始の依存性: 行を挿入してから同じ行を削除するなど、あるトランザクションを強制的に他のトランザクションより前に実行する操作。
-
コミットの依存性: トランザクションをマスター・データベース上と同じ順序でサブスクライバ上でコミットするときの順序。
パラレル・レプリケーションでは、複数のスレッドを使用することによってパフォーマンスが向上しますが、トランザクションでコミットの依存性を強制する必要がない場合には、自動パラレル・レプリケーションを使用するとスループット・パフォーマンスがさらに向上します。つまり、アプリケーションでトランザクションの依存性が予測可能で、ターゲット・データベースでのコミット順序がソース・データベースでの順序と同じである必要がない場合には、コミットの依存性の強制をゆるめても、正しいトランザクションを維持できるということです。たとえば、別個のトランザクションを別個の表に対して実行する場合、コミットの依存性を強制する必要はありません。
コミットの依存性を追跡する必要性をゆるめると、自動パラレル・レプリケーションのパフォーマンスが向上します。コミットの依存性を強制しない場合、非DDLトランザクションがサブスクライバでコミットされる順序は、マスターで実行される元々の順序と異なることがあります。開始の依存性は、不正な順序が適用されないように、常に強制されます。
自動パラレル・レプリケーションのコミットの依存性を無効にできるのは、非同期レプリケーションを使用し、キャッシュ・グループを含まないアクティブなスタンバイ・ペアのみです。データベースの作成時には、次のデータ・ストア属性を設定できます。
-
TimesTenデータベースを作成する前に、
ReplicationApplyOrdering=2
を設定します。 -
ReplicationParallelism
を2から32の数値に設定します。この数値は、ソース・データベースでのTRANSMITTERスレッド数およびターゲット・データベースでのRECEIVERスレッド数を示します。ただし、シングル・スレッド・レプリケーションを使用している場合、ReplicationParallelism
を1 (デフォルト)に設定します。LogBufParallelism
およびReplicationParallelism
接続属性は関連しています。LogBufParallelism
は、ReplicationParallelism
で指定されたスレッドにマップされるストランドの数を指定します。たとえば、LogBufParallelism
= 4およびReplicationParallelism
= 4の場合、1つのストランドが1つのスレッドにマップされます。LogBufParallelism
= 8およびReplicationParallelism
= 4の場合、2つのストランドが1つのスレッドにマップされます。したがって、
ReplicationParallelism
が1より大きい場合は、LogBufParallelism
接続属性はReplicationParallelism
の値以上である必要があります。ReplicationParallelism
接続属性は、LogBufParallelism
の値を超えることはできません。ストランドの数をスレッド数に均等に分散するために、LogBufParallelism
をReplicationParallelism
で指定されたスレッド数の倍数にすることができます。
ただし、パフォーマンスが向上する反面、このオプションでは一時領域に16MBの追加領域と、構成済の各レプリケーション・トラックに16MBの追加領域が必要になります(ReplicationParallelism
接続属性の設定)。たとえば、ReplicationParallism
接続属性を10に設定した場合、この機能には16MB + 160MB = 176MBの一時領域が追加で必要です。
自動パラレル・レプリケーションを使用し、コミット依存を無効化すると、一部の追跡は他の追跡より進んでいる可能性があります。これは、パラレル・レプリケーション・トラック間のドリフトとして知られています。レプリケーション・トラック間のドリフトの量は、ttDbConfig
組込みプロシージャ内でParReplMaxDrift
構成パラメータを設定して制限することができます。
Call ttDbConfig("ParReplMaxDrift", "30");
この例では、レプリケーション・トラック間で許容されるドリフトを30秒に設定しており、それを超えるとTimesTen Classicによりすべてのレプリケーション・トラックが互いに追い付くことになります。『Oracle TimesTen In-Memory Databaseリファレンス』のttDBConfigを参照してください。
自動パラレル・レプリケーション環境でのレプリケーション・トラックの指定
一般的に、マスターからサブスクライバに各トランザクションをレプリケートするときのスレッド(トラック)は自動パラレル・レプリケーションによって決まります。したがって、複数のトラック間における処理の分割方法を手動で決めることはできません。
したがってアプリケーションには、ソース・データベースでトランザクションが開始されるとき、ReplicationTrack
接続属性か、ALTER SESSION SET REPLICATION_TRACK
文を使用して、トランザクションがどのトラックに属するかを指定するオプションがあります。その後、この接続のトランザクションはすべて、このトラックを使用します。このトラックのトランザクションは、ターゲット・データベースで受信された順に適用されますが、異なるトラック間のトランザクションではコミット順序は保持されません。トランザクションにトラックを指定する場合は、トラック間でワークロードが均等に分散するようにしてください。
受信側で順番に適用される必要のある更新は、同じトラックを使用する必要があります。1つの表に対する操作を、キー値に基づいて別個のトラック間に分散することができます。たとえば、通信費の請求処理アプリケーションがあるとすると、口座番号のハッシュを使用してトラックを設定し、各口座のすべてのトランザクションを別々のトラックで送信できます。
TimesTen Classicは引き続き依存性を計算して強制し、依存トランザクションが受信側で正しい順序で適用されるようにします。
アプリケーションは、次のいずれかの方法でトランザクションをトラックに割り当てます。
-
ReplicationTrack
一般接続属性をゼロ以外の数値に設定します。接続によって発行されたすべてのトランザクションは、このトラックに割り当てられます。値は任意の数値です。TimesTenは、この接続のReplicationTrack
数をパラレル・レプリケーションの使用可能なスレッドのいずれかにマップします。これにより、アプリケーションで任意の数を使用して、順番に適用する必要のあるトランザクションをグループ化できます。『Oracle TimesTen In-Memory Databaseリファレンス』のReplicationTrackを参照してください。 -
ALTER SESSION
SQL文を使用して、現在の接続のレプリケーション・トラック数を設定します。Oracle TimesTen In-Memory Database SQLリファレンスのALTER SESSIONを参照してください。 -
SQLSetConnectOption
ODBC関数のTT_REPLICATION_TRACK
ODBC接続オプションを使用します。『Oracle TimesTen In-Memory Database C開発者ガイド』のレプリケーションで使用するための機能を参照してください -
TimesTenConnection
JDBCクラスのsetReplicationTrack()
メソッドを使用します。『Oracle TimesTen In-Memory Database Java開発者ガイド』のレプリケーションで使用するための機能を参照してください
ttConfiguration
組込みプロシージャを使用すると、現在の接続のレプリケーション・トラック数が返されます。SYS.GV$LOG_HOLDS
またはSYS.V$LOG_HOLDS
システム・ビューから選択するか、ttLogHolds
組込みプロシージャをコールして、複数のトラックが使用されていることを確認します。