Apache+Tomcatクラスタ構成+session共有


本明細書では、Apache+Tomcatクラスタ構成は、2011年4月20日に最新のTomcatおよびApacheクラスタおよび負荷等化構成に基づいている.
環境の準備
Apache
Apacheはhttpサーバであり,これを利用してTomcatの負荷等化を行っている.現在の最新バージョンは2.2.17で、ダウンロードアドレスはhttp://httpd.apache.org/download.cgi#apache22.次の図を示します.
 
Apache+Tomcat集群配置+session共享_第1张图片
現在Apache 2が現れている.3.11ですが、betaバージョンなので使用していません.
ダウンロード後にmsiを直接インストールすればいいですが、iisなどの他のhttpサーバがなければ正常にインストールできるはずです.ポートは80で、アクセスできます.http://localhost/インストールに成功したことを示します.
Tomcat
Tocmat 7は現在、7.0.12の安定版が登場しており、Tomcat 6は6.0.32である.私のテストでは、この2つのバージョンのApache負荷等化構成プロセスは同じであるため、次の構成はTomcat 6または7クラスタで共通しています.しかし、以下の構成によれば、クラスタ内のTomcatにはTomcat 6とTomcat 7があるわけではない.そうでなければ負荷等化は可能であるが、sessionレプリケーションはできず、他の構成のクラスタが可能かどうかは分からない.
Tomcatはあまり紹介する必要はありません.ローカルで複数のノードが必要である以上、ZIPバージョンのTomcatをダウンロードする必要があります.
JK
JKはTomcatがhttpサーバに提供するプラグイン(個人的に理解している)で、ダウンロードアドレスはhttp://mirror.bjtu.edu.cn/apache/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/.次の図を示します.
    
Apache+Tomcat集群配置+session共享_第2张图片
ここで選んだのはmod_jk-1.2.31-httpd-2.2.3.so,httpサーバがApache 2である場合.0.Xバージョンの場合はmod_を選択する必要がありますjk-1.2.31-httpd-2.0.52.so、ページの下に英語の説明がありますので、ご覧ください.
実は私もネットでApacheを見ました.2 Tomcatプラグインモジュールが統合されているので、JKプラグインを使わずにTomcatの負荷等化を実現できますが、いくつかの構成も必要ですが、JKという構成に比べて複雑ではないので、先に記録します.
構成プロセス
次は直接過程を書いて、私もネット上で勉強して、ただ過程を総括してそして最新のApacheとTomcatを利用してテストしただけで、やはりネット上と少し違います.
Apache構成の変更
1.httpd.conf
私のApacheはD:Program FilesApache Software FoundationApache 2にインストールされています.2 confディレクトリの下のhttpdを見つけます.conf、ファイルの最後の行に追加
include "D:\Program Files\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

2、新しいmod_jk.confファイル、内容は以下の通りです.
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so

JkWorkersFile conf/workers.properties

#        tomcat  ,"controller"  workers.propertise            

