以下に示すシステム構成でTomcatクラスタを検証する。
本報告書の中では、ホスト名に関して以下に示す凡例を用いるものとする。
| 略号 | 内容 |
|---|---|
| WEB_HOST | Apacheを実行するホスト |
| AP_HOST1 | Tomcatを実行するホスト |
| AP_HOST2 | Tomcatを実行するホスト |
| AP_HOST3 | Tomcatを実行するホスト |
| DB_HOST | PostgreSQLを実行するホスト |
| JMETER_HOST | JMeterを実行するホスト |
| CLIENT_HOST | 検証用アプリケーションにアクセスするホスト |
本報告書の中では、ソフトウェアのインストール先ディレクトリに関して、以下に示す凡例を用いるものとする。
| 略号 | 内容 |
|---|---|
| WEB_DIR | Apacheのインストール先ディレクトリ /usr/local/apache2 |
| AP_DIR | Tomcatのインストール先ディレクトリ /usr/local/apache-tomcat-5.5.15 |
| DB_DIR | PostgreSQLのインストール先ディレクトリ /home/postgres/psql |
| JMETER_DIR | JMeterのインストール先ディレクトリ C:\jmeter |
| ANT_DIR | Apache Antのインストール先ディレクトリ /usr/java/apache-ant-1.6.5 |
| JDK_DIR | JDKのインストール先ディレクトリ /usr/java/jdk1.5.0_06 |
| JDK_WIN_DIR | Windows版JDKのインストール先ディレクトリ C:\jdk |
WEB_HOST、AP_HOST1〜3、DB_HOSTにMIRACLE LINUX V3.0をインストールする。インストール時は以下に示す各種設定を行う。
JMETER_HOST、CLIENT_HOSTはプレインストールのOS(Windows 2003 Server、Windows XP Professional)を使用した。
WEB_HOSTでのApache HTTP Serverのインストールと設定方法を以下に示す。
mod_jkのインストールと設定方法は、JakartaのWebサイトで公開されている手順(http://tomcat.apache.org/connectors-doc/を参考にした。
ビルドに必要な追加のパッケージをインストールする。パッケージ間には依存関係があるため下記に示す順番でMIRACLE LINUX V3.0のインストールCD-ROMから事前にインストールする。
| # mount /mnt/cdrom # cd /mnt/cdrom/Asianux/RPMS # rpm -ivh binutils-2.14.90.0.4-35.i386.rpm # rpm -ivh cpp-3.2.3-36.i386.rpm # rpm -ivh glibc-kernheaders-2.4-8.34.i386.rpm # rpm -ivh glibc-headers-2.3.2-95.20.1AX.i386.rpm # rpm -ivh glibc-devel-2.3.2-95.20.1AX.i386.rpm # rpm -ivh libgcc-3.2.3-36.i386.rpm # rpm -ivh gcc-3.2.3-36.i386.rpm # cd /mnt # umount /mnt/cdrom |
Apache-2.0.54をダウンロード(http://httpd.apache.org/download.cgi)し、WEB_HOST上の/usr/local/src以下に下記の手順でインストールする。
| # cd /usr/local/src # tar xzvf httpd-2.0.54.tar.gz # cd httpd-2.0.54 # ./configure # make # make install |
mod_jkには1.2系と2.0系があるが、2.0系は現在メンテナンスモードに入っており、新たな機能追加は行われていないため本報告では1.2系を用いた。mod_jk-1.2.15をダウンロード(http://jakarta.apache.org/tomcat/connectors-doc/)し、WEB_HOST上の/usr/local/src以下にインストールする。下記に手順を示す。
| # cd /usr/local/src # tar xzvf jakarta-tomcat-connectors-1.2.15-src.tar.gz # cd jakarta-tomcat-connectors-1.2.15-src/jk/native # ./configure --with-apxs=WEB_DIR/bin/apxs # make # cp ./apache-2.0/mod_jk.so WEB_DIR/modules/ |
WEB_HOSTのWEB_DIR/conf/httpd.confの最下行に下記の内容を追記する。
| Include conf/mod-jk.conf |
WEB_HOSTでWEB_DIR/conf/mod-jk.confを作成する。
| LoadModule jk_module modules/mod_jk.so JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkLogLevel info JkLogStampFormat "{%a %b %d %H:%M:%S %Y}" JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories JkRequestLogFormat "%w %V %T" JkMount /* loadbalancer JkShmFile logs/jk.shm |
WEB_HOSTでWEB_DIR/conf/workers.propertiesを作成する。
| worker.nodeA.port=8009 worker.nodeA.host=10.212.202.189 worker.nodeA.type=ajp13 worker.nodeA.ldfactor=1 worker.nodeB.port=8009 worker.nodeB.host=10.212.202.190 worker.nodeB.type=ajp13 worker.nodeB.ldfactor=1 worker.nodeC.port=8009 worker.nodeC.host=10.212.202.191 worker.nodeC.type=ajp13 worker.nodeC.ldfactor=1 worker.loadbalancer.type=lb worker.loadbalancer.balance_workers= nodeA,nodeB,nodeC worker.loadbalancer.sticky_session=1 worker.list=loadbalancer |
DB_HOST上でのPostgreSQLのインストールと設定方法を示す。
ビルドに必要な追加のパッケージをインストールする。パッケージ間には依存関係があるため下記に示す順番でMIRACLE LINUX V3.0のインストールCD-ROMから事前にインストールする。
| # mount /mnt/cdrom # cd /mnt/cdrom/Asianux/RPMS # rpm -ivh binutils-2.14.90.0.4-35.i386.rpm # rpm -ivh cpp-3.2.3-36.i386.rpm # rpm -ivh glibc-kernheaders-2.4-8.34.i386.rpm # rpm -ivh glibc-headers-2.3.2-95.20.1AX.i386.rpm # rpm -ivh glibc-devel-2.3.2-95.20.1AX.i386.rpm # rpm -ivh libgcc-3.2.3-36.i386.rpm # rpm -ivh gcc-3.2.3-36.i386.rpm # cd /mnt # umount /mnt/cdrom |
以降のPostgreSQLのインストール・設定は、PostgreSQL用ユーザpostgresで実施した。~/.bash_profileに以下のとおり環境変数を設定する。
| export POSTGRES_HOME=DB_DIR export PGLIB=$POSTGRES_HOME/lib export PGDATA=$POSTGRES_HOME/data export MANPATH=$MANPATH:$POSTGRES_HOME/man export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/local/lib:$PGLIB export PATH=$PATH:$POSTGRES_HOME/bin |
PostgreSQL-8.0.3をダウンロード(http://www.postgresql.org/ftp/source/v8.0.3/)する。
| $ tar xzvf postgresql-8.0.3.tar.gz $ cd postgresql-8.0.3 $ ./configure --without-readline --without-zlib --prefix=/home/postgres/pgsql $ make $ make check $ make install |
データベースクラスタを作成する。
| $ cd DB_DIR $ mkdir data $ initdb --no-locale --encoding=EUC_JP |
データベースクラスタ作成後、データベースクラスタ内に作成された以下のファイルを下記のとおり編集する。
| listen_addresses = '*' |
| # IPv4 local connections: host all all 0.0.0.0 0.0.0.0 trust |
PostgreSQLを起動する。
| $ pg_ctl start |
下記のコマンドを実行してユーザを追加する。
| $ createuser -W ossf Shall the new user be allowed to create databases? (y/n) y Shall the new user be allowed to create more new users? (y/n) n CREATE USER |
下記のコマンドを実行してユーザを追加する。
| $ createdb -U ossf ossfdb CREATE DATABASE |
データベースにテストデータを設定する。
| $ psql -U ossf ossfdb < clustercheck.sql |
AP_HOST1〜3でのJDKのインストールと設定方法を以下に示す。
jdk-1_5_0_06をダウンロード(http://java.sun.com/products/archive/index.html)する。
| # chmod a+x jdk-1_5_0_06-linux-i586-rpm.bin # ./jdk-1_5_0_06-linux-i586-rpm.binl |
AP_HOST1〜3の~/.bash_profileに以下の環境変数JAVA_HOME を設定する。
| export JAVA_HOME=/usr/java/jdk1.5.0_06 |
AP_HOST1〜3でのTomcatのインストールと設定方法を以下に示す。Tomcatの設定方法は、JakartaのWebサイト上で公開されている設定情報(http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.htmlを参考にした。
クラスタリングを行うために、AP_HOST1〜3のAP_DIR/conf/server.xmlにCluster要素を追加する。設定内容は各サーバ共通である。
<AP_HOST1〜3>|
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"managerClassName="org.apache.catalina.cluster.session.DeltaManager"> : </Cluster> |
クラスタリングのメンバシップを形成するために、AP_HOST1〜3のAP_DIR/conf/server.xmlのCluster定義領域内にMembership要素を追加する。設定内容は各サーバ共通である。
<AP_HOST1〜3>|
<Cluster ...> : <Membership className="org.apache.catalina.cluster.mcast.McastService" mcastAddr="228.0.0.4" mcastPort="45564" mcastFrequency="500" mcastDropTime="3000"/> : </Cluster> |
レプリケーションを行うために、AP_HOST1〜3のAP_DIR/conf/server.xml のCluster定義領域内にレプリケーション用のValve要素およびClusterListenerを追加する。設定内容は各サーバ共通である。
<AP_HOST1〜3>|
<Cluster ...> : <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"filter=".*\.gif;.*\.js;.*\.css;.*\.png;.*\.jpeg;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"primaryIndicator="true" /> <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener" /> : </Cluster> |
レプリケーションを行うために、AP_HOST1〜3のAP_DIR/conf/server.xml のCluster定義領域内にレプリケーション用のValve要素およびClusterListenerを追加する。設定内容は各サーバ共通である。
<AP_HOST1>|
<Cluster ...> : <Receiver className="org.apache.catalina.cluster.tcp.ReplicationListener" tcpListenAddress="192.168.1.2" tcpListenPort="4001" tcpSelectorTimeout="100" tcpThreadCount="2"/> : </Cluster> |
|
<Cluster ...> : <Receiver className="org.apache.catalina.cluster.tcp.ReplicationListener" tcpListenAddress="192.168.1.3" tcpListenPort="4001" tcpSelectorTimeout="100" tcpThreadCount="2"/> : </Cluster> |
|
<Cluster ...> : <Receiver className="org.apache.catalina.cluster.tcp.ReplicationListener" tcpListenAddress="192.168.1.4" tcpListenPort="4001" tcpSelectorTimeout="100" tcpThreadCount="2"/> : </Cluster> |
mod_jkを用いたフェイルオーバを行うために、AP_HOST1〜3のAP_DIR/conf/server.xmlにレプリケーション用のValve要素およびClusterListenerを追加する。設定内容は各サーバ共通である。
<AP_HOST1〜3>|
<Cluster ...> : <ValveclassName="org.apache.catalina.cluster.session.JvmRouteBinderValve" enabled="true" /> <ClusterListener className="org.apache.catalina.cluster.session.JvmRouteSessionIDBinderListener" /> : </Cluster> |
レプリケーション方式(ReplicationMode)は、AP_HOST1〜3のAP_DIR/conf/server.xmlのCluster定義領域内に次のとおり設定する。設定内容は各サーバ共通である。
「同期(synchronous)」の設定(waitForAck="true")|
<Cluster ...> : <SenderclassName="org.apache.catalina.cluster.tcp.ReplicationTransmitter"replicationMode="synchronous" waitForAck="true"/> : </Cluster> |
|
<Cluster ...> : <SenderclassName="org.apache.catalina.cluster.tcp.ReplicationTransmitter"replicationMode="asynchronous" waitForAck="true"/> : </Cluster> |
|
<Cluster ...> : <SenderclassName="org.apache.catalina.cluster.tcp.ReplicationTransmitter"replicationMode="pooled" waitForAck="true"/> : </Cluster> |
|
<Cluster ...> : <SenderclassName="org.apache.catalina.cluster.tcp.ReplicationTransmitter"replicationMode="fastasyncqueue" waitForAck="true"/> : </Cluster> |
mod_jkによる負荷分散を行うために、AP_HOST1〜3のAP_DIR/conf/server.xmlのEngine要素を修正する。jvmRoute属性の値はAP_HOST1〜3のノード名(node A、node B、node C)を設定する。
<AP_HOST1>| <Engine name="Standalone" defaultHost="localhost" jvmRoute="nodeA"> |
| <Engine name="Standalone" defaultHost="localhost" jvmRoute="nodeB"> |
| <Engine name="Standalone" defaultHost="localhost" jvmRoute="nodeC"> |
PostgreSQL用のJDBCドライバをダウンロード(http://jdbc.postgresql.org/download.html)し、AP_HOST1〜3のAP_DIR/common/lib/にコピーする。
PostgreSQL用のデータソース定義をAP_HOST1〜3のAP_DIR/conf/server.xml のHost要素内に追加する。
|
<Server><Service><Engine><Host> : <Context path="/ClusterCheck" docBase="ClusterCheck" crossContext="true" reloadable="true" debug="1"> <Resource name="PostgresDS" auth="Container" type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" url="jdbc:postgresql://10.212.202.192:5432/ossfdb" initialSize="5" username="ossf" password="ossf"/> </Context> : </Host></Engine></Service></Server> |
クラスタメンバシップ形成用のマルチキャスト通信がインターコネクト回線上で行われるようにするため、/etc/sysconfig/static-routes に下記のスタティックルーティング設定を追加し、ネットワークの再起動を行う。
| any net 224.0.0.0 netmask 240.0.0.0 dev eth1 |
| # service network restart |
検証用アプリケーションの概要とビルド方法、およびデプロイ方法を以下に示す。
検証用アプリケーションとして、2つのサーブレットを用いる。
| # | サーブレット | 機能 |
|---|---|---|
| 1 | CounterServlet |
|
| 2 | DbAccessServlet |
|
CounterServletの表示イメージを示す。
各項目の内容を示す。
| 項目 | 内容 |
|---|---|
| SessionID: | HttpSession.getId()メソッドで取得できるリクエストのセッションIDを表示する。 |
| Host: | リクエストを処理したノードのIPアドレスを表示する。 |
| Counter: | リクエスト回数を表示する。Counterで示される値は、1から開始し、リクエストを受ける度に1ずつ増加する。 |
CounterServletのURLパラメータ一覧を示す。
| パラメータ | 内容 | 用法 |
|---|---|---|
| rex | RuntimeExceptionをスローし、アプリケーション障害をシミュレートする。 | rex=1 |
| kill | System.exit()メソッドを実行することで、アプリケーション処理中の致命的障害をシミュレートする。 | kill=1 |
| replsize | 引数で指定した文字列長のStringオブジェクトがHttpSession.setAttribute()メソッドに設定される。 | repsize=5 |
DbAccessServletの表示イメージを示す。
検証用アプリケーションのビルド方法を以下に示す。
検証用アプリケーションのビルドに必要なAntをダウンロード(http://ant.apache.org/bindownload.cgi)する。本検証ではAnt-1.6.5を用いた。
| # tar xzvf apache-ant-1.6.5-bin.tar.gz |
以下の環境変数を設定する。
| # export ANT_HOME=ANT_DIR # export PATH=$PATH:$ANT_DIR/bin |
検証用アプリケーションをダウンロード(http://www.ipa.go.jp/software/open/forum/development/download/051115/web-8.zip)する。
検証用アプリケーションのアーカイブを展開する。
| # unzip ClusterCheck.zip |
展開したClusterCheckディレクトリに移動し、アプリケーションをビルドする。
| # cd ./ClusterCheck # ant |
ClusterCheck/build以下に生成されたClusterCheck.warをAP_HOST1〜3にコピーしてデプロイする。
| # cp ./build/ClusterCheck.war AP_DIR/server/repl/deploy/ |
JMETER_HOSTに負荷ツール(JMeter)をインストール、設定する。
Window版のjdk-1_5_0_04をダウンロード(http://java.sun.com/j2se/1.5.0/ja/download.html)し、インストールを行う。
システム環境変数のPATHにJDK_WIN_DIR\bin を設定する。
Window版のjakarta-jmeter-2.0.3をダウンロード(http://archive.apache.org/dist/jakarta/jmeter/binaries/)し、JMETER_DIRに追加する。圧縮ファイルを展開してインストールする。
COUNTER.jmxをJMETER_DIRにコピーする。
CLIENT_HOSTで用いるWebブラウザのキャッシュ設定を無効にする。