ヘッダーをスキップ
Oracle® TimesTen In-Memory Database開発者および管理者ガイド
11gリリース2 (11.2.2)
B66443-07
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

3 アクティブ・スタンバイ・ペアのレプリケーション・スキームの定義

次の項では、高可用性システムの設計およびレプリケーション・スキームの定義方法を示します。

レプリケーションに必要な帯域幅の量を減らす方法については、「レプリケートの通信量の圧縮」を参照してください。

マスター・データベースの状態の概要

この項では、マスター・データベースの可能性のある状態の概要を示します。これらの状態は、章の後半で説明するタスクで参照されています。

マスター・データベースは、次のいずれかの状態になります。

  • ACTIVE: この状態のデータベースが、アクティブ・データベースです。アプリケーションで、そのレプリケーション表を更新できます。

  • STANDBY: この状態のデータベースが、スタンバイ・データベースです。アプリケーションでは、スタンバイ・データベースのレプリケートされていない表のみを更新できます。レプリケートされていない表とは、CREATE ACTIVE STANDBY PAIR文のEXCLUDE TABLEまたはEXCLUDE CACHE GROUP句を使用してレプリケーション・スキームから除外された表のことです。

  • FAILED: この状態のデータベースが、障害が発生したマスター・データベースです。更新は、このデータ・ストアにはレプリケートされません。

  • IDLE: この状態のデータベースでは、アクティブ・スタンバイ・ペア内での役割が割り当てられていません。更新することはできません。すべてのデータベースがIDLE状態になります。

  • RECOVERING: 前述の障害が発生したマスター・データベースは、アクティブ・データベースと更新を同期している場合、RECOVERING状態になります。

ttRepStateGet組込みプロシージャを使用して、マスター・データベースの状態を検出できます。

データベースの複製

レプリケーション・スキームの設定またはリカバリの管理における共通のタスクは、データベースの複製です。ttRepAdminユーティリティの-duplicateオプションまたはttRepDuplicateEx C関数を使用して、データベースを複製します。

データベースを複製する場合は、次の条件を満たす必要があります。

  • インスタンス管理者が複製操作を実行します。

  • インスタンス管理者のユーザー名は、複製に含まれる両方のインスタンスで同じである必要があります。

  • ソース・データベースで、ADMIN権限があるユーザーのユーザー名とパスワードを入力する必要があります。

  • ターゲットDSNにクライアント属性およびサーバー属性を含めることはできません。

ソース・データベースで、次のように入力してユーザーを作成し、そのユーザーにADMIN権限を付与します。

Command> CREATE USER ttuser IDENTIFIED BY ttuser;
User created.

Command> GRANT ADMIN TO ttuser;

インスタンス管理者のユーザー名がtimestenであるとします。ターゲット・ホストでtimestenとしてログインし、次のようにhost1のデータベースdsn1dsn2に複製します。

ttRepAdmin -duplicate -from dsn1 -host host1 dsn2

Enter internal UID at the remote datastore with ADMIN privileges: ttuser 
Enter password of the internal Uid at the remote datastore:

リモート・データベースの内部ユーザーのパスワードを入力するよう要求されたら、ttuserと入力します。

データベースの複製が行われる特定のローカルまたはリモートのネットワーク・インタフェースを使用する場合は、オプションでネットワーク・インタフェースの別名またはIPアドレスを指定できます。ソース・ホストとターゲット・ホストのローカルおよびリモートのネットワーク・インタフェースを指定するには、ttRepAdmin -duplicate-localIPオプションと-remoteIPオプションを使用します。一方または両方のネットワーク・インタフェースが指定されていない場合は、TimesTenによって選択されます。

キャッシュ・グループが含まれるアクティブ・データベースを複製している場合は、-keepCGオプションを使用します。また、-cacheUidおよび-cachePwdオプションを使用して、キャッシュ管理ユーザー名およびパスワードを指定する必要もあります。キャッシュ管理ユーザー・パスワードを指定しない場合、ttRepAdminによってパスワードが要求されます。キャッシュ管理ユーザー名がorauserで、パスワードがorapwdである場合、host1のデータベースdsn1を複製します。

ttRepAdmin -duplicate -from dsn1 -host host1 -keepCG 
 -connStr "DSN=dsn2;UID=;PWD="

