Skip to main content

分散キャッシュによるユーザ数に応じた水平方向の拡張

InterSystems IRIS データ・プラットフォームを拡張して作業負荷の要件を満たすために、垂直方向の拡張だけでは不十分な場合は、アーキテクチャが簡単で、アプリケーションに透過的であり、低コストの水平方向の拡張アプローチである、分散キャッシュを検討してください。

分散キャッシュの概要

InterSystems IRIS 分散キャッシュ・アーキテクチャでは、データ・サーバの前にあるアプリケーション・サーバの層全体にわたってアプリケーション・ロジックとキャッシュの両方を分散することでユーザ数に応じて水平方向に拡張し、その層全体にわたるユーザの分配を実現しています。各アプリケーション・サーバはユーザの要求を処理し、自動的にデータ・サーバと同期された状態に維持される独自のデータベース・キャッシュを保持します。一方、データ・サーバはすべてのデータの格納と管理を処理します。アプリケーション・サーバとデータ・サーバ間の中断された接続は、停止の長さに応じて自動的に回復またはリセットされます。

分散キャッシュを使用すると、各アプリケーション・サーバは、データの作業セットをそれぞれ独自に保持できます。これにより、単一のサーバ上に作業セット全体を格納するために、費用のかかる大量のメモリを確保する必要がなくなり、安価なアプリケーション・サーバを追加して、より多くのユーザを処理することができます。分散キャッシュは、アプリケーションが、使用可能な CPU 容量によって制限される場合にも役立ちます。この場合も、単一のサーバ用に高価なプロセッサを購入するのではなく、コモディティ・アプリケーション・サーバを追加することで容量が増えます。

分散キャッシュ・クラスタ
3 つのユーザ・グループが、それぞれが独自のキャッシュを持ち、単一のデータ・サーバに対してクエリを実行する 3 つのアプリケーション・サーバに接続されます。

このアーキテクチャは、InterSystems IRIS データ・プラットフォームのコア・コンポーネントである Enterprise Cache Protocol (ECP) をアプリケーション・サーバとデータ・サーバの間の通信に使用することで実現します。

分散キャッシュ・アーキテクチャおよびアプリケーション・サーバ層は、ユーザおよびアプリケーション・コードに対して完全に透過的です。アプリケーション・サーバを追加することにより、データを提供する既存のスタンドアロン InterSystems IRIS インスタンスを、クラスタのデータ・サーバへと簡単に変換できます。

以下のセクションでは、分散キャッシュについて詳しく説明します。

分散キャッシュ・アーキテクチャ

分散キャッシュ・アーキテクチャをよりよく理解するために、InterSystems IRIS によってデータがどのように格納され、アクセスされるのかについて、以下の情報を確認してください。

  • InterSystems IRIS は、データベースと呼ばれるローカル・オペレーティング・システムのファイルにデータを格納します。InterSystems IRIS インスタンスは、(通常) 複数のデータベースを持っています。

  • InterSystems IRIS アプリケーションは、1 つ以上のデータベースに格納されたデータの論理ビューを提供する、ネームスペースを使用してデータにアクセスします。InterSystems IRIS インスタンスは、(通常) 複数のネームスペースを持っています。

  • それぞれの InterSystems IRIS インスタンスは、データベース・キャッシュを保持します。データベース・キャッシュとは、ローカルの共有メモリ・バッファで、データベースから取得されるデータをキャッシュするために使用します。これにより、同じクエリの繰り返しインスタンスは、ストレージではなくメモリから結果を取得できるので、パフォーマンス上のメリットが非常に大きくなります。

分散キャッシュ・クラスタのアーキテクチャは、概念的には単純であり、これらの要素を以下の方法で使用します。

  • InterSystems IRIS インスタンスをアプリケーション・サーバにするには、別のインスタンスをリモート・サーバとして追加した後、そのデータベースのいずれかまたはすべてをリモート・データベースとして追加します。これにより、2 つ目のインスタンスが 1 つ目のインスタンスのデータ・サーバになります。

  • アプリケーション・サーバ上のローカル・ネームスペースを、データ・サーバ上のリモート・データベースにマッピングする方法は、ローカル・データベースにマッピングする場合と同じです。ローカル・データベースとリモート・データベースの違いは、アプリケーション・サーバ上のネームスペースに対してクエリを実行するアプリケーションにとって完全に透過的であることです。

  • アプリケーション・サーバは、ローカル・データベースのみを使用する場合と同じ方法で、独自のデータベース・キャッシュを維持します。ECP は、複数の InterSystems IRIS インスタンス間でデータ、ロック、実行可能コードを効率的に共有し、アプリケーション・サーバのキャッシュをデータ・サーバと同期させます。

実際には、複数のアプリケーション・サーバの分散キャッシュ・クラスタとデータ・サーバは、次のように動作します。

  • データ・サーバは、データの格納、更新、および提供を引き続き行います。また、データ・サーバは、ユーザが古いデータを受け取ったり、保持したりすることがないようにアプリケーション・サーバのキャッシュを同期して整合性を維持し、クラスタ全体のロックを管理します。

  • データに対する各クエリはさまざまなアプリケーション・サーバのいずれかのネームスペースで行われ、各アプリケーション・サーバはそれぞれ独自のデータベース・キャッシュを使用して、受け取った結果をキャッシュします。その結果、キャッシュされたデータのセット全体がこれらの個々のキャッシュ間で分散されます。複数のデータ・サーバがある場合、アプリケーション・サーバは、要求されたデータを格納しているデータ・サーバに自動的に接続します。また、各アプリケーション・サーバはそのデータ・サーバ接続を監視し、接続が中断した場合は、接続を回復しようとします。

  • ロード・バランサによってユーザの要求をラウンドロビン方式でアプリケーション・サーバ間で分散することもできますが、最も効果的なアプローチでは、同様の要求を持つユーザを同じアプリケーション・サーバに送ることで、キャッシュ効率を高め、分散キャッシュを最大限に活用します。例えば、医療アプリケーションでは、あるクエリ・セットを実行する医療ユーザを 1 つのアプリケーション・サーバにグループ化し、異なるセットを実行するフロントデスク・スタッフを別のサーバにグループ化できます。クラスタで複数のアプリケーションを処理する場合は、各アプリケーションのユーザを別個のアプリケーション・サーバに送ることができます。以下の各図は、単一 InterSystems IRIS インスタンスと、ユーザ接続がこのように分散されるクラスタを比較したものです。(負荷分散のユーザ要求は、状況によっては有害な影響を与える場合があります。詳細は、"負荷分散のユーザ要求の影響の評価" を参照してください。)

  • クラスタの再構成や動作の変更を別個に行うことなく、クラスタ内のアプリケーション・サーバの数を増減できるため、ユーザ数の増加に伴って、簡単に拡張することが可能です。

単一 InterSystems IRIS インスタンス上のローカル・ネームスペースにマッピングされたローカル・データベース
異なるアプリケーションを使用するユーザは、単一のキャッシュを持つ単一のサーバ上の異なるネームスペースとデータベースに対してクエリを実行します。
分散キャッシュ・クラスタ内のアプリケーション・サーバ上のネームスペースにマッピングされたデータ・サーバ上のリモート・データベース
異なるアプリケーションを使用するユーザは、それぞれが独自のキャッシュを持つ個別のアプリケーション・サーバ上のネームスペースに対してクエリを実行します。

分散キャッシュ・クラスタのデータ・サーバには、以下の役割があります。

  • ローカル・データベースにデータを格納します。

  • アプリケーション・サーバが古いデータを参照しないように、アプリケーション・サーバのデータベース・キャッシュをデータベースと同期させます。

  • ネットワーク経由のロックの分散を管理します。

  • すべてのアプリケーション・サーバ接続の状態を監視し、一定時間接続が中断された場合には対応策を実行します ("ECP リカバリ" を参照)。

分散キャッシュ・クラスタの各アプリケーション・サーバには、以下の役割があります。

  • アプリケーションが、データ・サーバに格納されたデータを要求するたびにそのデータ・サーバへの接続を確立します。

  • ネットワークから取得したデータをキャッシュ内で維持します。

  • データ・サーバへのすべての接続の状態を監視し、一定時間接続が中断された場合には対応策を実行します ("ECP リカバリ" を参照)。

Note:

分散キャッシュ・クラスタには、複数のデータ・サーバを含めることができます (ただし、これが行われるのはまれです)。InterSystems IRIS インスタンスは、データ・サーバとアプリケーション・サーバの両方の機能を同時に果たすことができますが、アプリケーション・サーバとして受信するデータのデータ・サーバとしては機能しません。

ECP の機能

ECP は、次の機能を提供することにより、分散キャッシュ・アーキテクチャをサポートしています。

  • 自動、フェイルセーフ処理。ECP は、一度構成されると、アプリケーション・サーバとデータ・サーバ間の接続を自動的に確立、維持し、アプリケーション・サーバとデータ・サーバ・インスタンス間の接続が (計画的または計画外に) 切断された場合、回復しようとします ("ECP リカバリ" を参照)。また ECP では、データ・サーバのフェイルオーバーが発生しても、その前後で実行中のアプリケーションの状態を維持することもできます ("分散キャッシュと高可用性" を参照)。

    これらの機能により、アプリケーションでデータを引き続き利用できるだけでなく、分散キャッシュ・クラスタの管理が容易になります。例えば、アプリケーション・サーバのインスタンスで操作を実行することなく、一時的にデータ・サーバをオフラインにしたり、計画的なメンテナンスの一部としてフェイルオーバーさせたりすることが可能です。

  • 混在するネットワーク :分散キャッシュ・クラスタ内の InterSystems IRIS システムは、さまざまなハードウェアおよびオペレーティング・システム・プラットフォームで実行できます。データ形式の変換が必要な場合、ECP が自動的にそれを管理します。

  • TCP/IP ベースの堅牢な Transport 層 :ECP は構成と維持が容易な、標準的な TCP/IP プロトコルをデータ転送に使用します。

  • ネットワーク帯域幅の効率的な使用 :ECP は、高性能ネットワーキング・インフラストラクチャをフルに活用します。

ECP リカバリ

ECP は、アプリケーション・サーバとデータ・サーバの間の接続の中断から自動的に回復するように設計されています。このような中断が発生した場合、ECP はリカバリ・プロトコルを実行します。リカバリ・プロトコルは、障害の性質と構成されたタイムアウト間隔によって異なります。その結果は、接続が回復されるか、何も発生しなかったかのようにアプリケーションのプロセスを続行できるか、またはリセットされ、トランザクションを強制的にロールバックし、アプリケーションのプロセスが再構築されます。

ECP 接続の詳細は、"分散アプリケーションの監視" を参照してください。ECP リカバリの詳細は、"ECP リカバリ・プロトコル" および "ECP リカバリ・プロセス、保証、および制限" を参照してください。

分散キャッシュと高可用性

ECP リカバリによって、データ・サーバへの中断されたアプリケーション・サーバ接続が処理されている間、分散キャッシュ・クラスタ内のアプリケーション・サーバは、データ・サーバのフェイルオーバーが発生しても、その前後で実行中のアプリケーションの状態が維持されるように設計されています。アプリケーション・アクティビティとフェイルオーバー・メカニズムの特性に応じて、フェイルオーバーが完了するまで一時停止する場合がありますが、その後ワークフローを中断することなく動作を続行できます。

スタンドアロンの InterSystems IRIS インスタンスと同じように、高可用性を実現するためにデータ・サーバをミラーリングし、フェイルオーバーが発生した場合に接続を自動的にバックアップにリダイレクトするようにアプリケーション・サーバを設定することもできます。(アプリケーション・サーバはデータを格納しないため、ミラーリングする必要はなく、ミラーリングすることはありません)。分散キャッシュ・クラスタでのミラーリングの使用方法の詳細は、"ミラーへの ECP 接続の構成" を参照してください。

"高可用性を実現するためのフェイルオーバー方法" で詳しく説明されているその他のフェイルオーバー方法は、分散キャッシュ・クラスタでも使用できます。データ・サーバに使用するフェイルオーバーの方法に関係なく、アプリケーション・サーバは、フェイルオーバーに続いて再接続してその状態を回復し、障害発生前の場所からアプリケーションのプロセスを続行できます。

分散キャッシュ・クラスタの導入