JkMount /*.jsp controller

3、ダウンロードするJKプラグインmod_jk-1.2.31-httpd-2.2.3.so Apacheインストールディレクトリのmodulesディレクトリにコピーします.
4、workersを新規作成して編集する.propertiesファイル、内容は以下の通りです.
#server 

worker.list = controller 

#========tomcat1======== 

worker.tomcat1.port=11009 

worker.tomcat1.host=localhost 

worker.tomcat1.type=ajp13 

worker.tomcat1.lbfactor = 1 

#========tomcat2======== 

worker.tomcat2.port=12009 

worker.tomcat2.host=localhost 

worker.tomcat2.type=ajp13 

worker.tomcat2.lbfactor = 1 

#========tomcat3======== 

worker.tomcat3.port=13009 

worker.tomcat3.host=192.168.0.80 //        ,       

worker.tomcat3.type=ajp13 

worker.tomcat3.lbfactor = 1 

 

#========controller,       ======== 

worker.controller.type=lb 

worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3 

worker.controller.sticky_session=false

worker.controller.sticky_session_force=1

#worker.controller.sticky_session=1

ここでは任意の複数のTomcatを構成することができ、ここでは3つのTomatサーバ、2つのローカル、1つのリモートを構成しているので、それらがスムーズに起動できるように、ローカルのサーバポートはすべて異なり、Tomcatが同じマシン上でなければ、ポートを変更する必要はありません.
Tomcatの設定
3つのTomcatサーバーを配置して、Tomcatを解凍して3部コピーして、私は各フォルダをそれぞれTomcat 1、Tomcat 2とTomcat 3と命名して、それぞれのserverを修正します.xml構成、Tomcat 1の修正部分を下図:Apache+Tomcat集群配置+session共享_第3张图片
Tomcat 2の上記の部分のserver.xmlは次のとおりです.
Apache+Tomcat集群配置+session共享_第4张图片
Tomcat 3の上記の部分のserver.xmlは次のとおりです.
Apache+Tomcat集群配置+session共享_第5张图片
Tomat 3はリモートサーバにあるのでポートを変更する必要はありませんが、私が先に行ったローカルクラスタテストの後、Tomcat 3をリモートサーバにコピーするので、この3つのTomcatポートは違います.
AJP 13のconnectorのpoatとjvmRouteの名前とworkers.propertiesで対応を構成します.
スクリーンショットの面積が限られているため、ローカルの2つのローカルTomcatがserverのportを構成することを保証する必要があり、connectorはhttp 1である.1のportはすべて異なっています.
テスト
テスト項目の作成
testプロジェクトを構築するには、プロジェクトのwebが必要です.xmlにを追加
test 2を作成する.jsp、内容は以下の通りです(ネット上でこのテストを使って、私は面倒を省きました):
<%@ page contentType="text/html; charset=GBK" %>

<%@ page import="java.util.*" %>

<html><head><title>Cluster App Test</title></head>

<body>

Server Info:

<%

out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>

<%

  out.println("<br> ID " + session.getId()+"<br>");

  //       Session     

  String dataName = request.getParameter("dataName");

  if (dataName != null && dataName.length() > 0) {

     String dataValue = request.getParameter("dataValue");

     session.setAttribute(dataName, dataValue);

  }

  out.println("<b>Session   </b><br>");

  System.out.println("============================");

  Enumeration e = session.getAttributeNames();

  while (e.hasMoreElements()) {

     String name = (String)e.nextElement();

     String value = session.getAttribute(name).toString();

     out.println( name + " = " + value+"<br>");

         System.out.println( name + " = " + value);

   }

%>

  <form action="test2.jsp" method="POST">

      :<input type=text size=20 name="dataName">

     <br>

     :<input type=text size=20 name="dataValue">

     <br>

    <input type=submit>

   </form>

</body>

</html>

Sessionテスト
プロジェクトを3つのサーバに配備し、Apacheと3つのTocmatサーバをそれぞれ起動します.これらのTomcatの起動順序は任意で、その後開きます.http://localhost/test/test2.jsp,
次のようになります.
Apache+Tomcat集群配置+session共享_第6张图片
F 5ページを更新し、それぞれ表示する:
Apache+Tomcat集群配置+session共享_第7张图片
Apache+Tomcat集群配置+session共享_第8张图片
 
ページを複数回リフレッシュしたセッションIDは同じIDとみなされ、セッションがコピーに成功したことを示します.ではsessionに格納されているものは、入力ボックスに1、1、2、2、3、3をそれぞれ入力すると、次のように表示されます.
Apache+Tomcat集群配置+session共享_第9张图片
 
Apache+Tomcat集群配置+session共享_第10张图片
Apache+Tomcat集群配置+session共享_第11张图片
 
 
 
以上のテストでは、クラスタ内のsessionが共有されており、各クラスタは同じアクセスに対して同じsessionを持ち、sessionに格納されている変数もコピーされています.
 
ノード挿抜テスト
スワップとは、実行中のクラスタ内のノードが閉じたり起動したりしたときに、クラスタが正常に動作し、ノードが正常に動作することを保証することを意味します.
テスト手順を説明します.マップが場所を占めすぎます.
Tomcat 2をオフにし、ページをリフレッシュすると、Tocmat 1とTomcat 3にアクセスし続け、Tomcat 1をオフにすると、ノードがオフになったときに正常に動作していることを示すTomcat 3が1つしかアクセスされません.
Tomcat 2を再起動し、どのようにリフレッシュしても常にTomcat 3にアクセスする場合、Apacheは途中で起動したTomcat 2にリクエストを転送できないのでしょうか...このとき別のマシンを利用してページにアクセスし、Tomcat 2が正常であることを発見し、ローカルページをブラシして、またTomcat 2にアクセスすることができます.
Apacheの負荷等化時のアルゴリズムは,新しく来たセッションごとにノード構成におけるlbfactor比重に応じてアクセスノードを選択し,あるノードnode 1がアクセスできない場合は次のアクセス可能ノードを探し,このnode 1をそのアクセスセッションのアクセスブラックリストに入れ,以降そのセッションのアクセスはnode 1を直接考慮せず,node 1がまたアクセスできても.新しく来たセッションはブラックリストがなく、新しいセッションがnode 1にアクセスできれば、node 1が他のすべてのセッションでアクセスしたブラックリストから削除され、他のセッションがnode 1ノードにアクセスできるようになります.以上は個人がテストした後の推測にすぎない.
以上のテストにより,Tomcatクラスタと負荷等化が実現されたことを示した.
 
クラスタについてはまだ疑問があるので、またテストして、直接結論を書きました.
1.サーバを構成する限り、クラスタの下で同じアプリケーションの名前が異なる(必要ないようだ)ことができる.xmlのhost下のcontextは同じpathでよい.
2.アプリケーション名が異なる場合、アプリケーションの内容が異なるかどうか(ここでは、クラスタを介して異なるアプリケーションが1つのアプリケーションとして表示され、セッションが共有されることを考慮する)、クラスタの下の異なるアプリケーションは同じアクセスpathにマッピングされ、同じパスを持つと負荷され、あるパスが1つのアプリケーションのみを持つ場合、そのアプリケーションにアクセスし続ける.しかし、現実は中堅ですね.答えは否定的で、少なくとも私以上の配置は実現できません.アプリケーションが持つ特別なパスのみにアクセスする場合は、アプリケーションにロードされている場合にのみアクセスできます.そうしないと、直接パスが見つからないエラーページにアクセスできます.
 
 
ネット上の他のApache+Tomcatのクラスタ構成を見たことがある場合、質問はありますか?
1.ネット上の大部分の文章は2つのtocmatのクラスタを配置して、あるのはworkers.义齿controller.sticky_セッション=1、tomcat 1のserver.xmlのjvmRouteをtomcat 2に、tomcat 2のjvmRouteをtocmat 1に、もちろん私はこのように設定しても成功しましたが、もし3つ以上のtocmatがあれば、どのようにして各tomcatのjvmRouteを設定するか、私はできないので今の構成を考慮します
2.server.xmlのCluster構成の問題は、ネット上のほとんどがBackupManager方式を使用しています.つまり、Clusterの下には構成が貼り付けられています.注記を削除したを削除するだけでセッションのクラスタコピーが完了します.ただ、この2つのレプリケーションは採用方法が異なるだけです.http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.htmlクラスタのsessionレプリケーションのデフォルトはDeltaManagerで、all to allのレプリケーションです.クラスタの次のtomcatアプリケーションのsessionをすべてのクラスタのノードにレプリケーションすることを意味します.そのノードがアプリケーションをパブリッシュしていなくても.明らかに悪い方法だが、これは小規模なクラスタの下では問題がない.BackupManagerを採用するのは、多くのネット上の構成のように、コピーするノードに対してBackupManagerを設定するのはもちろん問題ありませんが、その性能はDelta Managerが「Downside of the BackupManagement:not quite as battle tested as the delta manager」をうまく使うわけではありません.そのため、具体的にどのように設定するかは皆さん次第ですが、通常は大規模なクラスタでなければデフォルトで良いと言われています.