Enter internal UID at the remote datastore with ADMIN privileges: ttuser 
Enter password of the internal Uid at the remote datastore:

パスワードを求めるプロンプトが表示されたら、ttuserと入力します。次に、ttRepAdminユーティリティにより、キャッシュ管理ユーザーとパスワードを求めるプロンプトが表示されます。

Enter cache administrator UID: orauser
Enter cache administrator password: 

キャッシュ管理パスワードを要求されたら、orapwdと入力します。

dsn2UIDおよびPWDは、インスタンス管理者である現在のOSユーザーとして接続が確立されるように、接続文字列でNULL値として指定されます。インスタンス管理者のみがttRepAdmin -duplicateを実行できます。dsn2PWDではなくPWDCryptで構成されている場合は、接続文字列がDSN=dsn2;UID=;PWDCrypt=となります。

キャッシュ・グループが構成されたスタンバイ・データベースを読取り専用サブスクライバに複製する場合は、-nokeepCGオプションを使用します。この例では、dsn2がスタンバイ・データベース、sub1が読取り専用サブスクライバです。

ttRepAdmin -duplicate -from dsn2 -host host2 -nokeepCG 
 -connStr "DSN=sub1;UID=;PWD="

ttRepAdminユーティリティによって-uidおよび-pwdの値を入力するよう要求されます。

AWTまたは増分自動リフレッシュ・キャッシュ・グループを使ってレプリケーション・スキームの複製を実行中に、Oracle Databaseにアクセスできない場合(Oracle Databaseが停止しているか、接続できない場合)、ttRepAdmin -duplicateコマンドはAWTまたは増分自動リフレッシュ・キャッシュ・グループが複製された後に、Oracle Database上の(AWTおよび自動リフレッシュ・キャッシュ・グループを管理するためにキャッシュが使用する)メタデータを更新することができません。この場合、次のいずれかのオプションを使用して複製を実行します。

  • すべてのAWTまたは増分自動リフレッシュ・キャッシュ・グループがアクティブ・スタンバイ・ペアのレプリケーション・スキームに含まれている状況で、障害が発生したアクティブ・マスターまたはスタンバイ・マスターのいずれかをリカバリするためにttRepAdmin -duplicateを使用している場合は、-keepCG -recoveringNodeオプションを使用します。このオプションを使用する場合は、複製処理の間に発生する変更が追跡されるので、完全な自動リフレッシュを開始する必要がなくなります。

  • これを使用しない場合は、-keepCG -deferCacheUpdateオプションを使用します。このオプションでは完全な自動リフレッシュが開始されることがあります。

-keepCG -recoveringNodeオプションまたは-keepCG -deferCacheUpdateオプションを使用して複製処理を完了した後に、複製処理は正常に終了したがOracle Databaseメタデータへの更新は、キャッシュ・エージェントとレプリケーション・エージェントが起動するまで保留されるという警告メッセージが表示されます。したがって、複製処理が完了したら、新しいノードでキャッシュ・エージェントとレプリケーション・エージェントの両方を起動します。TimesTenのノード障害が次々に発生し、Oracle Databaseとの接続で問題が断続的に発生する場合、キャッシュ・エージェントとレプリケーション・エージェントを起動すると完全自動リフレッシュが開始されることがあります。

ttRepAdminユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttRepAdminに関する説明を参照してください。ttRepDuplicateEx C関数の詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のttRepDuplicateExに関する説明を参照してください。

アクティブ・スタンバイ・ペアの制限