InterSystems IRIS 分散キャッシュ・クラスタは、1 つ以上のアプリケーション・サーバ・インスタンスにデータを提供するデータ・サーバ・インスタンスで構成され、これらのアプリケーション・サーバ・インスタンスから、アプリケーションにデータが提供されます。InterSystems IRIS データ・プラットフォームでは、分散キャッシュ・クラスタの自動導入方法がいくつか提供されています。このセクションで紹介している手順は、管理ポータルを使用してクラスタを手動で導入するためのものです。導入後のクラスタのセキュリティについては、"分散キャッシュ・クラスタのセキュリティ" を参照してください。

Important:

一般に、分散キャッシュ・クラスタでの InterSystems IRIS インスタンスは、どのアプリケーション・サーバもデータ・サーバより後のバージョンでない限り、さまざまなバージョンがあり得ます。バージョンの互換性に関する重要な要件および制限事項は、"インターシステムズのサポート対象プラットフォーム" の "ECP の相互運用性Opens in a new tab" を参照してください。

データ・サーバとアプリケーション・サーバのホストは異なるオペレーティング・システムまたはエンディアン (またはその両方) とすることができますが、分散キャッシュ・クラスタ内の InterSystems IRIS インスタンスはすべて同じロケールを使用する必要があります。ロケールの構成の詳細は、"管理ポータルの NLS 設定ページの使用法" を参照してください。

Note:

複数のアプリケーション・サーバにわたってアプリケーション接続を分散する Web サーバ層の負荷分散に関する重要な説明は、"負荷分散、フェイルオーバー、ミラー構成Opens in a new tab" を参照してください。

メモリ管理および拡張、CPU サイジングおよび拡張、その他の考慮事項を含む、パフォーマンス計画の重要な説明は、"システム・リソースの計画と管理" を参照してください。

最も一般的な分散キャッシュ・クラスタ構成では、ホストごとに 1 つの InterSystems IRIS インスタンスと、インスタンスごとに 1 つのクラスタ・ロールがあります (つまり、データ・サーバまたはアプリケーション・サーバのいずれか)。次のセクションで説明する自動導入方法の 1 つを使用する場合、この構成が唯一のオプションです。管理ポータルの使用について記載されている手順も、この構成を前提としています。

HealthShare Health Connect では分散キャッシュはサポートされません。

クラスタの自動導入方法

このセクションで概要を説明する手動手順のほかにも、InterSystems IRIS データ・プラットフォームでは、導入後に完全に機能する分散キャッシュ・クラスタの自動導入方法が 2 つ提供されています。

InterSystems Kubernetes Operator (IKO) を使用した分散キャッシュ・クラスタの導入

KubernetesOpens in a new tab は、コンテナ化されたワークロードとサービスの導入、拡張、および管理を自動化するためのオープンソースのオーケストレーション・エンジンです。導入するコンテナ化されたサービスと、そのサービスを管理するポリシーを定義すると、Kubernetes は、必要なリソースを可能な限り最も効率的な方法で透過的に提供します。また、導入が指定値から外れた場合は導入を修復またはリストアするほか、拡張を自動またはオンデマンドで行います。InterSystems Kubernetes Operator (IKO) は、IrisCluster カスタム・リソースで Kubernetes API を拡張します。このリソースは、InterSystems IRIS のシャード・クラスタ、分散キャッシュ・クラスタ、またはスタンドアロン・インスタンスとして、すべて任意でミラーリングした状態で、Kubernetes プラットフォームに導入できます。

Kubernetes で InterSystems IRIS を導入するのに IKO は必須ではありませんが、プロセスが大幅に簡易化され、InterSystems IRIS 固有のクラスタ管理機能が Kubernetes に追加され、クラスタにノードを追加するなどのタスクが可能になります。このようなタスクは、IKO を使わなければインスタンスを直接操作して手動で行わなければなりません。

IKO の使用法の詳細は、"InterSystems Kubernetes Operator の使用Opens in a new tab" を参照してください。

構成マージを使用した分散キャッシュ・クラスタの導入

Linux および UNIX® システムで利用可能な構成マージ機能を使用すると、宣言型構成マージ・ファイルを導入内の各インスタンスに適用することにより、同じイメージから導入した InterSystems IRIS コンテナや、同じキットからインストールしたローカル・インスタンスの構成を変更することができます。

このマージ・ファイルは、既存のインスタンスを再起動したときに適用することもでき、インスタンスの構成パラメータ・ファイル (CPF) を更新します。CPF にはインスタンスのほとんどの構成設定が含まれており、これらの設定は開始時に毎回、インスタンス導入後の最初の設定を含めて CPF から読み取られます。導入時に構成マージを適用すると、インスタンスと共に提供された既定の CPF が実質的に独自の更新バージョンに置き換えられます。

構成マージを使用すると、データ・サーバとアプリケーション・サーバに対して別個のマージ・ファイルを呼び出して順番に導入することによって、分散キャッシュ・クラスタを導入できます。

前述のように、IKO には構成マージ機能が組み込まれています。

一般的な構成マージの使用法および具体的な分散キャッシュ・クラスタの導入方法の詳細は、"構成マージを使用した InterSystems IRIS の自動構成Opens in a new tab" を参照してください。

管理ポータルを使用したクラスタの導入

手動で導入する場合は、最初に、クラスタをホストするインフラストラクチャを特定またはプロビジョニングしてから、ホスト上で InterSystems IRIS インスタンスを特定または導入し、最後に、導入したインスタンスをクラスタとして構成する必要があります。追加する InterSystems IRIS インスタンスを導入または特定し、ホスト間に十分な帯域幅のネットワーク・アクセスを設定した後、管理ポータルを使用して分散キャッシュ・クラスタを構成するには、次の手順を実行します。

これらの手順は、管理ポータルの [ECP設定] ページで実行します ([システム管理][構成][接続性][ECP設定])。

データ・サーバの準備

InterSystems IRIS インスタンスは、アプリケーション・サーバ上で構成されるまで、分散キャッシュ・クラスタ内のデータ・サーバとして実際に動作させることはできません。ただし、インスタンスをデータ・サーバとして準備する手順には、1 つの必須アクションと 2 つのオプション・アクションが含まれています。

インスタンスをデータ・サーバとして準備するには、[ECP設定] ページに移動し (管理ポータルのホーム・ページで [システム管理][構成][接続性][ECP設定] の順に選択)、以下を実行します。

  • 右側の [このシステムをECPデータサーバとする] ボックスで、ECP サービスの [有効] リンクをクリックすることにより、このサービスを有効にします。これにより %Service_ECP の [サービス編集] ダイアログが開きます。[サービス有効] を選択し、[保存] をクリックしてサービスを有効にします。(サービスが既に有効になっている場合 (ボックス内に [無効] リンクが存在することによって示されます)、次の手順に進みます)。

    Note:

    InterSystems サービスの詳細な説明は、"サービス" を参照してください。

  • 複数のアプリケーション・サーバを同時にデータ・サーバに接続できるようにする場合は、[このシステムを ECP データサーバとする] ボックスで、[アプリケーションサーバの最大数] 設定を、構成するアプリケーション・サーバの数に変更して、[保存] をクリックし、その後、インスタンスを再起動します(アプリケーション・サーバの同時接続の数が、この設定用に入力した数よりも大きくなると、データ・サーバ・インスタンスが自動的に再起動します)。

    Note:

    アプリケーション・サーバの最大数は、UNIX® および Linux プラットフォームの構成マージ・ファイルOpens in a new tabに含まれる構成パラメータ・ファイル (CPF) の MaxServerConnOpens in a new tab 設定を使用して設定することもできます。

  • [トラブル状態の時間間隔] 設定は、アプリケーション・サーバとデータ・サーバ間で中断された接続の回復を管理するために使用される 3 つのタイムアウトのうちのいずれかを決定します。長期的なクラスタの動作に関するデータを取得するまでは、既定の 60 のままとします。ECP リカバリ・タイムアウトの詳細は、"ECP リカバリ・プロトコル" を参照してください。

  • TLS の使用を有効にしてアプリケーション・サーバからの接続をセキュリティ保護するには、[Set up SSL/TLS ‘%ECPServer’] リンクをクリックしてデータ・サーバの ECP TLS 構成を作成し、[ECP SSL/TLS サポート] 設定を次のように指定します。

    • [必須] — アプリケーション・サーバは、このデータ・サーバに対して [SSL/TLS 使用] が選択されている場合にのみ接続できます。

    • [有効] — アプリケーション・サーバは、このデータ・サーバに対して [SSL/TLS 使用] が選択されているかどうかに関係なく接続できます。

    • [無効] — アプリケーション・サーバは、このデータ・サーバに対して [SSL/TLS 使用] が選択されている場合 (既定)、接続できません。

    "分散キャッシュ・クラスタのセキュリティ" で説明しているとおり、TLS は ECP 通信をセキュリティ保護するためのいくつかのオプションのうちの 1 つです。ただし、TLS を有効にすると、パフォーマンスに重大な悪影響を及ぼす場合があります。クラスタのアプリケーション・サーバとデータ・サーバが同じデータ・センターに配置されることにより、最適なパフォーマンスが提供されている場合、データ・センター単独での物理的なセキュリティにより、クラスタに十分なセキュリティが提供される可能性があります。

    データ・サーバでのセキュリティで保護されたアプリケーション・サーバ接続の承認を含む、分散キャッシュ・クラスタでの TLS の有効化および使用に関する重要な情報は、"アプリケーション・サーバのデータ・サーバへの接続の TLS によるセキュリティ保護" を参照してください。

Note:

ECP は、データ・サーバ上のデータベース・キャッシュの一部を使用して、さまざまな制御構造を格納します。これに対応するために、データベース・キャッシュのサイズを増やすことが必要になる場合があります。詳細は、"ECP 制御構造用のデータ・サーバ・データベース・キャッシュの増大" を参照してください。

これで、データ・サーバは、有効なアプリケーション・サーバから接続できるようになります。

アプリケーション・サーバの構成

InterSystems IRIS インスタンスを分散キャッシュ・クラスタ内のアプリケーション・サーバとして構成するには、次の 2 つの手順が必要です。

  • アプリケーション・サーバ・インスタンス上のデータ・サーバとして、データ・サーバ・インスタンスを追加します。

  • アプリケーション・サーバ上のリモート・データベースとして、データ・サーバ上に目的のデータベースを追加します。

