Oracle Coherenceインメモリー・データ・グリッドは、複数のサーバー間で共有され、短いレスポンス時間、高いスループット、予測可能なスケーラビリティ、継続的な可用性および情報の信頼性が求められるアプリケーション・オブジェクトに対するデータ管理システムです。わかりやすいように、これらの用語および要求について次に解説します。
これらの機能を実装するOracle Coherenceは、計算負荷の高い、ステートフルな中間層アプリケーションにおいて最適なシステムです。Coherenceはアプリケーション層での実行を対象としていますが、Application Serverクラスタなどでは、多くの場合、アプリケーション自体でインプロセスで実行されます。
これらの4つの機能の結果を組み合せると、データ・グリッド内の情報が、トランザクション・アプリケーションで使用可能な信頼性の高いものになります。
データ・グリッドは複数のサーバーで構成されるシステムで、分散環境において情報とそれに関連付けられた操作(計算など)の管理を連携して実行します。
インメモリー・データ・グリッドは、情報をメモリー内に保存して高いパフォーマンスを達成します。また、サーバーに障害が発生した場合にシステムの回復力とデータの可用性を確保するために、複数のサーバー間でその情報のコピーを同期化することで冗長性を実現します。
アプリケーション・オブジェクトは、複数のサーバー間で共有される情報を含む、実際のアプリケーションのコンポーネントです。アプリケーションの可用性を維持するには、これらのオブジェクトで潜在的なサーバー障害を切り抜ける必要があります。これらのオブジェクトは、一般的にJava(POJOなど)、C++、C#、VB.NETなどのオブジェクト指向言語で作成されます。リレーショナル・スキーマとは異なり、多くの場合、アプリケーション・オブジェクトは階層的で、任意のデータベースから取得した情報を含む場合があります。
アプリケーション・オブジェクトは複数のサーバー間で共有される必要があります。これは、ミドルウェア・アプリケーションはサーバー(各サーバーでアプリケーションのインスタンスが実行される)を追加することにより水平的に拡張されるためです。1つのサーバー上で実行されているアプリケーション・インスタンスが別のサーバー上のアプリケーション・インスタンスと同じ情報を読み書きすることがあるため、情報は共有する必要があります。また、常にデータベースなどの共有リソース上のその情報にアクセスするという方法もありますが、これはリモートでのアクセスの調整とオブジェクト・リレーショナル・マッピング(ORM)が必要になるため、パフォーマンスが低下します。さらに、その共有リソースがボトルネックになるため、スケーラビリティも低下します。
アプリケーション・オブジェクトはリレーショナルではないため、リレーショナル・データベースからアプリケーション・オブジェクトを取得するには、リレーショナルの問合せからオブジェクトに情報をマップする必要があります。これをオブジェクト・リレーショナル・マッピング(ORM)と呼びます。ORMには、EJB、JPA、ADO.NETなどがあります。同じORMテクノロジを使用して、オブジェクト(またはオブジェクトへの変更)をSQLの一連の挿入文、更新文、削除文に分解することで、オブジェクトをリレーショナル・データベースに保存できます。1つのオブジェクトは多数の表からの情報で構成されることがあるため、ORMを使用してデータベースからオブジェクトにアクセスするコストは、データベースへの負荷およびデータ・アクセスの待機時間という観点からすると、非常に大きくなる場合があります。
インメモリー・データ・グリッドは、情報をメモリー内にアプリケーション・オブジェクト形式で保持して、その情報を複数のサーバー間で共有することで、データ・アクセスにおける短いレスポンス時間を実現します。つまり、アプリケーションはネットワーク通信やORMなどのデータ変換手順を使用せずに、必要な情報にアクセスできます。ネットワーク通信が必要な場合、Oracle Coherenceはグリッド全体で情報をパーティション化(分散)することで、シングル・ポイント・ボトルネック(SPOB)の発生を回避します。各サーバーは、全情報セットのそれぞれの担当分を管理します。
情報アクセスと情報変更の高いスループットは、インメモリー・データ・グリッドの次の4つの特徴により実現されます。
Oracle Coherenceでは、各サーバーで情報のワイヤ・スピード・スループットを達成できる高度なクラスタ化プロトコルを採用しています。これにより、サーバー数に比例して情報のフロー全体を増加させることができます。
情報をパーティション化することにより、サーバーが追加されるたびに各サーバーは全情報を均等に分割した担当分を処理します。つまり、ロード・バランシングされるたびに、データ管理の担当範囲が狭くなります。
ワイヤ・スピード・スループットとパーティション化の機能をデータ・グリッド内の情報の場所の自動認識機能と組み合せることにより、Oracle Coherenceでは、すべての読取りおよび書込みリクエストが、対象の情報を管理するサーバーに直接ルーティングされます。そのため、読取りおよび書込み操作において線形スケーラビリティが実現されます。つまり、情報アクセスおよび情報変更における高いスループットが達成されます。
問合せ、トランザクション、計算において、特に大量のデータを操作する場合、Oracle Coherenceではターゲット・データを管理するサーバーにこれらの操作をルーティングして、パラレル実行することができます。
動的なパーティション化を使用してボトルネックを排除し、データ・グリッド内のサーバー数に関係なく予測可能な短い待機時間を実現することで、Oracle Coherenceはアプリケーションの予測可能なスケーラビリティを提供します。特定のアプリケーションではCoherenceを使用することにより線形スケーラビリティを実現できますが、これはアプリケーションの性質に依存する部分が多く、実体はアプリケーションごとに異なります。さらに重要な点として、ユーザーがそれらのアプリケーションの性質を検証して、システムで一定の同時ユーザー数をサポートする、または一定の時間内(分単位)に複雑な財務計算を完了するなど、特定のスケーラビリティ・レベルを達成するために必要なサーバー数を予測できる能力を有している必要があります。Coherenceによる実現方法の1つは、データ・グリッド内のすべてのサーバーを使用して、問合せ、トランザクション、計算などの大規模な操作をパラレル実行することです。
Coherenceでボトルネックを排除する方法として、メモリー内で発生したトランザクションをキューで管理して、その結果をOracleデータベースなどの記録システムに非同期的に書き込めます。これは、多数の小さなトランザクションを処理するために変更率が非常に高いシステム、特に結果のみを永続化するシステムで有用です。Coherenceでは、複数の変更を単一のアプリケーション・オブジェクトに結合して、複数の変更されたアプリケーション・オブジェクトを単一のデータベース・トランザクションにバッチで送信します。つまり、100個の異なるアプリケーション・オブジェクトのそれぞれに対して100個の異なる変更があっても、データベースの単一の大きな(つまり、非常に効率的な)トランザクションに保存できます。書込み保留中のアプリケーション・オブジェクトは、可用性を維持しながら管理することによって、消失から保護されます。
次の4つの機能を組み合せることで、継続的な可用性を実現します。
Oracle Coherenceで使用されるクラスタ化プロトコルは、サーバー障害を即時に検出して、検出された障害の情報が残りのすべてのサーバー間で共有されるようにします。
複数のサーバー間で情報を同期的にレプリケートして、シングル・ポイント障害(SPOF)が存在しないようにします。
各サーバーがそれぞれの情報の同期レプリカの保存場所を認識し、情報アクセスおよび情報変更の各操作をそのレプリカに自動的に再ルーティングします。
各操作が一度かぎり(Once-and-Only-Once)実行されるように保証するため、サーバーの障害時に実行していた操作によって、フェイルオーバー時に情報が誤って破損されないようにします。
フェイルオーバーとは、アクティブであったサーバー、システムまたはネットワークの障害が発生したり、それらが異常終了したときに、冗長(スタンバイ)のコンピュータ・サーバー、システムまたはネットワークに自動的に切り替えるプロセスのことです。フェイルオーバーは、ユーザーの介在なしで、また一般的には警告なしで実行されます(ウィキペディアの定義を参照。http://en.wikipedia.org/wiki/Failover
)。
次の4つの機能を組み合せることで、情報の信頼性を実現します。
Oracle Coherenceでは、クラスタ・コンセンサスを使用して、データ・グリッド内での情報の所有権の明瞭化を実現します。常に、必ず1つのサーバーが、データ・グリッド内の各情報のマスター・コピーの管理を担当します。
そのマスター・コピーは特定のサーバーが所有するため、そのサーバーはその情報に対する操作を命令し、その操作の結果を別のサーバーと同期化します。
情報の可用性は維持できるため、サーバー障害の発生時やその後でも、これらのサービス品質は確保されます。
一度かぎり(Once-and-Only-Once)の操作が保証されているため、サーバーの障害時に操作が失われたり、誤って繰り返されたりすることはありません。