永続性オプション
TimesTenのデータベースは、電源障害やクラッシュ時にも持続します。TimesTenでは、定期的にディスクに保存することで永続性が実現されます。
-
チェックポイント・ファイル: チェックポイント処理では、現在のデータベース・イメージがファイル・システム上のチェックポイント・ファイルに書き込まれ、チェックポイント処理以前にコミットされたすべてのトランザクションが永続的になります。
-
トランザクション・ログ・ファイル: 最後のチェックポイント後にコミットされたトランザクションに対しては、従来のロギングによる方法によって永続性が与えられます。トランザクションが処理されるたびに、そのトランザクションによるデータベースの変更内容がインメモリー・トランザクション・ログに記録されます。コミットが行われると、トランザクション・ログ内の該当部分がファイル・システムにフラッシュされます。このログ・フラッシュ処理によって、該当するトランザクションおよび以前コミット済のすべてのトランザクションに永続性が与えられます。
トランザクション・ログ・データがファイル・システムに永続的に書き込まれると、アプリケーションに制御が戻ります。永続的にコミットされたトランザクションは、システム障害が発生しても失われることはありません。
最新のチェックポイント・イメージがトランザクション・ログとともに使用され、トランザクションに一貫性がある最新の状態でデータベースが再構築されます。
トランザクションをコミットする際、TimesTenは複数の同時実行トランザクションをグループ・コミットして、永続コミットのパフォーマンス・コストを削減します。TimesTenでは、単一のファイル・システム書込み処理が実行され、同時トランザクションのグループが永続的にコミットされます。永続コミットのたびに、ファイル・システム書込み処理の完了を待機する必要があるため、グループ・コミットでは、いずれのコミット処理のレスポンス時間も向上しませんが、一連の同時トランザクションのスループットは大幅に向上します。
次の項では、TimesTen ScaleoutおよびTimesTen Classicの永続性実装オプションについて説明します。
TimesTen Scaleoutの永続性
TimesTen Scaleoutでは、データベースのデータは要素に分散されます。各要素は、独自のチェックポイントおよびトランザクション・ログ・ファイルを保持します。その結果、各要素に格納されたデータは独立して永続します。
グリッド内の各データ・インスタンスはデータベースの1つの要素を管理します。障害が発生した場合は、1つのデータ・インスタンスでチェックポイント・ファイルおよびトランザクション・ログ・ファイルから、その要素に格納されているデータを自動的にリカバリでき、残りのデータ・インスタンスでアプリケーションの提供を続行します。
TimesTen Scaleoutでもデータの複数のコピーを保持し、永続性とフォルト・トレランスを向上させることができます。K-safety値が2以上の場合は、障害が発生した要素をレプリカ・セット内の別の要素からリカバリできます。K-safetyの詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の高可用性とフォルト・トレランスおよびグリッドの作成を参照してください。
また、パフォーマンスおよびデータ永続性の必要性に応じて、データベースの永続性設定を変更できます。たとえば、高いパフォーマンス・レベルで操作するために、データをコミットごと、または定期的にバッチでディスクにフラッシュするかどうかを選択できます。次の項では、これらの永続性設定について説明します。
TimesTen Scaleoutの永続性保証
TimesTen Scaleoutでは、Durablity
接続属性を使用してトランザクションの永続性を構成します。
Durability
属性を1
に設定すると、参加者が分散トランザクションの永続コミットの準備ログ・レコードおよび非永続コミット・ログ・レコードを書き込みます。Durability
属性を1
に設定すると、コミットされたトランザクションが失敗した場合にリカバリ可能になります。『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の永続性の設定を参照してください。
TimesTen Scaleoutの非永続分散トランザクション
Durability
接続属性を0に設定して、参加者が分散トランザクションの非永続コミットの準備ログ・レコードおよびコミット・ログ・レコードを書き込めるようにします。
K-safetyには、障害リカバリのメソッドが用意されています。K-safetyを使用すると、2つのデータ・コピーを指定することで、ほぼ間断なく可用性またはワークロード分散を実現できます。そのため、1つのコピーが失敗した場合、データの別のコピーが存在します。
レプリカ・セットのいずれかの要素が、レプリカ・セット内の他の要素で失敗した場合は、失敗した要素がリカバリされるまで、永続コミットの準備ログ・レコードが書き込まれます。これにより、K-safetyが2に設定され、Durability
が0に設定されたグリッド内のトランザクションが標準の条件下で永続的になります。レプリカ・セットの両方の要素で同時に障害が発生した場合にのみ、トランザクションが非永続になります。
TimesTen Scaleoutでは、定期的にトランザクションをエポック・トランザクションに昇格させます。エポック・トランザクションでマークされたグローバルに一貫性のある時点にデータベースをリカバリできるため、エポック・トランザクションとその前にコミットされたすべてのトランザクションには、重大な障害に対するより高いリジリエンスがあります。各エポック・コミット・ログ・レコードは、各要素の特定のチェックポイント・ファイルに関連付けられます。要素に予期しない障害が発生した場合、リカバリ・プロセスでは、最新のエポック・コミット・ログ・レコードに関連付けられている各要素のチェックポイント・ファイルを使用する必要があります。このチェックポイントは、必ずしもその要素の最新のチェックポイントではありません。
デフォルトでは、TimesTen Scaleoutでは、1秒ごとに1つのエポック・トランザクションが生成されます。EpochInterval
初期接続属性を使用して、エポック・トランザクションが自動的に生成される頻度を構成できます。また、ttEpochCreate
またはttDurableCommit
組込みプロシージャを使用して、トランザクションをエポック・トランザクションに手動で昇格させることができます。
エポック・トランザクションの詳細、およびトランザクションをエポック・トランザクションに昇格させる方法は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のDurabilityを0に設定を参照してください。
TimesTen Classicの永続性
TimesTen Classicでは、最新のチェックポイント・イメージがトランザクション・ログとともに使用され、トランザクションに一貫性がある最新の状態でデータベースが再構築されることにより、永続性を実現します。
トランザクション・ログ・レコードは、トランザクションの完了に対して非同期または同期でディスクに書き込まれ、トランザクション・レベルでアプリケーションによって制御されます。
-
データ整合性を維持する必要がある場合に、データを失うことなく、永続性が保証された環境を作成できます。
-
最大スループットが最優先であるが、最低限のデータ損失を許容できる場合に、永続性の環境を作成できます。
TimesTen Classicレプリケーションは、パフォーマンスへの影響を最小限に抑えて、アプリケーションのデータの可用性を高めます。レプリケーションでは、2つ以上のホスト間で更新を送信することによって、ほぼ間断なく可用性またはワークロード分散を実現できます。マスター・ホストは更新を非同期で送信するように構成され、サブスクライバ・ホストはそれらの更新を受信するように構成されます。
ノート:
TimesTen Classicで可用性を最大限に高めるには、アクティブ・スタンバイ・ペアのレプリケーション・スキーム構成を使用します。『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』の読取り専用サブスクライバを使用したアクティブ・スタンバイ・ペアを参照してください。
非同期ライトスルー(AWT)キャッシュ・グループを使用すると、TimesTenにより、TimesTenキャッシュ表とキャッシュされたOracle Database表の間で、コミットされた更新が転送されて、それら2つのデータベース内のこれらの表が同期され続けます。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』の非同期ライトスルー(AWT)キャッシュ・グループを参照してください。
TimesTen Classicの永続性保証
永続性保証により、データ整合性を維持する必要がある場合に、(パフォーマンスを犠牲にして)データの損失がないことが保証されます。
すべてのトランザクションの永続性を保証するには、少なくとも次のいずれかを実行する必要があります。(これらのオプションを両方使用することの利点はほとんどありません。)
-
RETURN TWOSAFEサービスで有効化されたレプリケーションを使用して、トランザクションをレプリケートします。RETURN TWOSAFEサービスでは、更新がマスターでコミットされる前に、サブスクライバで受信およびコミットされたことがレプリケーションで確認されるまでアプリケーションをブロックすることによって、完全な同期化が行われます。これにより、アプリケーションでは、後でマスターで障害が発生した場合でも、コミットされたトランザクションの結果が永続的であることが高度なレベルで保証されます。このオプションは、通常、永続コミットよりも高速です。『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のRETURN TWOSAFEレプリケーションを参照してください。
-
DurableCommits
接続属性を1に設定して、永続コミット処理を構成します。これにより、アプリケーションが待機している間、トランザクションがトランザクション・ログ・ファイルに同期的に書き込まれます。『Oracle TimesTen In-Memory Databaseリファレンス』のDurableCommitsを参照してください。
ノート:
ほとんどのトランザクションが永続的にコミットされる場合、LogFlushMethod
初期接続属性を1に設定できます。この接続属性では、TimesTenでログ・データをトランザクション・ログ・ファイルに書き込む方法および同期する方法を構成します。詳細は、「永続コミットの適切な使用」を参照してください。
TimesTen Classicの非永続トランザクション
非永続トランザクションは、永続トランザクションに比べてかなり短時間で実行できます。非永続トランザクションを使用している接続は、永続性保証を使用している接続と共存できます。
永続性保証と同様に、各トランザクションによってデータベースが変更されるたびに、インメモリー・トランザクション・ログ・バッファにレコードが書き込まれます。ただし、トランザクションが非永続モードでコミットされると、ファイル・システムにトランザクション・ログ・バッファが書き込まれるまで待たずに、制御がアプリケーションに戻されます。そのため、非同期レプリケーションまたは非同期ライトスルー・キャッシュ・グループを構成していない場合は、データベースで障害が発生した場合に非永続トランザクションが失われる可能性があります。最終的に、トランザクションは、データベース・サブデーモン・プロセスによって、またはインメモリー・トランザクション・ログ・バッファに空きがない場合はファイル・システムにフラッシュされます。
データ損失を最小限に抑えながらトランザクションで非常に高いスループットが必要となる場合は、次のオプションの両方を実行することを検討してください。
-
これらのいずれかの方法を使用して、別のデータベース(TimesTenデータベースまたはOracleデータベース)へのデータの非同期書込み処理を実行します。
-
マスターからサブスクライバにコミット済トランザクションをレプリケートするデフォルトの非同期レプリケーションを使用します。デフォルトの非同期レプリケーションを使用した場合、アプリケーションはマスター・データベースを更新すると、サブスクライバがその更新を受信および適用するのを待機せずに処理を続行します。非同期レプリケーションでは、最高のパフォーマンスが実現しますが、レプリケート対象の更新がサブスクライバ・データベースでコミットされたことを示す確認応答はアプリケーションに送信されません。『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』のデータベース間での更新のコピーを参照してください。
-
非同期ライトスルー(AWT)キャッシュ・グループを設定して、TimesTenキャッシュ表でコミット済の更新が、キャッシュされたOracle Database表に自動的に非同期で伝播されるようにします。TimesTenデータベースでのトランザクション・コミット処理は、Oracleデータベースでのコミットとは非同期に実行されます。これにより、アプリケーションはOracle Databaseトランザクションの完了を待機することなく、継続してTimesTenデータベースに対してトランザクションを発行できます。ただし、アプリケーションでは、Oracle Database上でトランザクションが完了するタイミングを確認できません。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』の非同期ライトスルー(AWT)キャッシュ・グループを参照してください。
-
-
DurableCommits
接続属性を0に設定することで非永続トランザクションを構成します。これにより、非永続コミット・ログ・レコードがトランザクション・ログ・ファイルに非同期で書き込まれるようになります。『Oracle TimesTen In-Memory Databaseリファレンス』のDurableCommitsを参照してください。
システム障害が発生した場合に損失が発生しやすいトランザクションは、最後の永続コミットの後に非永続的にコミットされ、障害の発生前にレプリケートされていないトランザクションのみです。
ただし、データ損失を許容できない重要なトランザクションがある場合は、次のいずれかを行うことができます。
-
ttRepSubscriberWait
組込みプロシージャを実行して、マスター・データベースからサブスクライバ・データベースにそれらのトランザクションを同期的にレプリケートします。サブスクライバ・データベースのDSNおよびホストを使用してマスター・データベースで
ttRepSubscriberWait
組込みプロシージャを実行すると、コール元は、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまで待機します。『Oracle TimesTen In-Memory Databaseリファレンス』のttRepSubscriberWaitを参照してください。 -
ttDurableCommit
組込みプロシージャを使用して、個々のトランザクションにトランザクション・ログ・ファイルへの永続的なコミットを強制します。あるトランザクションを永続的にコミットすると、そのトランザクションだけでなく、以前のすべてのトランザクションが永続的になります。ただし、これは、トランザクションがレプリケートされるのを待機しません。永続コミットが必要な場合は、コミットする前にアプリケーションから組込みプロシージャ
ttDurableCommit
をコールします。ttDurableCommit
組込みプロシージャは、実際にトランザクションはコミットせず、コミットの実行時にそのコミットに永続性を与えるのみです。これにより、非永続的にコミットされているすべてのトランザクションに比べて、トランザクションが失われる可能性は低くなります。永続コミットをn個のトランザクションごとにのみ実行するか、またはn秒ごとに実行すると、トランザクションの消失の可能性がある時間枠を小さくし、レスポンス時間を短縮できます。ユーザーは、金融取引を扱うトランザクションなど、消失の危険があるクリティカルなトランザクションを永続的にコミットすることもできます。
『Oracle TimesTen In-Memory Databaseリファレンス』のttDurableCommitを参照してください。