アプリケーション・サーバにデータ・サーバを追加するには、次の手順を実行します。

  1. "データ・サーバの準備" のデータ・サーバに関する説明に従い、[ECP設定] ページに移動して、[このシステムをECPアプリケーションサーバとする] 側の設定を既定のままとします。

  2. 追加しているデータ・サーバの [ECP SSL/TLS サポート] 設定が [有効] または [必須] の場合は、[Set up SSL/TLS ‘%ECPClient’] リンクをクリックして、アプリケーション・サーバの ECP TLS 構成を作成します(これは、後で [ECPデータサーバ] ダイアログでも実行できます)。詳細は、次の手順の [SSL/TLS 使用] 設定を参照してください。

  3. [データサーバ] をクリックして [ECP データサーバ] ページを表示し、[サーバ追加] をクリックします。[ECPデータサーバ] ダイアログに、データ・サーバについて次の情報を入力します。

    • サーバ名 — データ・サーバを識別する説明的な名前(この名前は 64 文字に制限されます)。

    • ホストDNS名またはIPアドレス — データ・サーバのホストまたはその IP アドレスの DNS 名を指定します (ドットで区切った十進数形式。IPv6 を有効にしている場合は、コロン区切りの形式)。DNS 名で指定した場合、アプリケーション・サーバがそのデータ・サーバ・ホストに接続するたびに、実際の IP アドレスに解決されます。詳細は、"IPv6 のサポート" を参照してください。

      Important:

      ミラー・プライマリをデータ・サーバとして追加する場合 ([ミラー接続] 設定を参照)、ミラーの仮想 IP アドレス (VIP) を入力するのではなく、現在のプライマリ・フェイルオーバー・メンバの DNS 名または IP アドレスを入力します。

    • [IP ポート] — このポート番号の既定は 1972 (既定の InterSystems IRIS スーパーサーバ (IP) ポート) です。必要に応じてデータ・サーバの InterSystems IRIS インスタンスのスーパーサーバ・ポートに変更します。

    • [ミラー接続] — データ・サーバがミラー内のプライマリ・フェイルオーバー・メンバである場合は、このチェック・ボックスにチェックを付けます (データ・サーバとしてのミラー・プライマリの構成に関する重要な情報は、"ミラーへのアプリケーション・サーバ接続の構成" を参照してください)。

    • [バッチモード] — このデータ・サーバのサーバ・プロセスをバッチ・モードで実行する必要がある場合はこのチェック・ボックスにチェックを付けます。バッチ・モードでは、データ・サーバは常にブロックをロードして、それらをバッチ・レベルでキャッシュします。ただし、ブロックがアプリケーション・サーバに戻されると、そのブロックは定期的にキャッシュされます。

    • [SSL/TLS 使用] — このチェック・ボックスは、以下のように使用します。

      • 追加しているデータ・サーバの [ECP SSL/TLS サポート] 設定が [無効] の場合、このチェック・ボックスにチェックを付けても付けなくても問題ありません。データ・サーバへの接続をセキュリティ保護するために TLS は使用されません。

      • 追加しているデータ・サーバの [ECP SSL/TLS サポート] 設定が [有効] のとき、このデータ・サーバへの接続をセキュリティ保護するのに TLS を使用する場合はこのチェック・ボックスにチェックを付け、TLS を使用しない場合はチェックを外します。

      • 追加しているデータ・サーバの [ECP SSL/TLS サポート] 設定が [必須] の場合は、このチェック・ボックスにチェックを付ける必要があります。

      追加しているデータ・サーバの [ECP SSL/TLS サポート] 設定が [有効] または [必須] で、アプリケーション・サーバに対してまだ TLS 構成を作成していない場合は、[Set up SSL/TLS ‘%ECPClient’] リンクをクリックしてこれを行います。データ・サーバでのセキュリティで保護されたアプリケーション・サーバ接続の承認を含む、分散キャッシュ・クラスタでの TLS の使用の詳細は、"アプリケーション・サーバのデータ・サーバへの接続の TLS によるセキュリティ保護" を参照してください。

  4. [保存] をクリックします。データ・サーバはデータ・サーバ・リストに表示されます。利用可能なリンクを使用して、データ・サーバ定義を削除または編集したり、その状態を変更したりすることができます ("分散アプリケーションの監視" を参照)。データ・サーバ上の [ECP設定] ページに進み、[アプリケーションサーバ] ボタンをクリックすることで、データ・サーバへのすべてのアプリケーション・サーバ接続のリストを表示することもできます。

アプリケーション・サーバ上のリモート・データベースとしてデータ・サーバ上にそれぞれ必要なデータベースを追加するには、アプリケーション・サーバ上にネームスペースを作成し、次のようにそのデータベースにマッピングする必要があります。

  1. 管理ポータルのホーム・ページで [システム管理][構成][システム構成][ネームスペース] の順に選択して、[ネームスペース] ページに移動します。[新規ネームスペース作成] をクリックして、[新規ネームスペース] ページを表示します。

  2. 新規ネームスペースの名前を入力します。通常は、マッピングされるリモート・データベースの名前が反映されます。

  3. [このネームスペースにおけるグローバルの既定のデータベース] で、[リモートデータベース][新規データベース作成] の順に選択して、[リモートデータベースを作成] ダイアログを開きます。このダイアログで、

    • [リモートサーバ] ドロップダウンからデータ・サーバを選択します。

    • [リモートディレクトリ][リストからディレクトリを選択] に設定し、データ・サーバ上のすべてのデータベース・ディレクトリを一覧表示する [ディレクトリ] ドロップダウンを使用して、ネームスペースにマッピングするデータ・サーバ・データベースを選択します。

    • リモート・データベースのローカル名を入力します。これは、通常、データ・サーバ上のデータベースの名前、前の手順で指定されたデータ・サーバのローカル名、またはその両方を反映します。

    • [完了] をクリックしてリモート・データベースを追加し、新しいネームスペースにマッピングします。

  4. [このネームスペースでルーチンのデフォルト・データベースは] で、[リモートデータベース] を選択し、次に、ドロップダウンから作成したデータベースを選択します。

  5. ネームスペースは相互運用対応である必要はありません。時間を節約するために、[相互運用プロダクション用にネームスペースを有効化] チェック・ボックスのチェックを外すことができます。

  6. [保存] を選択します。[ネームスペース] リストに新規ネームスペースが一覧表示されます。

アプリケーション・サーバ上のリモート・データベースとしてデータ・サーバ・データベースを追加すると、アプリケーションは、アプリケーション・サーバにマッピングされているネーム・スペースを介してそのデータベースをクエリすることができます。

Note:

アプリケーション・サーバ上のネームスペースが、データ・サーバ上のデータベースにマッピングされていても、データ・サーバ上のそのデータベースにマッピングされているネームスペースへの変更は、アプリケーション・サーバにとっては不明であることに留意してください。(マッピングの詳細は、"グローバル・マッピング" を参照してください。)例えば、データ・サーバ上のネームスペース DATA に、既定のグローバル・データベース DATA があるとします。アプリケーション・サーバでは、REMOTEDATA というネームスペースは、同じ (リモート) データベース DATA にマッピングされます。データ・サーバ上の DATA ネームスペースでマッピングを作成して、グローバル ^DATA2DATA2 データベースにマッピングしても、このマッピングはアプリケーション・サーバに伝播されません。このため、アプリケーション・サーバ上のリモート・データベースとして DATA2 を追加しないで、REMOTEDATA ネームスペースに同じマッピングを作成しても、アプリケーション・サーバが受信するクエリでは、^DATA2 グローバルを読み取ることができません。

分散キャッシュ・クラスタのセキュリティ

分散キャッシュ・クラスタ内のすべての InterSystems インスタンスが、InterSystems IRIS の安全な境界の内部 (外部に対する安全が確保されている環境の内部) に存在する必要があります。その理由は、ECP が基本的なセキュリティ・サービスであり、リソース・ベースのサービスではないので、アクセスするユーザを制限する方法がないためです(基本サービスおよびリソース・ベースのサービスの詳細は、"使用可能なサービス" を参照してください)。

ただし、次のセキュリティ・ツールは利用可能です。

Note:

データ・サーバ上でデータベースが暗号化されている場合は、接続されているすべてのアプリケーション・サーバ上の IRISTEMP データベースも暗号化する必要があります。キーは、すべてのサーバで同じものにすることもできれば、別々のものにすることもできます。データベース暗号化の詳細は、"暗号化ガイド" を参照してください。

アプリケーション・サーバのデータ・サーバへの接続の TLS によるセキュリティ保護

TLS がデータ・サーバで有効な場合、これを使用してアプリケーション・サーバからそのデータ・サーバへの接続をセキュリティ保護できます。この保護には、X.509 証明書ベースの暗号化が含まれます。TLS およびインターシステムズ製品での TLS の使用の詳細は、インターシステムズの "TLS ガイド" を参照してください。

データ・サーバの構成または編集時、あるいはそれ以降であればいつでも ("データ・サーバの準備" を参照)、[ECP SSL/TLS サポート] 設定として、既定の [無効] ではなく、[有効] または [必須] を選択できます。これらの設定は、データ・サーバをアプリケーション・サーバに追加する ("アプリケーション・サーバの構成" を参照) か、既存のデータ・サーバを編集する際に、TLS によりデータ・サーバへの接続をセキュリティ保護する、[SSL/TLS 使用] チェック・ボックスの使用オプションを制御します。これら設定は、以下のように影響します。

  • 無効 — アプリケーション・サーバのこのデータ・サーバへの接続に対する TLS の使用を無効にします。[SSL/TLS 使用] が選択されているアプリケーション・サーバであっても、同様です。

  • 有効 — データ・サーバでアプリケーション・サーバの接続に対する TLS の使用が有効になります。[SSL/TLS 使用] が選択されているアプリケーション・サーバからの接続に対して TLS が使用され、[SSL/TLS 使用] が選択されていないアプリケーション・サーバからの接続に対しては、SSL/TLS は使用されません。

  • 必須 — データ・サーバではアプリケーション・サーバの接続に TLS を使用する必要があります。アプリケーション・サーバは、データ・サーバに対して [SSL/TLS 使用] が選択されている場合のみ、データ・サーバに接続できます。この場合、すべての接続に対して TLS が使用されます。

TLS を使用してアプリケーション・サーバからデータ・サーバへの接続を確立するには、次の 3 つの要件があります。

  • データ・サーバでは、スーパーサーバ・クライアントに対して TLS 接続を有効にする必要があります。そのためには、データ・サーバで、システムの既定のスーパーサーバの構成ページ ([システム管理][セキュリティ][スーパーサーバ]) に移動して、[SSL/TLS support level] 設定に [有効] を選択します。詳細は、"スーパーサーバの管理" を参照してください。

  • 両方のインスタンスに ECP TLS 構成が必要です。

    このため、[ECP設定] ページ ([システム管理][構成][接続性][ECP設定]) の両側の [このシステムをECPアプリケーションサーバとする][このシステムをECPデータサーバとする] には、[SSL/TLS の構成] リンクが含まれており、これを使用してインスタンスに適した ECP TLS 構成を作成できます。このためには、以下の手順を実行します。

    1. [ECP設定] ページのアプリケーション・サーバ側の [Set up SSL/TLS ‘%ECPClient’] リンク、またはデータ・サーバ側の [Set up SSL/TLS ‘%ECPServer’] リンクをクリックします。

    2. [ECP用 SSL/TLS 構成を編集] ダイアログ内のフォームの各フィールドに入力します。これらは [新規 SSL/TLS 構成] ページに似ています ("TLS 構成の作成または編集" を参照)。ただし、[構成名][説明][有効] のいずれのフィールドもありません。また、秘密鍵パスワードに関しては、このページでパスワードの入力または置き換え ([新規パスワード入力])、パスワードを使用しないことの指定 ([パスワードクリア])、あるいは既存のパスワードをそのまま使用すること ([そのままにする]) の指定を行えます。

      このページのフィールドは以下のとおりです。

      • [信頼された証明書機関 X.509 証明書を含むファイル]

        この構成が信頼する 1 つまたは複数の認証機関 (CA) の X.509 証明書 (PEM 形式) が含まれているファイルのパスと名前。絶対パス、または install-dir/mgr/ ディレクトリを基準とした相対パスで指定できます。X.509 証明書とそれらの生成および使用の詳細は、インターシステムズの "TLS ガイド" を参照してください。

        Note:

        このファイルには、他のミラー・メンバに属する X.509 証明書の検証に使用できる証明書が含まれている必要があります。ファイルに複数の証明書が含まれている場合は、それらの証明書を正しい順序で (現在のインスタンスの証明書が最初になるように) 並べる必要があります。詳細は、"必須証明書チェーンの確立" を参照してください。

      • [この構成のX.509 証明書を含むファイル]

        構成独自の X.509 証明書 (PEM 形式) の場所。これは、絶対パスと相対パスのいずれかとして指定できます。

        Note:

        証明書の識別名 (DN) は証明書のサブジェクト・フィールドに表示する必要があります。

      • [関連づけられた秘密鍵を含むファイル:]

        構成の秘密鍵ファイルを格納する場所。絶対パスまたは相対パスで指定します。

      • [秘密鍵タイプ]

        秘密鍵の生成に使用するアルゴリズム。有効なオプションは [DSA][RSA] です。

      • [パスワード]

        ECP TLS 構成を作成している場合、[新規パスワード入力] を選択すると、証明書に関連付けられた秘密鍵のパスワードの入力および確認のための再入力を実行できます。

      • [プロトコル]

        構成で有効と見なされる通信プロトコル TLSv1.1 および TLSv1.2 は、既定で有効となります。

      • [有効な暗号スイート]

        クライアントとサーバ間の通信の保護に使用される暗号スイート・セット。通常、これは既定の設定のままにできます。

      フォームの入力が完了したら [保存] をクリックします。

  • アプリケーション・サーバは、TLS を使用して接続する前に、データ・サーバで承認する必要があります。

    アプリケーション・サーバが最初に TLS を使用してデータ・サーバに接続を試みると、その SSL (TLS) コンピュータ名 (その X.509 証明書の所有者識別名) とそのホストの IP アドレスが、データ・サーバの [アプリケーションサーバ] ページ ([システム管理][構成][接続性][ECP設定][アプリケーションサーバ]) の、承認または拒否が決まっていない保留中の ECP アプリケーション・サーバのリストに表示されます。[承認] および [拒否] リンクを使用して、リスト内の要求に対応します(保留中の要求がない場合、リストは表示されません)。

    TLS を使用して接続することが承認されているアプリケーション・サーバが 1 つ以上存在する場合、その SSL (TLS) コンピュータ名が、[アプリケーションサーバ] ページの、ECP アプリケーション・サーバとして承認された SSL コンピュータ名のリストに表示されます。承認をキャンセルするには [削除] リンクを使用します(承認されたアプリケーション・サーバがない場合、リストは表示されません)。

