次の項では、高可用性システムの設計およびレプリケーション・スキームの定義方法を示します。
レプリケーションに必要な帯域幅の量を減らす方法については、「レプリケートの通信量の圧縮」を参照してください。
この項では、マスター・データベースの可能性のある状態の概要を示します。これらの状態は、章の後半で説明するタスクで参照されています。
マスター・データベースは、次のいずれかの状態になります。
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
のデータベースdsn1
をdsn2
に複製します。
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
と入力します。
dsn2
のUID
およびPWD
は、インスタンス管理者である現在のOSユーザーとして接続が確立されるように、接続文字列でNULL値として指定されます。インスタンス管理者のみがttRepAdmin -duplicate
を実行できます。dsn2
がPWD
ではなく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を定義します。UNIXの場合は、odbc.ini
ファイルを作成します。Windowsの場合は、ODBCアドミニストレータを使用し、データベースを指定して接続属性を設定します。例については、「手順1: マスター・データベースおよびサブスクライバ・データベースのDSNの作成」を参照してください。
レプリケーション・スキームで指定された各データベースの名前は、そのデータベースのDSN定義内のDataStore
データ・ストア属性で指定された、パスを除くデータベース・ファイル名の接頭辞と一致する必要があります。混乱を避けるには、各DSN定義内のDataStore
データ・ストア属性とData Source Name
データ・ストア属性に同じ名前を使用します。DataStore
の値は、大/小文字を区別します。たとえば、データベースのパスがdirectory
/
subdirectory
/foo.ds0
の場合、使用するデータベース名はfoo
になります。
アクティブ・スタンバイ・ペアを作成する前に、レプリケート対象のオブジェクトを作成する必要があります。
アクティブ・スタンバイ・ペア内でレプリケートする表には、次のいずれかが必要です。
主キー
NOT NULL列に定義された一意索引
レプリケーションでは、主キーまたは一意索引を使用して、レプリケート表の各行を識別します。レプリケーションでは、表の索引配列の順次確認で検出された最初の使用可能な索引を常に選択します。主キーがない場合、レプリケーションでは、NULL
列が含まれていない最初の一意索引を選択します。また、アクティブ・データベース内のレプリケート表に対して選択された索引は、スタンバイ・データベース内の対応する表にも存在している必要があります。
注意: レプリケート表のキーは、各更新レコードでサブスクライバに転送されます。キーが小さいほど、より効率的に転送されます。 |
レプリケート表には、次のようなデータ型の制限があります。
レプリケート表のVARCHAR2
、NVARCHAR2
、VARBINARY
および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 アクティブ・スタンバイ・ペアのレプリケーション・スキームのコンポーネント
コンポーネント | 参照先 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
「レプリケーションに対するデータベース・オブジェクトの挿入または除外」 |
最初のコンポーネントは、アクティブ・データベース、スタンバイ・データベースおよび任意のサブスクライバ・データベースを識別します。最初のデータベース名は、アクティブ・データベースを指定します。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サービスの使用」を参照してください。
CREATE ACTIVE STANDBY PAIR
文またはALTER ACTIVE STANDBY PAIR
文のSTORE
属性句は、RETURNサービス、圧縮、タイムアウト、永続コミット動作および表定義チェックのオプション動作を設定するために使用されます。STORE
属性の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE ACTIVE STANDBY PAIRに関する説明を参照してください。
アクティブ・スタンバイ・ペアに対して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
で障害が発生します。