アクティブ・スタンバイ・ペアを計画する場合は、次のことに注意してください。

  • 初期設定の場合、スタンバイ・データベースの作成は、ttRepAdmin -duplicateユーティリティまたはttRepDuplicateEx C関数を使用してアクティブ・データベースを複製する方法で行います。

  • 高可用性を実現するには、アクティブとスタンバイの各マスター・データベースと、サブスクライバ・データベースが異なるマシン上にある必要があります。

  • 特にマスター・データベース・キャッチアップ、スタンバイ・マスター・リカバリ、RETURNサービスの処理などの集中操作でパフォーマンスの問題が発生しないようにするには、マスター・データベースがインストールされているホスト上にあるホスト間のネットワーク待機時間を100ミリ秒未満にすることをお薦めします。


    注意:

    RETURNサービスを使用する場合、アクティブ・マスターはスタンバイ・マスターからの応答を待機します。帯域幅が原因で待機時間のレスポンス時間が定義したタイムアウトを超える場合、トランザクションのパフォーマンスに悪影響を及ぼします。RETURNサービスのタイムアウト時間の詳細は、「RETURNサービス・タイムアウト時間の設定」を参照してください。

  • アクティブ・ノードとスタンバイ・ノード間の時間誤差は、250ミリ秒を超えることはできません。各ノードのシステム・クロックの同期がとられるように調整する場合は、時間をさかのぼって設定しないでください。

  • ALTER ACTIVE STANDBY PAIR文は、アクティブ・データベースでのみ実行できます。アクティブ・データベースでALTER ACTIVE STANDBY PAIRを実行する場合は、アクティブ・データベースを複製してスタンバイ・データベースを再生成する必要があります。また、すべてのサブスクライバを、スタンバイ・データベースから再生成する必要があります。「データベースの複製」を参照してください。

  • 読取り専用サブスクライバは、スタンバイ・データベースを複製することでのみ作成できます。スタンバイ・データベースを使用できない場合は、アクティブ・データベースを複製することで読取り専用サブスクライバを作成できます。「データベースの複製」を参照してください。

  • サブスクライバ・データベースは、最大127まで指定できます。

  • スタンバイ・データベースから読取り専用サブスクライバへのレプリケーションが非同期で実行されます。

  • スタンバイ・データベースまたはサブスクライバ・データベースでは、レプリケーション表に対して書込みを実行できません。ただし、順序およびXLAブックマークに対する処理は実行できます。また、読取りも実行できます。

  • フェイルオーバー後は、アクティブ・データベースを複製することでのみ、アクティブ・データベースから新しいスタンバイ・データベースをリカバリできます(アクティブ・データベースとスタンバイ・データベース間でRETURN TWOSAFEレプリケーションが使用されていない場合)。RETURN TWOSAFEレプリケーションが使用されている場合は、かわりにマスターの自動キャッチアップ機能を使用できます。「障害が発生したマスター・データベースの自動キャッチアップ」を参照してください。

  • 一時データベースはレプリケートできません。

  • 圧縮された列を含む表はレプリケートできません。

データベースのDSNの定義

アクティブ・スタンバイ・ペアを定義する前に、アクティブ・データベース、スタンバイ・データベースおよび読取り専用サブスクライバ・データベースのDSNを定義します。UNIXの場合は、odbc.iniファイルを作成します。Windowsの場合は、ODBCアドミニストレータを使用し、データベースを指定して接続属性を設定します。例については、「手順1: マスター・データベースおよびサブスクライバ・データベースのDSNの作成」を参照してください。

レプリケーション・スキームで指定された各データベースの名前は、そのデータベースのDSN定義内のDataStoreデータ・ストア属性で指定された、パスを除くデータベース・ファイル名の接頭辞と一致する必要があります。混乱を避けるには、各DSN定義内のDataStoreデータ・ストア属性とData Source Nameデータ・ストア属性に同じ名前を使用します。DataStoreの値は、大/小文字を区別します。たとえば、データベースのパスがdirectory/subdirectory/foo.ds0の場合、使用するデータベース名はfooになります。

アクティブ・スタンバイ・ペアの表要件

アクティブ・スタンバイ・ペアを作成する前に、レプリケート対象のオブジェクトを作成する必要があります。

アクティブ・スタンバイ・ペア内でレプリケートする表には、次のいずれかが必要です。

  • 主キー

  • NOT NULL列に定義された一意索引

レプリケーションでは、主キーまたは一意索引を使用して、レプリケート表の各行を識別します。レプリケーションでは、表の索引配列の順次確認で検出された最初の使用可能な索引を常に選択します。主キーがない場合、レプリケーションでは、NULL列が含まれていない最初の一意索引を選択します。また、アクティブ・データベース内のレプリケート表に対して選択された索引は、スタンバイ・データベース内の対応する表にも存在している必要があります。


注意:

レプリケート表のキーは、各更新レコードでサブスクライバに転送されます。キーが小さいほど、より効率的に転送されます。

レプリケート表には、次のようなデータ型の制限があります。

  • レプリケート表のVARCHAR2NVARCHAR2VARBINARYおよびTT_VARCHAR列のサイズは、4MBに制限されます。VARCHAR2列の場合、文字長セマンティクスを使用する際の最大長は、特定のデータベース・キャラクタ・セットを使用する際に1文字が占めるバイト数によって異なります。たとえば、1文字に4バイトが必要なキャラクタ・セットでは、最大長は100万文字になります。NVARCHAR2の列の場合、1文字に2バイトが必要なため、文字長セマンティクスを使用する際の最大長は、200万文字になります。

  • レプリケート表のBLOBデータ型を含む列のサイズは、16MBに制限されます。レプリケート表のCLOBデータ型またはNCLOBデータ型を含む列のサイズは、4MBに制限されます。

  • 主キー列にはLOBデータ型を設定できません。

圧縮された列を含む表はレプリケートできません。

アクティブ・スタンバイ・ペアのレプリケーション・スキームの定義

アクティブ・スタンバイ・ペアのレプリケーション・スキームは、SQL文CREATE ACTIVE STANDBY PAIRを使用して作成します。CREATE ACTIVE STANDBY PAIR文を使用して他のレプリケーション処理を実行するには、ADMIN権限が必要です。データベースを複製できるのはインスタンス管理者のみです。


注意:

例については、「手順3: アクティブ・スタンバイ・ペアの定義」を参照してください。「CREATE ACTIVE STANDBY PAIR」の完全な構文は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』を参照してください。

表3-1は、アクティブ・スタンバイ・ペアのレプリケーション・スキームを作成するために使用されるCREATE ACTIVE STANDBY PAIR文のコンポーネントを示します。各コンポーネントについては、この章の対応するトピックで説明されます。

表3-1 アクティブ・スタンバイ・ペアのレプリケーション・スキームのコンポーネント

コンポーネント 参照先

CREATE ACTIVE STANDBY PAIR FullDatabaseName, FullDatabaseName

「アクティブ・スタンバイ・ペア内のデータベースの識別」


[ReturnServiceAttribute]

「RETURNサービスの使用」


[SUBSCRIBER FullDatabaseName [,...]]

「アクティブ・スタンバイ・ペア内のデータベースの識別」


[STORE FullDatabaseName [StoreAttribute [...]]]

「STORE属性の設定」


[NetworkOperation [...]]

ROUTE句を使用したネットワーク・インタフェースの構成