データ・サーバへのアクセスの制限

既定では、(前のセクションで説明したように) データ・サーバ・インスタンスがデータ・サーバとして構成されている InterSystems IRIS インスタンスは、データ・サーバに接続できます。ただし、許可される着信接続元となるホストを指定することによって、データ・サーバに対するアプリケーション・サーバとして機能できるインスタンスを制限できます。これを行う場合、明示的にリストされていないホストは、データ・サーバに接続できません。これを行うには、データ・サーバ上で次の手順を実行します。

  1. [サービス] ページ (ポータルのホーム・ページから、[セキュリティ][サービス] の順に選択) で、[%Service_ECP] をクリックします。[サービス編集] ダイアログが表示されます。

  2. 既定では、[許可済みの接続元] ボックスは空です。つまり、ECP サービスが有効な場合、すべてのアプリケーション・サーバがこのインスタンスに接続できます。[追加] をクリックして、単一の IP アドレス (192.9.202.55 など) または完全修飾ドメイン名 (mycomputer.myorg.com など)、あるいは IP アドレスの範囲 (例えば、8.61.202–210.*18.68.*.*) を入力します。リストに 1 つ以上のエントリがあるときに、[サービス編集] ダイアログで [保存] をクリックすると、これらのエントリで指定されたホストのみが接続できます。

リストには説明に従っていつでもアクセスすることができます。リストからホストを削除するには [削除] を使用し、ホストに関連付けられたロールを指定するには [編集] リンクを使用します ("ロールと権限によるアクセスの制御" を参照)。

ロールと権限によるデータベースへのアクセスの制御

インターシステムズが使用するセキュリティ・モデルでは、データベースを含むアセットがリソースに割り当てられ、リソースには読み取りや書き込みなどの許可が割り当てられます。リソースと許可の組み合わせを権限と呼びます。権限は、ユーザが所属できるロールに割り当てられます。このように、リソースへのユーザ・アクセスを制御するためにロールが使用されます。このモデルの詳細は、"承認 : ユーザ・アクセスの制御" を参照してください。

データ・サーバにあるデータベースへのアクセス許可を取得するには、アプリケーション・サーバ上のプロセスを開始するユーザが保持するロールと、データ・サーバ上の ECP 接続に対して設定されたロールの両方に、そのデータベースを表す同じリソースに対する許可が指定されている必要があります。例えば、あるユーザが、特定のデータベース・リソースに対する読み取り許可の権限を付与するアプリケーション・サーバ上のロールに所属し、データ・サーバ上の ECP 接続に設定されているロールにもこの権限が含まれている場合、そのユーザは、アプリケーション・サーバ上のデータベースからデータを読み取ることができます。

アプリケーション・サーバの代わりにデータ・サーバを実行する場合、既定では、InterSystems IRIS は、データ・サーバ上の ECP 接続に %All 特権を与えます。つまり、アプリケーション・サーバ上のユーザが持つ権限はすべて、データ・サーバ上で照合され、アクセスはアプリケーション・サーバ上でのみ制御されます。例えば、%DB_USER リソースに対する特権のみを持っており、%DB_IRISLIB リソースに対する特権を持っていない、アプリケーション・サーバのユーザは、データ・サーバの USER データベースにあるデータにアクセスできますが、データ・サーバの IRISLIB データベースにアクセスしようとすると、<PROTECT> エラーとなります。アプリケーション・サーバの別のユーザが、%DB_IRISLIB リソースに対する特権を持っている場合、そのユーザは IRISLIB データベースを利用できます。

Note:

LDAP サーバを使用して、分散キャッシュ・クラスタのアプリケーション・サーバ全体で、ユーザ・ロールと特権を含む、一元的なセキュリティを実装することをお勧めします。InterSystems IRIS での LDAP の使用についての詳細は、"LADP ガイド" を参照してください。

ただし、アプリケーション・サーバのホストに基づいて、データ・サーバ上の ECP 接続で使用できるロールを制限することもできます。例えば、データ・サーバで、特定のアプリケーション・サーバと対話するときに使用できるロールを %DB_USER のみとすることを指定できます。この場合、アプリケーション・サーバで %DB_USER ロールが与えられているユーザは、データ・サーバの USER データベースにアクセスできますが、アプリケーション・サーバ上のユーザは、付与されたロールに関係なく、データ・サーバ上の他のデータベースにアクセスすることはできません。

Caution:

データ・サーバですべての ECP 接続に対して %All 権限を引き続き付与できるようにするのではなく、クラスタ内のすべてのアプリケーション・サーバで使用可能なロールを指定することにより、クラスタを保護することを強くお勧めします。

以下は、この動作に対する例外です。

  • InterSystems IRIS は必ずデータ・サーバに %DB_IRISSYS ロールを与えます。これは、このデータ・サーバが稼動するには、IRISSYS データベースへの Read アクセスが必要なためです。つまり、アプリケーション・サーバ上で %DB_IRISSYS ロールを持つユーザは、データ・サーバの IRISSYS データベースにアクセスできます。

    このアプリケーション・サーバのユーザが、データ・サーバの IRISSYS データベースにアクセスできないようにする方法には次の 2 とおりがあります。

    • %DB_IRISSYS リソースに対する特権をユーザに与えない。

    • データ・サーバで、IRISSYS データベースのリソース名を、%DB_IRISSYS 以外の名前に変更する。このとき、アプリケーション・サーバのユーザが変更後の名前を持つリソースに対する特権を持っていないことを確認してください。

  • データ・サーバにパブリック・リソースが存在する場合、アプリケーション・サーバのロールや、ECP 接続用に構成されたロールに関係なく、ECP アプリケーション・サーバ上のすべてのユーザはこのパブリック・リソースを使用できます。

データ・サーバ上の特定のアプリケーション・サーバからの ECP 接続に使用可能なロールを指定するには、以下の操作を行います。

  1. [サービス] ページ (ポータルのホーム・ページから、[セキュリティ][サービス] の順に選択) に移動して、[%Service_ECP] をクリックし、[サービス編集] ダイアログを表示します。

  2. 制限するアプリケーション・サーバ・ホストの [編集] リンクをクリックして、[ロールの選択] 領域を表示します。

  3. ホストのロールを指定するには、[使用可能] の下に一覧表示されるロールから必要なロールを選択し、右矢印をクリックして、選択したロールを [選択済み] リストに追加します。

  4. [選択済み] リストからロールを削除するには、削除するロールを選択し、左矢印をクリックします。

  5. [選択済み] リストにすべてのロールを追加するには、二重右矢印をクリックします。また、[選択済み] リストからロールをすべて削除するには、二重左矢印をクリックします。

  6. [保存] をクリックして、IP アドレスとロールを関連付けます。

既定では、リストされたホストは %All ロールを保持していますが、その他のロールを 1 つまたは複数指定すると、この接続は指定したそれらのロールのみを持つことになります。したがって、%Operator ロールを持つホストまたは IP 範囲からの接続が持つ特権は、そのロールに関連付けられているもののみです。一方、ロールが関連付けられていない (つまり、%All ロール) ホストからの接続はすべての特権を持つことになります。

アプリケーション・サーバのホストで使用可能なロールに対する変更、およびデータ・サーバのリソース上のパブリック許可に対する変更を有効にするには、InterSystems IRIS の再起動が必要です。

セキュリティ関連のエラー報告

ECP で発生するセキュリティ関連のエラー報告の動作は、アプリケーション・サーバとデータ・サーバのどちらでチェックが失敗したか、またどのような操作が行われたかによって次のように異なります。

  • アプリケーション・サーバでチェックに失敗した場合は、直ちに <PROTECT> エラーとなります。

  • データ・サーバでの同期操作の場合は、直ちに <PROTECT> エラーとなります。

  • データ・サーバでの非同期操作の場合は、<NETWORK DATA UPDATE FAILED> エラーが遅延時間の後で表示されることがあります。このような操作には、例えば Set 操作があります。

分散キャッシュ・アプリケーションの監視

実行中の分散キャッシュ・クラスタは、1 つ以上のアプリケーション・サーバ・システム (データ・コンシューマ) に接続されたデータ・サーバ・インスタンス (データ・プロバイダ) で構成されます。各アプリケーション・サーバとデータ・サーバ間では、ECP 接続が確立されています。つまり、ECP がデータとコマンドの送信に使用する TCP/IP 接続です。

[ECP設定] ページ ([システム管理][構成][接続性][ECP設定]) で、分散キャッシュ・クラスタ内のサーバと接続の状態を監視できます。

[ECP設定] ページには、次の 2 つのサブセクションがあります。

  1. [このシステムをECPデータサーバとする] では、データ・サーバの設定と、ECP サービスの状態が表示されます。

  2. [このシステムをECPアプリケーションサーバとする] には、アプリケーション・サーバの設定が表示されます。

以下のセクションでは、接続状態の情報について説明します。

ECP 接続情報

[ECPデータサーバの設定] ページ ([システム管理][構成][接続性][ECP設定]) で [データサーバ] ボタンをクリックすると、アプリケーション・サーバ上の現在のデータ・サーバ接続を一覧表示する [ECPデータサーバ] ページが表示されます。[ECP設定] ページの [アプリケーションサーバ] ボタンをクリックすると表示される [ECPアプリケーションサーバ] ページには、データ・サーバ上の現在のアプリケーション・サーバ接続のリストが表示されます。

データ・サーバ接続

[ECPデータサーバ] ページに、各データ・サーバ接続について次の情報が表示されます。

サーバ名

アプリケーション・サーバ構成にサーバが追加されたときに入力された、この接続のデータ・サーバ・システムの論理名。

ホスト名

アプリケーション・サーバ構成にサーバが追加されたときに入力された、データ・サーバ・システムのホスト名。

IPポート

データ・サーバへの接続に使用する IP ポート番号。

ステータス

現在の接続の状態接続状態については、"ECP 接続の状態" セクションで説明します。

編集

この接続の現在の状態が未接続または無効である場合は、データ・サーバのポートおよびホスト情報を編集できます。

状態の変更

各データ・サーバ行から、そのデータ・サーバとの間に存在する ECP 接続の状態を変更できます。詳細は、"ECP 接続処理" のセクションを参照してください。

削除

アプリケーション・サーバからデータ・サーバの情報を削除できます。

アプリケーション・サーバ接続

[ECP設定]ページ ([システム管理][構成][接続性][ECP設定]) で [ECP アプリケーションサーバ] をクリックして、このデータ・サーバ上のアプリケーション・サーバ接続のリストを含む [ECP アプリケーションサーバ] ページを表示します。

クライアント名

この接続上のアプリケーション・サーバの論理名。

ステータス

現在の接続の状態接続状態については、"ECP 接続の状態" セクションで説明します。

クライアントIP

アプリケーション・サーバのホスト名または IP アドレス

IPポート

アプリケーション・サーバへの接続に使用するポート番号。

ECP 接続の状態

稼働中のクラスタでは、ECP 接続は以下のいずれかの状態になります。

ECP 接続の状態
状態 説明
未接続 接続は定義済みですが、未使用です。
接続中 接続中です。接続されるまで表示される一時的な状態です。
正常 接続は正常に動作し、現在使用されています。
障害 接続に障害が発生しました。可能な場合、接続は自動的に修正されます。
無効 接続は、システム管理者によって手動で無効にされました。接続中のアプリケーションは <NETWORK> エラーを受け取ります。

以下のセクションでは、アプリケーション・サーバとデータ・サーバの接続状態を説明します。

アプリケーション・サーバの接続状態

以下のエントリは、アプリケーション・サーバ側のそれぞれの接続状態を示します。提示される数値によって、ログ・メッセージに示された接続状態を判断できます。例えば、以下のメッセージは、アプリケーション・サーバの障害状態 : jojo96HABER を表します。

