クラスタリングの有効化によるロードバランスとフェイルオーバーの実現

"ロードバランス" とはエンタープライズレベルの機能で、アプリケーションサーバーがクラスタ内にある複数のサーバーインスタンスへと自動的にリクエストを分散させることです。また、クラスタリングを使用すると、元のサーバーインスタンスが停止した場合でも、動作中の他のサーバーインスタンスへとアプリケーションサーバーがリクエストを転送できます。

ロードバランスとフェイルオーバーを実現するには、同じ ColdFusion アプリケーションおよび設定内容を複数のサーバーインスタンスにデプロイし、それらのインスタンスを 1 つのクラスタに追加します。各インスタンスとも、デプロイするアプリケーションおよび設定するリソース(データソース、Solr コレクション、マッピングなど)を同じにする必要があります。Web サーバーコネクタは負荷分散を自動的に管理し、いずれかのサーバーインスタンスが停止した場合は別のサーバーインスタンスにリクエストを転送することで、パフォーマンスと安定性を最適化します。

注意: クラスタが動作するには、ネットワークに接続されている必要があります。

最大限のフェイルオーバー保護を実現するには、1 つのクラスタ内で複数台のコンピュータを使用してください。ただし、使用するコンピュータごとに個別の ColdFusion エンタープライズ版ライセンスを購入する必要があります。

クラスタ内のサーバーインスタンスでセッションフェイルオーバーを実装するには、各サーバーインスタンスでセッションレプリケーションを有効化します。セッションレプリケーションは、クラスタ内のサーバーインスタンス間でセッション情報をリアルタイムに調整する機能です。セッションレプリケーションを有効にすると、現在のサーバーが使用不可能な場合に、動作中の他のサーバーへと Tomcat がリクエストを自動的に転送します。

注意: セッションレプリケーションを使用するクラスタの場合、セッションデータは、変化するたびにクラスタ内の他の各サーバーへとコピーされます。したがって、セッションスコープに大量の情報を格納していると、この動作のためにパフォーマンスが低下する可能性があります。セッションスコープに格納する情報が大量になると考えられる場合は、その情報をデータベース内のクライアント変数に格納することを検討してください。

ロードバランスとフェイルオーバーのための、サーバーインスタンスのクラスタの設定

ColdFusion Administrator を使用してクラスタを管理します。

  1. ColdFusion Administrator で、エンタープライズマネージャ/クラスタマネージャをクリックします。

  2. クラスタ名を入力して、「追加」をクリックします。

  3. クラスタ名をクリックして、要件に基づいてサーバーをクラスタに移動します。

  4. (必要に応じて)マルチキャストポートを編集します。

    マルチキャストポートは、クラスタメンバーをグループ化するために使用されます。 マルチキャストポートのデフォルト値は 45564 です。 クラスタを作成すると、cfroot¥cfusion¥config¥cluster.xml ファイルにポートが追加されます。

    マルチキャストポートについて詳しくは、http://tomcat.apache.org/tomcat-6.0-doc/config/cluster-membership.html を参照してください。

  5. スティッキーセッションが必要かどうかを指定します。

    スティッキーセッションでは、インスタンスにセッションが確立された後、そのクライアントからのそれ以降のすべてのリクエストが、そのインスタンスに必ずマッピングされるようになります。

  6. 「送信」をクリックします。

クラスタへのリモートインスタンスの追加

クラスタにリモートインスタンスを追加するには、リモートインスタンスの server.xml にクラスタブロックを追加します。 次に、リモートインスタンスを登録して、インスタンスをクラスタに追加します。 Tomcat でのクラスタ設定について詳しくは、http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.html を参照してください。

セッションレプリケーションを使用する場合は、[メモリ変数] ページに移動して J2EE セッションを有効化します。クラスタ内のすべてのサーバーインスタンスに対して J2EE を有効化してください。J2EE セッションが ColdFusion Administrator で有効になっていない場合、セッションレプリケーションは正しく機能しません。CFC のシリアル化により、クラスタで J2EE セッションレプリケーションを使用し、クラスタ内のすべてのインスタンスでセッションデータの CFC にアクセスできるようになります。セッションレプリケーションを有効にすると、セッションスコープ変数もクラスタ内で複製されます。ただし、セッションレプリケーションではセッションスコープの CFC または変数内の配列のレプリケーションはサポートされません。また、セッションフェイルオーバーの場合は CFC 内にデータを保持してアクセスすることもできます。セッションスコープ内に格納された ColdFusion 構造体は、フェイルオーバーの後でもセッションスコープで使用できます。例えば、複数の ColdFusion のインスタンスを実行してサーバーの負荷を分散させている場合、セッション内に有用なデータ(CFC を含む)を格納して、そのセッションで配信されるすべてのページでデータにアクセスすることができます。CFC のシリアル化を有効にするには、次のようにセッションで CFC を設定します。
<cfset cfccomponent = CreateObject("component", "CFIDE.adminapi.datasource")> 
<cfset session.datasourcecomponent = cfccomponent>
フェイルオーバーが発生したら、次のように CFC のメソッドにアクセスしてメソッドを呼び出すことができます。
<cfset check = session.datasourcecomponent.verifyDSN("testdsn")>
  1. リモートインスタンスをローカルマシンに登録します。

  2. ローカルマシンでクラスタを作成します。

  3. リモートインスタンスの cfroot¥instance-name¥runtime¥conf¥server.xml ファイルを開きます。

  4. </host> エントリと </engine> エントリの間に次のブロックを追加します。

     
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"         channelSendOptions="8"> 
        <Manager notifyListenersOnReplication="true" expireSessionsOnShutdown="false" className="org.apache.catalina.ha.session.DeltaManager"> 
        </Manager> 
        <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 
            <Membership port="45565" dropTime="3000" address="228.0.0.4"     className="org.apache.catalina.tribes.membership.McastService" frequency="500"> 
            </Membership> 
            <Receiver port="4003" autoBind="100" address="auto" selectorTimeout="5000"     maxThreads="6" className="org.apache.catalina.tribes.transport.nio.NioReceiver"> 
            </Receiver> 
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
                <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"> 
                </Transport> 
            </Sender> 
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"> 
            </Interceptor> 
            <Interceptor     className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"> 
            </Interceptor> 
        </Channel> 
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""> 
        </Valve> 
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"> 
        </Valve> 
     
        <ClusterListener     className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"> 
        </ClusterListener> 
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"> 
        </ClusterListener> 
     
    </Cluster> 
  5. エントリ内のメンバーシップポートをクラスタのマルチキャストポートで更新します。

  6. ローカルホストの ColdFusion Administrator を使用して、ローカルインスタンスとリモートインスタンスをクラスタに追加します。
    注意: スティッキーセッションを有効にする場合は、リモートインスタンスとローカルインスタンスの JVM ルートを同じにしないでください。
  7. すべてのインスタンスを再起動します。