[{INCLUDE|EXCLUDE}

{TABLE [[Owner.]TableName[,...]]|

CACHE GROUP [[Owner.]CacheGroupName[,...]|

SEQUENCE [[Owner.]SequenceName[,...]]}

[,...]]

「レプリケーションに対するデータベース・オブジェクトの挿入または除外」



アクティブ・スタンバイ・ペア内のデータベースの識別

最初のコンポーネントは、アクティブ・データベース、スタンバイ・データベースおよび任意のサブスクライバ・データベースを識別します。最初のデータベース名は、アクティブ・データベースを指定します。2番目のデータベース名は、スタンバイ・データベースを指定します。読取り専用サブスクライバ・データベースは、SUBSCRIBER句によって識別されます。

「データベースのDSNの定義」で説明されている完全なデータベース名を使用します。

Command> CREATE ACTIVE STANDBY PAIR master1, master2
       > SUBSCRIBER subscriber1;

高可用性システムを実現するには、アクティブ・データベースとスタンバイ・データベースは別々のホストに存在する必要があります。読取り専用のサブスクライバは、ローカルまたはリモートのいずれにもできます。リモート・サブスクライバによって、サイト固有の障害から保護されます。

また、IPアドレスまたは二重引用符で囲まれたホストのリテラル名を使用して、データベースが存在するホストを指定できます。FullDatabaseNameの一部としてホストIDを指定します。

DatabaseName [ON Host]

Hostは、IPアドレスまたはホストのリテラル名のいずれかです。hostnameオペレーティング・システム・コマンドから返された値を使用します。ホスト名は二重引用符で囲むことをお薦めします。次に例を示します。

Command> CREATE ACTIVE STANDBY PAIR 
  > repdb1 ON "host1", 
  > repdb2 ON "host2";

アクティブ・スタンバイ・ペアに対するRETURNサービスの使用

RETURNサービスを指定してレプリケーション・スキームを構成すると、レプリケーション・データが、アクティブ・データベースおよびスタンバイ・データベース上で一貫していることをより高いレベルの信頼性を持って保証できます。レプリケーション・スキーム用にRETURNサービスを構成する方法の完全な詳細は、「RETURNサービスの使用」を参照してください。

アクティブ・スタンバイ・ペアに対するSTORE属性の設定

CREATE ACTIVE STANDBY PAIR文またはALTER ACTIVE STANDBY PAIR文のSTORE属性句は、RETURNサービス、圧縮、タイムアウト、永続コミット動作および表定義チェックのオプション動作を設定するために使用されます。STORE属性の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE ACTIVE STANDBY PAIRに関する説明を参照してください。


注意:

ALTER ACTIVE STANDBY PAIRを使用してSTORE属性のいずれかを変更する場合、「アクティブ・スタンバイ・ペアへのその他の変更」で説明されている手順に従う必要があります。

アクティブ・スタンバイ・ペアに対してSTORE属性を構成および使用する方法の詳細は、「STORE属性の設定」を参照してください。

アクティブ・スタンバイ・ペアに対するネットワーク操作の構成

レプリケーション・ホストにネットワーク・インタフェースが複数ある場合は、デフォルト以外のインタフェースを使用するようにレプリケーションを構成することもできます。詳細は、「ROUTE句を使用したネットワーク・インタフェースの構成」を参照してください。

アクティブ・スタンバイ・ペアの自動クライアント・フェイルオーバーの使用

自動クライアント・フェイルオーバーは、TimesTenアクティブ・スタンバイ・ペア・レプリケーション構成での高可用性シナリオで使用されます。TimesTenのアクティブ・ノードに障害が発生すると、元のスタンバイ・ノードが新しいアクティブ・ノードになり、自動クライアント・フェイルオーバー機能によって、アプリケーション接続が自動的に新しいアクティブ・ノードに送られます。

自動クライアント・フェイルオーバーの構成および使用の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の自動クライアント・フェイルオーバーの使用に関する説明を参照してください。


注意:

自動クライアント・フェイルオーバーは、Oracle Clusterwareが使用されている場合のOracle Clusterwareに対する補完機能ですが、この2つの機能は互いに依存しません。Oracle Clusterwareの詳細は、第8章「Oracle Clusterwareを使用したアクティブ・スタンバイ・ペアの管理」を参照してください。

レプリケーションに対するデータベース・オブジェクトの挿入または除外

デフォルトでは、アクティブ・スタンバイ・ペアはデータベース全体をレプリケートします。INCLUDE句を使用すると、INCLUDE句に指定される表、キャッシュ・グループおよび順序のみをレプリケートします。INCLUDE句が定義されたアクティブ・スタンバイ・ペアの他のデータベース・オブジェクトはレプリケートされません。たとえば、このINCLUDE句では、アクティブ・スタンバイ・ペアによってレプリケートされる3つの表が指定されています。

INCLUDE TABLE employees, departments, jobs

CREATE ACTIVE STANDBY PAIR文のEXCLUDE句を使用することによって、レプリケーションから除外する特定の表、キャッシュ・グループまたは順序を選択できます。オブジェクト・タイプごとに1つのEXCLUDE句を使用します。次に例を示します。

EXCLUDE TABLE ttuser.tab1, ttuser.tab2
EXCLUDE CACHE GROUP ttuser.cg1, ttuser.cg2
EXCLUDE SEQUENCE ttuser.seq1, ttuser.seq2

注意:

CYCLE属性が指定された順序はレプリケートできません。

アクティブ・スタンバイ・ペア内の外部キーで関連付けられている表のレプリケーション

アクティブ・スタンバイ・ペアのレプリケーション・スキームでは、外部キーで互いに関連付けられている表は、すべての表をレプリケートするか一部の表のみをレプリケートするかを選択できます。アクティブ・スタンバイ・ペアのレプリケーション・スキームの作成前または後に、表および外部キー関係をアクティブ・マスターに作成できます。

  • アクティブ・スタンバイ・ペアの作成前: アクティブ・スタンバイ・ペアのレプリケーション・スキームの作成前に、表および外部キー関係をアクティブ・マスターに作成できます。次に、アクティブ・スタンバイ・ペアのレプリケーション・スキームを作成します。

  • アクティブ・スタンバイ・ペアの作成後: アクティブ・スタンバイ・ペアのレプリケーション・スキームの作成後に、表および外部キー関係をアクティブ・マスターに作成できます。表がスタンバイ・マスターに自動的にレプリケートされ、レプリケーション・スキームに追加されるようにするには、デフォルト・モード(DDLReplicationLevelが2以上に設定され、DDLReplicationAction=INCLUDE)を使用する必要があります。

外部キーを持つ子表でON DELETE CASCADEが定義されている場合は、その子表に対して外部キーで関連付けられている他のすべての表をレプリケートする必要があります。これにより、アクティブ・マスター・データベースでカスケード削除を実行した場合にスタンバイ・マスター表で外部キー競合が発生しなくなります。

TimesTenでは、カスケード削除が1つの操作としてレプリケートされ、親表で行が削除された場合に子表で発生する個々の行削除はサブスクライバにレプリケートされません。そのため、親表で削除された外部キーの値を含む行がサブスクライバ・データベースの子表に存在する場合は、その行がマスター・データベースの子表に存在していなかった場合でも削除されます。

アクティブ・スタンバイ・ペア内のマテリアライズド・ビュー

マテリアライズド・ビューまたは非マテリアライズド・ビューが含まれているデータベースをレプリケートする場合は、ビューに関連付けられているディテール表のみがレプリケートされます。ビュー自体はレプリケートされません。一致するビューは、スタンバイ・データベースで定義できますが、必須ではありません。ディテール表がレプリケートされると、TimesTenはそれに対応するビューを自動的に更新します。ただし、TimesTenレプリケーションでは、レプリケート対象のディテール表の構造が両方のデータベースで同じかどうかのみが検証されます。マテリアライズド・ビューが各データベースで同じである必要はありません。

アクティブ・スタンバイ・ペア内の順序のレプリケート

順序は、アクティブ・スタンバイ・ペアから除外したり、CYCLE属性が指定されていないかぎり、レプリケートされます。「レプリケーションに対するデータベース・オブジェクトの挿入または除外」を参照してください。順序のレプリケーションは、アクティブ・データベースで順序が更新されるたびに、スタンバイ・データベースで順序番号の範囲を予約することによって最適化されます。順序番号の範囲を予約すると、トランザクション・ログの更新回数を減らすことができます。順序番号の範囲はキャッシュと呼ばれます。アクティブ・データベースでの順序の更新のレプリケートは、順序の更新後にレプリケート・トランザクションが実行される場合、または順序の更新がレプリケート・トランザクションで使用される場合にのみ実行されます。

MINVALUEが1で、INCREMENTが1、デフォルトのCacheが20の順序my.sequenceについて考えてみます。my.sequence.NEXTVALを初めて参照すると、アクティブ・データベースの順序の現在値は2に変更され、新しい現在値21(20+1)がスタンバイ・データベースにレプリケートされます。アクティブ・データベースのmy.seq.NEXTVALへの次の19回の参照では、スタンバイ・データベースの現在値21がアクティブ・データベースの現在値より大きいため、新しい現在値のレプリケートは行われません。my.seq.NEXTVALへの21回目の参照では、前回レプリケートされたスタンバイ・データベースの現在値21が、この時点でアクティブ・データベースの現在値22より小さくなるため、新しい現在値41(21+20)がスタンバイ・データベースに送信されます。

SELECT my.seq.NEXTVAL FROM sys.dualなどの順序に対する操作では、順序値は増加しますが、レプリケートされる表でのトランザクションをその後に行うまでレプリケートは実行されません。この動作には、レプリケートされる表でのトランザクションをその後に行うまでこれらの順序の更新がログからパージされないという副作用があります。このため、これらの順序の更新のみがログの末尾に存在する場合は、ttRepSubscriberWaitおよびttRepAdmin -waitで障害が発生します。