01/28/24-00:00:11:859 (6552) 2 [SYSTEM MONITOR] ECPClientState Alert: ECP reports Clients state 6
アプリケーション・サーバは初期化されていない (0)

ノードは、初期化中の状態 (きわめてまれ) か、まだ初期化されていません。 

アプリケーション・サーバの未接続状態 (1)

アプリケーション・サーバ側の ECP 接続は、最初は未接続状態になっています。この状態の場合、接続のための ECP デーモンは存在しません。アプリケーション・サーバ・プロセスがネットワーク要求を送信すると、接続のためのデーモンが作成され、接続は接続中状態に入ります。

アプリケーション・サーバの接続中状態 (2)

接続中状態では、接続のためのネットワーク・デーモンが存在し、データ・サーバへの接続の確立を試行します。接続が確立されたら、正常状態に入ります。接続が接続中状態にある場合、ユーザ・プロセスは、接続が確立されるまで最大 20 秒待機します。接続がその時間内に確立されなかった場合、ユーザ・プロセスは <NETWORK> エラーを受け取ります。

アプリケーション・サーバ ECP デーモンは、バックグラウンドでデータ・サーバへの新しい接続を試行します。接続が 20 分以内に確立されなかった場合は、接続は未接続状態に戻り、接続のデーモンは削除されます。

アプリケーション・サーバの接続失敗状態 (3)

接続中の状態で行われた接続試行が失敗しました。この状態が数秒間続いた後、アプリケーション・サーバの未接続状態に移行します。

アプリケーション・サーバの無効状態 (4)

ECP 接続が無効としてマークされるのは、管理者が無効にすると判断した場合です。この状態では、デーモンは存在せず、その接続を使用するすべてのネットワーク要求はすぐに <NETWORK> エラーを受け取ります。

アプリケーション・サーバの正常状態 (5)

接続が完了した後、正常な (データ転送) 状態に入ります。この状態では、アプリケーション・サーバ側のデーモンが存在し、ネットワークを介して要求を送信し、応答を受信します。接続の正常状態は、接続が継続不可能になるか、アプリケーション・サーバかデータ・サーバから接続のシャットダウンが要求されるまで維持されます。

アプリケーション・サーバの障害状態 (6)

アプリケーション・サーバからデータ・サーバへの接続で問題が発生した場合、アプリケーション・サーバの ECP 接続は、障害状態に入ります。この状態では、アプリケーション・サーバの ECP デーモンが存在し、接続のリストアを試行します。基本の TCP 接続は、確立されている場合も確立されていない場合もあります。基本の TCP 接続がリセットされ、再現の必要があるかどうかによってリカバリ方法が異なることはありません。つまり、TCP 接続が一時的に機能を停止した場合でもリカバリ方法は同じです。

アプリケーション・サーバの [リカバリまでの待機時間] のタイムアウト期間中 (既定は 20 分)、アプリケーション・サーバは ECP 接続をリカバリするために、データ・サーバへの再接続を試行します。この間、既存のネットワーク要求は保持されますが、アプリケーション・サーバ側のユーザ・プロセスは、新しいネットワーク要求の送信を中止して、接続が再開されるのを待ちます。接続が [リカバリまでの待機時間] のタイムアウト期間内に回復した場合は、正常状態に戻り、中止されていたネットワーク要求は送信されます。

例えば、データ・サーバがオフラインになった場合、データ・サーバが使用可能になるまで、接続中のすべてのアプリケーション・サーバの状態は障害に設定されます。障害が適切に修正されると、接続状態は正常に戻ります。一方、障害状態をリカバリできない場合、未接続となります。

アプリケーションは、ネットワーク・アクセスが必要となるまで、継続して稼動します。サーバが応答していない間は、ローカルにキャッシュされたデータすべてをアプリケーションで使用できます。

アプリケーション・サーバのリカバリ中状態 (7)

リカバリ中状態は、障害状態の一部です。現在データ・サーバに TCP 接続がなく、新しい接続が確立された場合、アプリケーション・サーバとデータ・サーバはリカバリ・プロトコルに従って、アプリケーション・サーバのキャッシュをフラッシュし、トランザクションおよびロックを回復し、正常状態に戻ります。

同様に、データ・サーバのシャットダウンや、クラッシュの結果としてのシャットダウン後の再起動の場合、その後アプリケーション・サーバには再接続と既存のセッションを回復するための短い時間 (約 30 秒) が与えられます。そしてここでも、アプリケーション・サーバとデータ・サーバはリカバリ・プロトコルに従います。

接続のリカバリが、[リカバリまでの待機時間] のタイムアウト期間内に完了しなかった場合、アプリケーション・サーバは接続のリカバリを終了します。具体的には、アプリケーション・サーバは、すべての未実行のネットワーク要求にエラーを返し、接続状態を未接続に変更します。この作業がアプリケーション・サーバ側で行われなかった場合は、次にこのアプリケーション・サーバからデータ・サーバに接続されたときに、すべてのトランザクションはロールバックされ、このアプリケーション・サーバからのすべてのロックが解除されます。

リカバリに成功した場合、接続は正常状態に戻り、中止されていたネットワーク要求が送信されます。

データ・サーバの接続状態

以下のセクションでは、データ・サーバ側の各接続状態について説明します。

データ・サーバの解放状態

ECP サーバ・インスタンスが起動されたとき、ECP サーバに対するすべての接続は、初期の “割り当てのない” 解放の状態にあり、接続アクセス・コントロール・リストにあるすべてのアプリケーション・サーバから接続できる状態になっています。アプリケーション・サーバからの接続が既にあり、その後切断されたが、リカバリ手順を行う必要がない場合、その接続は、“アイドル” 状態である解放状態になります。この 2 つの状態の唯一の違いは、アイドル状態の場合は、その接続ブロックが既に特定のアプリケーション・サーバに割り当てられており、アクセス・コントロール・リストにある他のアプリケーション・サーバでは利用できない点です。

データ・サーバの正常状態

データ・サーバの正常状態では、アプリケーション・サーバの接続は正常です。接続を受け入れる側の処理ではどの時点でも、アプリケーション・サーバがデータ・サーバとの接続を切断した場合 (データ・サーバ自体のシャットダウン・シーケンスの場合は除く)、データ・サーバは未実行のトランザクションをロールバックし、そのアプリケーション・サーバからのロックを解除し、そのアプリケーション・サーバとの接続を “アイドル” 状態である解放状態にします。

データ・サーバの障害状態

アプリケーション・サーバが応答していない場合、データ・サーバは、障害状態を示します。データ・サーバがクラッシュまたはシャットダウンした場合、サーバはクラッシュやシャットダウン時点でアクティブであった接続を記憶しています。再起動後、データ・サーバは、アプリケーション・サーバがセッション (ロックおよび開いているトランザクション) を再要求するまで、短時間待機します (通常は 30 秒)。このリカバリ待機時間中に、アプリケーション・サーバが完全にリカバリできなかった場合、その接続にある未実行の作業はすべてロールバックされ、接続は “アイドル” 状態に置かれます。

データ・サーバのリカバリ状態

データ・サーバの接続は、アプリケーション・サーバがそのセッションの再要求プロセスにある間、ごく短時間、リカバリ状態となります。データ・サーバは、接続を再要求できるようにアプリケーション・サーバを [トラブル状態の時間間隔] のタイムアウト期間の間 (既定値は 60 秒) 障害状態に保ちます。接続が再要求されない場合、データ・サーバはアプリケーション・リソースを解放 (開いているトランザクションすべてをロールバックし、ロックを解放) し、状態を解放に設定します。

ECP 接続処理

アプリケーション・サーバ上の [ECPデータサーバ] ページ ([システム管理][構成][接続性][ECP設定] の順に選択して、[データサーバ] ボタンをクリック) で、ECP 接続のステータスを変更できます。各データ・サーバの行で、[状態の変更] をクリックし、接続情報を表示して、以下の中から適切な操作を実行します。

「無効」に変更

接続の状態を 無効 に設定これにより、アプリケーション・サーバに設定されているロックを解放し、接続に関連するオープン・トランザクションをロールバックし、データ・サーバからキャッシュされたブロックを消去します。これがアクティブな接続である場合、状態の変更によって、データ・サーバからのネットワーク応答を待機しているすべてのアプリケーションにエラーが送信されます。

「正常」に変更

接続の状態を「正常」に設定

「未接続」に変更

接続の状態を「未接続」に設定状態を [無効] に変更する場合と同様に、これにより、アプリケーション・サーバに設定されているロックが解放され、接続に関連するオープン・トランザクションがロールバックされ、データ・サーバからキャッシュされたブロックが消去されます。これがアクティブな接続である場合、状態の変更によって、データ・サーバからのネットワーク応答を待機しているすべてのアプリケーションにエラーが送信されます。

分散キャッシュ・アプリケーションの開発

ここでは、アプリケーションの開発と設計の問題について説明します。オプションあるいは主要構成のいずれかとして分散キャッシュ・クラスタ上でアプリケーションを展開する場合は、このトピックを参照してください。

InterSystems IRIS を使用し、分散システムとしてアプリケーションを展開することは、基本的に実行時の構成に関係します ("分散キャッシュ・クラスタの導入" を参照してください)。つまり、InterSystems IRIS 構成ツールを使用し、データの論理名 (グローバル) とアプリケーション・ロジック (ルーチン) を適切なシステムの物理ストレージにマップします。

このセクションでは、以下のトピックについて説明します。

ECP リカバリ・プロトコル

ECP は、アプリケーション・サーバとデータ・サーバの間の接続の中断から自動的に回復するように設計されています。このような中断が発生した場合、ECP はリカバリ・プロトコルを実行します。リカバリ・プロトコルは、障害の性質によって異なります。その結果は、接続が回復されるか、何も発生しなかったかのようにアプリケーションのプロセスを続行できるか、またはリセットされ、トランザクションを強制的にロールバックし、アプリケーションのプロセスが再構築されます。主な原則は以下のとおりです。

  • アプリケーション・サーバとデータ・サーバの間の接続が中断した場合、アプリケーション・サーバはデータ・サーバとの接続を再確立しようとします。必要に応じて、[再接続までの時間] 設定で指定された間隔 (既定値は 5 秒) で繰り返し実行します。

  • 中断が短時間の場合、接続は回復されます。

    データサーバで構成された [トラブル状態の時間間隔] のタイムアウト期間 (既定値は 60 秒) 内に接続が再確立された場合、すべてのロックおよび開いているトランザクションが中断前の状態にリストアされます。

  • 中断が長くなると、データ・サーバは接続をリセットします。このため、中断が終了したときに回復できなくなります。

    [トラブル状態の時間間隔] 内に接続が再確立されない場合、データ・サーバは接続を一方的にリセットします。これにより、トランザクションをロールバックして、応答しないアプリケーション・サーバからのロックを解放できるようになり、機能しているアプリケーション・サーバがブロックされなくなります。接続が回復した場合、アプリケーション・サーバの側からすると接続が無効になります。中断された接続でデータ・サーバを待機しているすべてのプロセスは、<NETWORK> エラーを受け取り、rollback-only 条件になります。アプリケーション・サーバによって受信された次の要求では、データ・サーバへの新しい接続が確立されます。

  • 中断が非常に長い場合は、アプリケーション・サーバも接続をリセットします。

    アプリケーション・サーバの長い Time to wait for recovery タイムアウト期間 (既定は 20 分) 内に接続が再確立されない場合、アプリケーション・サーバは一方的に接続をリセットします。中断された接続でデータ・サーバを待機しているすべてのプロセスは、<NETWORK> エラーを受け取り、rollback-only 条件になります。アプリケーション・サーバによって受信された次の要求では、データ・サーバへの新しい接続が確立されます (可能な場合)。

ECP タイムアウト設定を、以下の表に示します。各項目は、管理ポータルの [システム][構成][ECP設定] ページ、または構成パラメータ・ファイル (CPF) の ECP セクションで構成できます (詳細は、"構成パラメータ・ファイル・リファレンス" の "ECP" を参照)。

ECP のタイムアウト値
管理ポータルの設定 CPF 設定 既定値 範囲  
再接続までの時間 ClientReconnectInterval 5 秒 1 ~ 60 秒 アプリケーションがデータ・サーバに再接続しようとする間隔。
トラブル状態の時間間隔 ServerTroubleDuration 60 秒 20 ~ 65535 秒 中断された接続をリセットする前に、データ・サーバがアプリケーション・サーバからの通信を待機する時間。
リカバリまでの待機時間 ClientReconnectDuration 1200 秒 (20分) 10 ~ 65535 秒 中断された接続をリセットする前に、アプリケーション・サーバがデータ・サーバへの再接続の試行を続ける時間。

既定値は、以下を実現することを目的としています。

  • アプリケーション・サーバが使用可能になるのを待機することによって、他のアプリケーション・サーバで使用できるデータ・サーバ・リソースを長時間拘束しないようにする。

  • データ・サーバが利用できないときに他に何もすることがないアプリケーション・サーバに、頻繁に再接続を試みることにより、長時間の接続中断を待つ機能を提供する。

ECP は、TCP の物理接続を利用して、容量をあまり使用せずに、相手側のインスタンスの正常性を検出します。ほとんどのプラットフォームで、システム・レベルで TCP 接続障害および検知動作を調整できます。

アプリケーション・サーバの接続が非アクティブになると、データ・サーバは、その接続で新しい要求が到着するのを待機するか、またはアプリケーション・サーバによって新しい接続が要求されるのを待機しながら、アクティブなデーモンを維持します。既存の接続から要求が着信した場合、リカバリすることなく、すぐに処理が再開されます。基本のハートビート・メカニズムが、システムまたはネットワークの障害のためにアプリケーション・サーバが完全に利用不可であることを示す場合、基本の TCP 接続は迅速にリセットされます。したがって、アプリケーション・サーバから長時間応答がないことは、一般に、アプリケーション・サーバの機能を停止させるがその接続を妨げることのない、何らかの問題を示します。

基本の TCP 接続がリセットされた場合、データ・サーバはその接続を “再接続の待機” 状態にします。この状態では、データ・サーバ側にアクティブな ECP デーモンは存在しません。アプリケーション・サーバから新しい接続が要求されたときに、1 対のデータ・サーバ・デーモンが作成されます。

この非応答状態と再接続の待機状態を総称して、データ・サーバの障害状態と呼びます。どちらの状態でも必要なリカバリは、ほとんど同じです。

データ・サーバで障害またはシャットダウンが発生した場合、サーバはクラッシュやシャットダウン時点でアクティブであった接続を記憶しています。再起動後、データ・サーバは短時間 (通常は 30 秒) の間、中断した接続を再接続の待機状態に置きます。その状態の間に、アプリケーション・サーバとデータ・サーバは連携して、データ・サーバがシャットダウンした時点以降のすべてのトランザクションとロック、および未実行の Set および Kill トランザクションを回復します。

ECP 構成インスタンスのリカバリ中、InterSystems IRIS は多数のリカバリ・メカニズムを保証し、またこれらの保証に対する制限を指定します。"ECP リカバリ・プロセス、保証、および制限" では、これらの詳細と、リカバリ・プロセスの詳細について説明しています。

切断の強制

既定では、ECP は、アプリケーション・サーバとデータ・サーバ間の接続を自動的に管理します。ECP 構成インスタンスが起動した時点では、アプリケーション・サーバとデータ・サーバ間のすべての接続は、未接続 (接続が定義済みでも、確立されていない) 状態になります。アプリケーション・サーバが、データ・サーバへの接続を必要とする (データやコードに対する) 要求を行うと、その接続は自動的に確立され、接続状態は正常に変更されます。アプリケーション・サーバとデータ・サーバ間のネットワーク接続は、その後、接続された状態を維持します。

アプリケーションの中には、ECP 接続を切断する必要があるものものあります。例えば、アプリケーション・サーバとして構成されたシステムがあるとします。このシステムは、データ・サーバ・システムに格納されたデータを定期的に (1 日に数回) フェッチする必要がありますが、その後は、データ・サーバとのネットワーク接続をオープンにしておく必要がありません。この場合、アプリケーション・サーバ・システムは、SYS.ECP.ChangeToNotConnected()Opens in a new tab メソッドを呼び出し、ECP 接続状態を強制的に未接続にします。

以下に例を示します。

 Do OperationThatUsesECP()
 Do SYS.ECP.ChangeToNotConnected("ConnectionName")

ChangeToNotConnected メソッドは、以下を実行します。

  1. 変更したデータをデータ・サーバに送信し、データ・サーバからの確認応答を待機します。

  2. アプリケーション・サーバがオープンしたデータ・サーバ上のロックを削除します。

  3. データ・サーバ側のオープンしているすべてのトランザクションをロールバックします。アプリケーション・サーバ側のトランザクションは、“rollback only” 状態になります。

  4. 未実行の要求を NETWORK エラーで完了します。

  5. キャッシュされているすべてのブロックをフラッシュします。

状態が未接続に変更された後、次にデータ・サーバにデータが要求されると、接続は自動的に再確立されます。

Note:

管理ポータルからのデータ・サーバ接続ステータスの変更については、"データ・サーバ接続" を参照してください。

パフォーマンスとプログラミングに関する考慮点

分散キャッシュ・クラスタ・ベースのアプリケーションの高性能性および高信頼性を実現するには、以下の問題を認識する必要があります。

複数の ECP チャネルを使用しない

帯域幅を増やすためにアプリケーション・サーバとデータ・サーバとの間に複数の重複した ECP チャネルを確立しないでください。1 つの論理トランザクションに対するロックや更新がデータ・サーバ上で非同期になり、データが不整合になるリスクがあります。

ECP 制御構造用のデータ・サーバ・データベース・キャッシュの増大

ECP 経由で提供されるブロックをバッファリングする処理に加え、データ・サーバでは、さまざまな ECP 制御構造を格納するのにグローバル・バッファを使用します。この構造に必要なメモリ量を決定する要素はいくつかありますが、最も重要なものは、クライアントのキャッシュの集約サイズの関数です。要求サイズを概算するために、必要に応じてデータ・サーバのデータベース・キャッシュを調整できます。以下のガイドラインを使用してください。

データベースのブロック・サイズ 推奨事項
8 KB 50 MB にアプリケーション・サーバのすべての 8 KB データベース・キャッシュのサイズの合計の 1% を加えたサイズ
16 KB (有効化されている場合) アプリケーション・サーバのすべての 16 KB データベース・キャッシュのサイズの合計の 0.5%
32 KB (有効化されている場合) アプリケーション・サーバのすべての 32 KB データベース・キャッシュのサイズの合計の 0.25%
64 KB (有効化されている場合) アプリケーション・サーバのすべての 64 KB データベース・キャッシュのサイズの合計の 0.125%

例えば、既定の 8 KB のブロック・サイズに加えて 16 KB のブロック・サイズが有効になっていて、6 つのアプリケーション・サーバがあり、それぞれに 2 GB の 8 KB データベース・キャッシュおよび 4 GB の 16 KB データベース・キャッシュがある場合、データ・サーバの 8 KB データベース・キャッシュを調整して制御構造用に 52 MB (50MB + [12 GB * .01]) を使用できるようにし、16 KB キャッシュを調整して制御構造用に 2 MB (24 GB * .005) を使用できるようにする必要があります (どちらの場合も小数点以下は切り上げます)。

データベース・キャッシュの割り当てに関する詳細は、"メモリと開始設定" を参照してください。

負荷分散のユーザ要求の影響の評価

ラウンドロビンまたは負荷分散方式でユーザをアプリケーション・サーバに接続すると、アプリケーション・サーバ上でキャッシュから得られる利点が減る可能性があります。ユーザが機能グループに属しており、機能グループで同一のデータを読み取る必要がある場合は、特にこれに該当します。これらのユーザは、複数のアプリケーション・サーバに分散しているため、各アプリケーション・サーバが、データ・サーバに同一のデータを要求する可能性があり、それによって、同じデータに対して複数のキャッシュを使用して分散キャッシュの効率を低下させるだけでなく、ブロックの無効化が増加する可能性もあります。ブロックは、1 つのアプリケーション・サーバで変更されると、他のアプリケーション・サーバでも更新されるためです。これはいくらか主観的ですが、アプリケーションの特性に詳しい人がこの可能性について検討する必要があります。ロード・バランサを構成する場合は、"負荷分散、フェイルオーバー、ミラー構成Opens in a new tab" を参照して、複数のアプリケーション・サーバにわたってアプリケーション接続を分散する Web サーバ層の負荷分散に関する重要な説明を確認してください。

トランザクションを単一のデータ・サーバに制限する

単一トランザクション内の更新を、単一のリモート・データ・サーバまたはローカル・サーバに制限します。トランザクションに複数のサーバ (ローカル・サーバを含む) に対する更新が含まれており、TCommit が正常に完了できないと、トランザクションに含まれるサーバによっては、更新をコミットしたものと、ロールバックしたものがある場合があります。詳細は、"コミットの保証" を参照してください。

Note:

IRISTEMP に対する更新は、ロールバックを目的とするトランザクションの一部とは見なされないため、この制限には含まれません。

アプリケーション・サーバでの一時グローバルの配置

一時 (スクラッチ) グローバルは、グローバルに共有する必要があるデータを含まない場合、アプリケーション・サーバのローカルに配置する必要があります。多くの場合、一時グローバルは、とてもアクティブで、書き込みが集中します。一時グローバルがデータ・サーバ上に配置されていると、これによって ECP 接続を共有する他のアプリケーション・サーバに不利となります。

未定義のグローバルに対する繰り返し参照の回避

未定義のグローバル (例えば、^x が未定義の $Data(^x(1)) など) が繰り返し参照される場合、グローバルがデータ・サーバで定義されているかどうかをテストするネットワーク処理が常に起こります。

それとは対照的に、定義されたグローバル内の未定義のノード (例えば、^x の他のノードが定義済みの $Data(^x(1)) など) が繰り返し参照される場合、グローバル (^x) がアプリケーション・サーバ・キャッシュに格納されると、ネットワーク処理は要求されません。

この動作は、ネットワークに接続されていないアプリケーションの場合と大きく異なります。ローカル・データでは、未定義のグローバルに対する参照の繰り返しは、最適化され、不要な作業は排除されます。アプリケーションをネットワーク環境に移植する設計者の場合、グローバルの使用が定義されていたり、定義されていなかったりするため、確認が必要になる場合があります。通常は、グローバルの他の特定のノードが常に定義されていることを確認するだけで十分です。

ストリーム・フィールドの使用の回避

ストリーム・フィールドOpens in a new tabがクエリにあると読み込みロックが発生し、データ・サーバへの接続が必要になります。このことから、このようなクエリではデータベース・キャッシュの利点が得られず、2 回目以降の実行でもパフォーマンスが向上しません。

アプリケーション・カウンタでの $Increment 関数の使用

オンライン・トランザクション処理システムの共通の動作は、レコード番号などに使用する一意の値を生成することです。これは、一般的なリレーショナル・アプリケーションで、“次に使用可能な” カウンタ値を含むテーブルを定義して行います。アプリケーションに新規の識別子が必要な場合、カウンタを含む列をロックし、カウンタ値をインクリメントし、ロックを解放します。これは、シングル・サーバ・システムであっても並行処理障害を引き起こします。つまり、アプリケーション・プロセスは、共通カウンタ上のロックが解放されるのを、より長時間待機するようになります。ネットワーク環境では、これはある時点でさらに障害となります。

InterSystems IRIS は、アプリケーション・レベルのロックを一切必要とせずに、(グローバルに格納される) カウンタ値を自動的にインクリメントする $Increment 関数を提供することでこれに対処します。$Increment の並行処理は、InterSystems IRIS データベース・エンジンと ECP の両方に組み込まれており、シングル・サーバや分散アプリケーションで使用した場合に非常に高い効率性が実現されます。

InterSystems IRIS オブジェクト (あるいは SQL) から提供される既定構造を使用して構築されたアプリケーションは、$Increment を自動的に使用して、オブジェクト識別子の値を割り当てます。$Increment は、ECP 上で実行された場合のジャーナル同期に関わる同期処理です。このため、ECP 上での $Increment は比較的低速の処理となり、とりわけ他の比較対象が (アプリケーション・サーバ・データベース・キャッシュまたはデータ・サーバ・データベース・キャッシュのいずれかに) キャッシュ済みのデータを持っているかどうかにより違いが出ます。この影響は、フェイルオーバー・メンバ間のネットワーク遅延により、ミラーリング環境においてさらに大きくなります。このため、アプリケーションを再設計して $Increment$Sequence 関数に置き換えると便利な場合があります。こうすると、新しい値のバッチは各アプリケーション・サーバ上で各プロセスに自動的に割り当てられ、データ・サーバは新規に値のバッチが必要になった場合にのみ処理に参加します(ただし、連続したアプリケーション・カウンタ値が必要な場合、この手法は使用できません。)$Sequence$Increment と組み合わせて使用することもできます。

ECP 関連エラー

ECP を使用するシステムには、いくつかの実行時エラーがあります。ECP 関連のエラーは、コマンドの実行直後に発生する場合があります。あるいは、Kill のように、事実上非同期のコマンドの場合、エラーはコマンドの完了後すぐに発生します。

<NETWORK> エラー

<NETWORK> エラーは、通常の ECP リカバリ・メカニズムで処理できなかったエラーを示します。

アプリケーション内で <NETWORK> エラーを受け取った場合は常に、プロセスの停止や未実行処理のロールバックが可能です。<NETWORK> エラーの中には、本質的に致命的なエラー状態になるものもあります。すぐに解決する一時的な状態を示すものもあります。しかし、理想的なプログラミング手法とは、<NETWORK> エラーの発生時、未実行処理をロールバックし、現在のトランザクションを最初から開始することです。

$Data$Order など get 型要求の <NETWORK> エラーは、即座にトランザクションをロールバックするのではなく、手動で再試行できます。ECP は、データを損失する <NETWORK> エラーの発生を避けようとしますが、読み取り専用の要求に多くのエラーを生じます。

Rollback Only 条件

アプリケーション側の rollback-only 条件は、アプリケーション・サーバによって開始されたトランザクション中にデータ・サーバがネットワーク障害を検出したときに発生し、トランザクションがロールバックされるまですべてのネットワーク要求でエラーが発生した状態になります。

ECP リカバリ・プロセス、保証、および制限

ECP リカバリ・プロトコルは、"ECP リカバリ・プロトコル" に要約されています。ここでは、保証制限を含めて、ECP リカバリについて詳しく説明します。

ECP リカバリの簡単な例は、一時的なネットワーク接続の中断が発生した場合です。この場合の中断時間は、その発生を検知できるほどには長いが、基本の TCP 接続を維持するうえでは問題ない程度に短いと考えます。この障害が発生している間、アプリケーション・サーバは、接続が応答しないことを検知するため、その接続に対する新しいネットワーク要求をブロックします。接続が再開すると、ブロックされていた処理は中断していた要求を送信できるようになります。

基本の TCP 接続がリセットされた場合、データ・サーバは、[トラブル状態の時間間隔] 設定 (既定は 1 分) の時間だけ再接続を待ちます。アプリケーション・サーバがこの間隔の間に再接続を成功しないと、データ・サーバは接続をリセットし、開いているトランザクションをロールバックし、ロックを解放します。そのアプリケーション・サーバからの後続の接続は新規の接続要求に変換され、アプリケーション・サーバはその接続がリセットされたことを通知されます。

アプリケーション・サーバは、接続が再確立されると、削除するロックのキューとロールバックするトランザクションを保持します。このキューを保持することにより、中断中のトランザクションやロックがあるデータ・サーバが現在利用可能かどうかにかかわらず、アプリケーション・サーバのプロセスはいつでも停止できます。ECP リカバリでは、データ・サーバのキューに入れられた中断中の Set 処理と Kill 処理をすべて完了してから、ネットワーク障害が検出され、ロックの解放が完了します。

アプリケーション・サーバが接続をリセット (アプリケーション・サーバの再起動などが理由) したことをデータ・サーバが認識するたびに、データ・サーバは、まだ [トラブル状態の時間間隔] 内でも即時に接続をリセットし、トランザクションをロールバックし、アプリケーション・サーバの代わりにロックを解放します。アプリケーション・サーバの状態がリセットされるため、代わりにデータ・サーバによって維持される状態はなくなります。

最後の例は、データ・サーバが無理なく、またはクラッシュの結果として停止した場合です。アプリケーション・サーバは、アプリケーションの状態を維持し、[リカバリまでの待機時間] 設定 (既定は 20 分) の時間だけデータ・サーバに再接続しようとします。データ・サーバは、クラッシュやシャットダウン時点でアクティブであったアプリケーション・サーバ接続を記憶しています。再起動後、それらのアプリケーション・サーバが再接続され、接続を回復するのを最長で 30 秒待機します。リカバリには、データ・サーバでいくつかの手順が必要です。この手順の中には、非常に重要な方法としてデータ・サーバのジャーナル・ファイルを必要とするものもあります。いくつかの異なる手順の結果は以下のようになります。

  • 各アプリケーション・サーバから見た、現在有効なトランザクションのデータ・サーバのビューは、データ・サーバのジャーナル・ファイルからリストアされています。

  • 各アプリケーション・サーバから見た、現在有効な Lock オペレーションのデータ・サーバのビューは、アプリケーション・サーバがそれらのロックをデータ・サーバにアップロードすることによってリストアされています。

  • アプリケーション・サーバとデータ・サーバは、アプリケーション・サーバからのどの要求を無視し (クラッシュ前に完了したことが確実であるため)、どの要求を再生するかを正確に一致させます。リカバリの最終手順は、単純に中断中のネットワーク要求を完了させることです。ただし、再生しても安全なネットワーク要求のみに限られます。

  • 最後に、アプリケーション・サーバはデータ・サーバに、データ・サーバの再起動中に停止したジョブから保存したすべての中断中のアンロックまたはロールバック指示を送ります。ストレージ・デバイス (データベースの場合、WIJ ファイルとジャーナル・ファイル) の整合性が保持されている限り、突然の予期しないデータ・サーバ・クラッシュに直面しても、すべての保証は維持されます。

ECP 構成システムのリカバリ中、InterSystems IRIS は、"ECP リカバリ保証" で詳細に説明されている多数のリカバリ・メカニズムを保証します。これらの保証に対する制限の詳細は、前述の付録の "ECP リカバリの制限" セクションで説明されています。

ECP リカバリ保証

ECP 構成システムのリカバリ中、InterSystems IRIS は以下のリカバリを保証します。

各保証についての説明では、最初に具体的な状況を説明します。その後に、その状況に適用できるデータ保証について説明します。

これらの説明では、Process A、Process B などは、データ・サーバでグローバルを更新しようとするプロセスを参照します。これらのプロセスは、同じアプリケーション・サーバまたは異なるアプリケーション・サーバ、あるいはデータ・サーバ自体で生成される可能性があります。プロセスの起源が指定される場合もあれば、関係しない場合もあります。

更新順の保証

Process A が 2 つのデータ要素を続けて更新したとします。最初にグローバル ^x を、次にグローバル ^y を更新します。このとき、^x^y は、同じデータ・サーバにあります。

Process B^y への変更を確認できる場合、^x への変更も確認できます。これは、Process AProcess B が同じアプリケーション・サーバ上にあるかどうかにかかわらず、2 つのデータ・アイテムが同じデータ・サーバにあり、データ・サーバが起動している限り保証されます。

Process BProcess A によって変更されたデータを表示できるからといって、Process A からの Set オペレーションの後に、Process B からの Set オペレーションがリストアされることが保証されるわけではありません。クラスタのフェイルオーバー時またはクラスタのリカバリ時に 2 つの異なるプロセスからの SetKill オペレーションが競合する場合、適切な順序を保証できるのは、Lock または $Increment オペレーションのみです。

クラスタのデジャーナル時とクラスタのフェイルオーバー時に異なるプロセスからの SetKill オペレーションが競合している場合に適用される順序については、"クラスタのフェイルオーバー時やリストア時の緩やかな順序" の制限を参照してください。

Important:

この保証は、データ・サーバがクラッシュした場合、^x^y がジャーナルされている場合でも、適用されません。この説明に該当するプロセスで、データ・サーバがクラッシュする以前に保存されなかったダーティ・データが読み取れるケースについては、"ECP でのロックしないダーティ・データの読み取り" 制限を参照してください。

ECP ロックの保証

Process B (DataServer S 上) が、Process A によってロックされたことがあるグローバル ^x のロックを取得したとします。

Process B は、(^x へのロックを保持している間) Process A によって行われたすべての更新を DataServer S で表示できますまた、Process C が、(^x へのロックを保持している間) Process B によって行われた更新をDataServer S で表示した場合、Process C は、(^x へのロックを保持している間) Process A によって行われた更新も DataServer S で表示することが保証されます。

このシリアル化機能は、Process AProcess BProcess C が同じアプリケーション・サーバ、または DataServer S 自体に属するかどうかにかかわらず、DataServer S がその間常に起動している限り保証されます。

Important:

保護されるロックとデータは、同じデータ・サーバ上にある必要があります。

クラスタ・ロックの保証

クラスタ・メンバの Process B が、Process A によってロックされたことがあるクラスタ・データベースのグローバル ^x へのロックを取得したとします。

この場合、Process B は、(^x へのロックを取得している間、) Process A によっていずれかのクラスタ・データベースに行われたすべての更新を表示できます。

また、クラスタ・メンバの Process C が、(^x へのロックを取得した場合、) Process B によってクラスタ・データベースに行われた更新を表示できるだけでなく、Process C は、(^x へのロックを保持した状態で、) Process A によっていずれかのクラスタ・データベースに行われた更新も表示できます。

このシリアル化機能は、Process AProcess BProcess C が同じクラスタ・メンバに属すかどうか、またはクラスタ・メンバがクラッシュしているかどうかにかかわらず保証されます。

Important:

あるクラスタ・メンバのトランザクションが、クラッシュしたクラスタ・メンバのトランザクションから、ダーティ・データを表示するケースについては、"クラスタ・メンバのクラッシュ時のダーティ・データの読み取り" の制限を参照してください。

ロールバックの保証

Process A が、一連の更新の後に、TStart コマンドを実行してから、TCommit を発行する前に中断したか、TCommit を実行する前に TRollback を実行したとします。

Process A により、トランザクションの一部として行われた更新はすべて、最初とは逆の順序でロールバックされます。

コミットの保証

Process ADataServer S で一連の更新を行い、TCommit の実行を開始した後に中断したとします。

トランザクションに含まれる DataServer S それぞれで、DataServer S でのデータの変更がコミットまたはロールバックされます。TCommit を実行するプロセスの Perform Synchronous Commit プロパティがオンになっている場合に (構成ファイル内で SynchCommit=1 に設定)、TCommit オペレーションから正常に値が返されると、そのトランザクションは、トランザクションの一部であるすべてのデータ・サーバで確実にコミットされたことが保証されます。

Important:

トランザクションに複数のサーバ (ローカル・サーバを含む) に対する更新が含まれており、TCommit が正常に完了できないと、トランザクションに含まれるサーバによっては、更新をコミットしたものと、ロールバックしたものがある場合があります。

トランザクションとロックの保証

Process A では Transaction T のために TStart を実行し、DataServer S でグローバル ^x をロックした後、^x をロック解除します (ロック解除しても、“即時アンロック” ロック・タイプは指定されません)。

InterSystems IRIS では、^x へのロックは、トランザクションがコミットされるかロールバックされるまで解除されないことが保証されます。Transaction TDataServer S でコミットするか、ロールバックするまで、他のプロセスは、^x へのロックを取得できません。

Transaction TDataServer S でコミットすると、Process B では、^x へのロックを取得し、Transaction T の間に、Process A によって DataServer S に行われた変更が表示されます。また、他のプロセスが、(^x へのロックを保持している間) Process B によって DataServer S に行われた変更を表示した場合、(Transaction T 実行中に) Process A によって DataServer S に行われた変更が表示されます。逆に、Transaction TDataServer S でロールバックした場合、^x へのロックを取得した Process B が、Process A によって DataServer S に行われた変更を表示しようとしても、何も表示されません。

Important:

詳細は、"非ロック状態の変更により競合が発生した場合のロールバック" を参照してください。

ECP Rollback Only の保証

Process A (AppServer C 上) が、Transaction T の一部である変更を DataServer S で行い、DataServer S が一方的にその変更をロールバックします (これは、特定のネットワーク障害やデータ・サーバ障害で発生する場合がある)。

その後 Process A による DataServer S に対するネットワーク要求はすべて、Process A が明示的に TRollback コマンドを実行しない限り、<NETWORK> エラーによって拒否されます。

また、AppServer C のプロセスが、DataServer S のロールバックと Transaction TTCommit の間に、DataServer S へのネットワーク要求を完了した場合 (AppServer CTCommit の前に rollback-only 条件を検出した場合)、Transaction T には、Transaction T の一部であるすべてのデータ・サーバにロールバックが行われることが保証されます

ECP トランザクション・リカバリの保証

データ・サーバが、アプリケーション・サーバのトランザクションの途中でクラッシュし、その後再起動して、アプリケーション・サーバのリカバリ・タイムアウト時間内にリカバリを完了します。

この場合、トランザクションは、保証されているとおりに、正常に完了できます。データ・サーバは、ロック定義によって定義されている順番の制約に違反するようなデータ処理は実行しません。唯一の例外は、$Increment 関数です (詳細は、"ECP とクラスタの $Increment 制限" を参照してください)。リカバリできないトランザクションは、ロック定義を保護するようにロールバックされます。

Important:

(ネットワーク、データ・サーバ、アプリケーション・サーバのハードウェアやソフトウェアなどで) 障害が継続して発生していない場合、InterSystems IRIS では、データ・サーバ停止時にデータ・サーバで未実行のすべてのあるいは大半のトランザクションは復元できるはずです。しかし、これは保証されません。

ECP ロック・リカバリの保証

DataServer S に計画外のシャットダウンが発生したため、再起動して、リカバリ時間内にリカバリを完了しました。

この場合、ECP ロックの保証は、変更されたデータがジャーナルされている限り適用されます。データがジャーナルされていない場合、クラッシュの前のデータ・サーバに対する更新は、アプリケーション・サーバに通知されることなく、失われます。InterSystems IRIS では、ロックを取得したプロセスが、そのロックを保持している間に、他のプロセスによって以前に行われたすべての更新を表示できることは保証されません。

DataServer S を正しくシャットダウンし、再起動し、リカバリ時間内にリカバリを完了した場合は、データがジャーナルされているかどうかにかかわらず、ECP ロックの保証は適用されます。

トランザクションの一部である更新は、常にジャーナルされ、ECP トランザクション・リカバリの保証は確実に適用されます。他のジャーナルは、目的のデータベース内のグローバルがジャーナリングとマークされているかどうかによって、ジャーナルされる場合とされない場合があります。

$Increment 順序の保証

$Increment 関数には、異なるプロセスからの SetKill オペレーションがロックで保護されていなくても、それらの一連のオペレーションに対する緩やかな順序があります。

例えば、Process A が、DataServer S で、SetKill オペレーションを実行し、DataServer S でグローバル ^x$Increment オペレーションを実行します。Process B は、その後に、同じグローバル ^x$Increment を実行します。Process B を含むどのプロセスからでも、^x をインクリメントした Process B の結果を表示する場合、^x をインクリメントする前に Process ADataServer S に実行したすべての変更も表示されます。

Important:

詳細は、"ECP とクラスタの $Increment 制限" のセクションを参照してください。

ECP Sync メソッドの保証

プロセス A は、データ・サーバ S にあるグローバルを更新し、$system.ECP.Sync() 呼び出しを S に対して発行します。続いて、プロセス B は $system.ECP.Sync() を S に対して発行します。プロセス B は、$system.ECP.Sync() 呼び出しの前に、プロセス A がデータ・サーバ S で実行したすべての更新を表示できます。

$system.ECP.Sync() は、アプリケーション・サーバで実行しているプロセスにのみ関係があります。プロセス A または B のいずれかがデータ・サーバ S 自体で実行している場合、そのプロセスは $system.ECP.Sync() を発行する必要はありません。両方のプロセスがデータ・サーバ S で実行している場合、どちらも $system.ECP.Sync を必要としません。これは、同じサーバで実行しているプロセスがグローバル更新を直ちに見ることができることを示す文に過ぎません。

Important:

$system.ECP.Sync() は持続性を保証しません。"ECP でのロックしないダーティ・データの読み取り" の制限を参照してください。

ECP リカバリの制限

ECP 構成システムのリカバリ中、InterSystems IRIS の保証には以下の制限があります。

ECP とクラスタの $Increment 制限

データ・サーバに対する未実行 $Increment 要求がアプリケーション・サーバにあり、グローバルがジャーナリングされたとき、データ・サーバがクラッシュすると、InterSystems IRIS は、$Increment 結果をジャーナルから回復しようとし、参照を再びインクリメントしません。

ECP Cache の最新性の制限

障害が継続して発生していない場合は、アプリケーション・サーバは数秒以内にデータの更新を参照できますが、これは保証されていません。特に、ECP のデータ・サーバとの接続が中断した場合 (ネットワーク障害、データ・サーバのシャットダウン、データ・サーバのバックアップ処理など)、ユーザ・プロセスはアプリケーション・サーバの接続タイムアウト値を限度に古いデータを参照する場合があります。データが古くないことを確認するには、Lock コマンドをデータ・フェッチ操作で使用するか、または $system.ECP.Sync を使用します。アプリケーション・サーバとデータ・サーバ間を往復するネットワーク要求によって、アプリケーション・サーバ ECP ネットワーク・キャッシュのコンテンツが更新されます。

ECP ルーチンの再検証の制限

アプリケーション・サーバがデータ・サーバからルーチンをダウンロードして、データ・サーバが (計画的または計画外に) 再起動されると、データ・サーバからダウンロードされたルーチンは編集済みであるかのようにマークされます。

また、データ・サーバとの接続にネットワーク障害 (アプリケーション・サーバかデータ・サーバのシャットダウン) が発生した場合も、データ・サーバからダウンロードされたルーチンは編集済みであるかのようにマークされます。この動作は、場合によっては、実体を伴わない <EDITED> エラーや <ERRTRAP> エラーが発生させることがあります。

非ロック状態の変更により競合が発生した場合のロールバック

InterSystems IRIS では、Lock コマンドはアドバイスに過ぎません。Process A が、グローバル ^y へのロックが保護された状態で、グローバル ^x を更新するトランザクションを開始し、別のプロセスが、^y へのロックが保護されていない状態で、^x を変更した場合、^x のロールバックは機能しません。

SetKill オペレーションのロールバックでは、データ・アイテムの現在の値がオペレーションによって設定された値である場合、その値は、オペレーションの前の値にリセットされます。現在の値が SetKill オペレーションによって設定された値とは異なる場合、現在の値は変更されません。

データ・アイテムが、ある時点でトランザクションの内部で変更され、別の時点でトランザクションの外部で、Lock コマンドで保護されずに変更されるような場合は、ロールバック機能は保証されません。ロールバックを有効にするには、データ・アイテムを変更する場合に必ずロックを使用する必要があります。

ジャーナルが中断した場合のロールバック

ロールバックは、ジャーナルの信頼性と完全性に依存しています。ジャーナルのデータが何かによって中断された場合、その中断した時点以降のロールバックは行えません。InterSystems IRIS では、このようなトランザクションのロールバックは暗黙的に無視されます。

ジャーナルの中断が発生する可能性がある場合は、InterSystems IRIS の動作中に ^JRNSTOP を実行した場合、InterSystems IRIS がシャットダウンした後や再起動する前に Write Image Journal (WIJ) ファイルを削除した場合、またはジャーナルのエラー時にシステムをフリーズするように設定されていないシステムで、ジャーナリング中に入出力エラーが発生した場合です。

ECP のリカバリ後に検出されないエラー

SetKill オペレーションが、データ・サーバで完了した後、エラーが発生したとします。データ・サーバはそのパケットの処理は完了していますが、アプリケーション・サーバ・システムに送信する前にクラッシュします。

この場合、ECP リカバリではそのパケットを再生しませんが、アプリケーション・サーバはそのエラーを検出していないため、アプリケーション・サーバは、データ・サーバ側の Set または Kill オペレーションを失います。

部分的 Set または Kill によるジャーナルの不一致

SetKill オペレーションを問題なくジャーナルできても、実際にデータベースを変更する前にエラーが発生するケースがあります。データのロールバックを定義する特別な方法があっても、それによって、トランザクションのロールバックが行われなくなることはありませんが、ジャーナルのリストア後のデータベースの状態は、リストア前のデータベースの状態と一致しなくなる場合があります。

クラスタのフェイルオーバーまたはリストア時の緩やかな順序

クラスタのデジャーナリングは緩やかに順序付けられます。異なるクラスタ・メンバのジャーナル・ファイルが同期化されるのは、ロック、$Increment、またはジャーナル・マーカー・イベントが発生した場合のみです。これは、クラスタ全体を停止してリストアする必要があるクラスタのフェイルオーバーやクラスタのクラッシュ後のデータベース状態に影響します。その場合、データベースは、クラッシュ前の状態と異なる状態にリストアされる場合があります。$Increment 順序の保証には、リストアされたデータベースがクラッシュ前の元の状態と異なる度合いに関する新たな制約があります。

Process BProcess A によって変更されたデータを表示できるからといって、Process A からの Set オペレーションの後に、Process B からの Set オペレーションがリストアされることが保証されるわけではありません。クラスタのフェイルオーバー時またはクラスタのリカバリ時に 2 つの異なるプロセスからの SetKill オペレーションが競合する場合、適切な順序を保証できるのは、Lock または $Increment オペレーションのみです。

クラスタ・メンバのクラッシュ時のダーティ・データの読み取り

クラスタ・メンバ Member ATransaction T1 で更新を完了し、そのトランザクションが非同期のトランザクション・コミット・モードでコミットされたとします。別のクラスタ Member BTransaction T2 が、Transaction T1 によって所有されていたロックを取得したとします。そして、Transaction T1 からのすべての情報がディスクに書き込まれる前に、クラスタ・メンバ Member A がクラッシュしたとします。

この場合、Transaction T1 は、クラスタ・フェイルオーバーの一部としてロールバックされます。しかし、Member BTransaction T2 では、ロック・プロトコルの規則に従って、Transaction T1 の情報を表示できたはずであるのに、後でクラスタ・フェイルオーバーの一部としてロールバックされています。また、Transaction T2Transaction T1 と同じデータ・アイテムが一部変更された場合、Transaction T1 のロールバックは、一部のトランザクション・データしかロールバックできないため、失敗する可能性があります。

これを回避する方法は、クラスタ・メンバ Member A のトランザクションを同期コミット・モードで行うことです。同期コミット・モードを使用した場合、Transaction T1 はロックが解除される前にディスクに保存され、アプリケーションが Transaction T1 が完全であることを認識すれば、ロールバックされることはありません。

ECP でのロックしないダーティ・データの読み取り

ECP トランザクションがロックしないでデータを読み取る場合、ディスクに保存されていないデータを読み取りますが、データ・サーバがクラッシュするとそのデータは失われる可能性があります。そのようなデータを読み取れるのは、他の ECP 接続やローカル・データ・サーバ・システム自体によって、データの場所が設定されている場合のみです。保存されていないデータが、その接続自体によって設定されている場合は表示できません。また、データを読み取るプロセスとデータを書き込むプロセスの両方にロックが使用されている場合、保存されていないデータを表示することはできません。ここでは、更新順の保証が適用されず、ロックを使用する以外に簡単に解決できる方法はありません。

非同期のエラーが TCommit で検出された場合のロールバック

データ・サーバ側のトランザクションが、データベースの更新中に、<FILEFULL> などの非同期のエラー状況に遭遇し、アプリケーション・サーバが TCommit 時までそのエラーを認識できなかった場合、トランザクションは自動的にデータ・サーバ側でロールバックされます。ただし、TCommit オペレーションは通常は非同期ですが、ロールバックは同期です。これは、アプリケーション・サーバ・プロセスがロックを解除するまでにアプリケーション・サーバに通知しておく必要があるブロックが、ロールバックによって変更されるためです。

データ・サーバとデータベースには問題はありませんが、アプリケーション・サーバ側では、ロックが別のプロセスに移った場合、アプリケーション・サーバはロールバックされようとするデータを一時的に参照する場合があります。しかし、アプリケーション・サーバでは、非同期エラーを発生させることを通常は行いません。

FeedbackOpens in a new tab