構築手順

システム構成図、凡例

システム構成図

以下に示すシステム構成で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

構築手順

  1. OSのインストールと設定
  2. WEB_HOST、AP_HOST1〜3、DB_HOSTにMIRACLE LINUX V3.0をインストールする。インストール時は以下に示す各種設定を行う。

    • インストールパッケージの決定
    • ホスト名の設定
    • IPアドレスの設定
    • 経路制御の設定
    • ファイルシステム配置の決定

    JMETER_HOST、CLIENT_HOSTはプレインストールのOS(Windows 2003 Server、Windows XP Professional)を使用した。

  3. Apache HTTP Serverのインストールと設定
  4. WEB_HOSTでのApache HTTP Serverのインストールと設定方法を以下に示す。
    mod_jkのインストールと設定方法は、JakartaのWebサイトで公開されている手順(http://tomcat.apache.org/connectors-doc/を参考にした。

    1. 必要なパッケージのインストール
    2. ビルドに必要な追加のパッケージをインストールする。パッケージ間には依存関係があるため下記に示す順番で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

    3. Apache HTTP Serverのインストール
    4. 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

    5. mod_jkのインストール
    6. 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/

    7. httpd.confの設定
    8. WEB_HOSTのWEB_DIR/conf/httpd.confの最下行に下記の内容を追記する。

      Include conf/mod-jk.conf

    9. mod-jk.confの設定
    10. 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

    11. conf/workers.propertiesの設定
    12. 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

  5. PostgreSQLのインストールと設定
  6. DB_HOST上でのPostgreSQLのインストールと設定方法を示す。

    1. 必要なパッケージのインストール
    2. ビルドに必要な追加のパッケージをインストールする。パッケージ間には依存関係があるため下記に示す順番で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

    3. 環境変数の設定
    4. 以降の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

    5. PostgreSQLのインストール
    6. 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

    7. データベースの初期化
    8. データベースクラスタを作成する。

      $ cd DB_DIR
      $ mkdir data
      $ initdb --no-locale --encoding=EUC_JP

      データベースクラスタ作成後、データベースクラスタ内に作成された以下のファイルを下記のとおり編集する。

      postgresql.conf
      listen_addresses = '*'
      pg_hba.conf
      # IPv4 local connections:
      host all all 0.0.0.0 0.0.0.0 trust

    9. PostgreSQLの起動
    10. PostgreSQLを起動する。

      $ pg_ctl start

    11. ユーザの追加
    12. 下記のコマンドを実行してユーザを追加する。

      $ 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

    13. データベースの作成
    14. 下記のコマンドを実行してユーザを追加する。

      $ createdb -U ossf ossfdb
      CREATE DATABASE

    15. テストデータの設定
    16. データベースにテストデータを設定する。

      $ psql -U ossf ossfdb < clustercheck.sql

  7. JDKのインストールと設定
  8. AP_HOST1〜3でのJDKのインストールと設定方法を以下に示す。

    1. JDK1.5のインストール
    2. 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

    3. JAVA_HOMEの設定
    4. AP_HOST1〜3の~/.bash_profileに以下の環境変数JAVA_HOME を設定する。

      export JAVA_HOME=/usr/java/jdk1.5.0_06

  9. Tomcatのインストールと設定
  10. AP_HOST1〜3でのTomcatのインストールと設定方法を以下に示す。Tomcatの設定方法は、JakartaのWebサイト上で公開されている設定情報(http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.htmlを参考にした。

  11. conf/server.xmlの設定
  12. クラスタリング実行設定

    クラスタリングを行うために、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>

    <AP_HOST2>
    <Cluster ...>
     :
    <Receiver className="org.apache.catalina.cluster.tcp.ReplicationListener" tcpListenAddress="192.168.1.3" tcpListenPort="4001" tcpSelectorTimeout="100" tcpThreadCount="2"/>
     :
    </Cluster>

    <AP_HOST3>
    <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>

    「非同期(asynchronous)」の設定(waitForAck="true")
    <Cluster ...>
     :
    <SenderclassName="org.apache.catalina.cluster.tcp.ReplicationTransmitter"replicationMode="asynchronous" waitForAck="true"/>
     :
    </Cluster>

    「プール(pooled)」の設定(waitForAck="true")
    <Cluster ...>
     :
    <SenderclassName="org.apache.catalina.cluster.tcp.ReplicationTransmitter"replicationMode="pooled" waitForAck="true"/>
     :
    </Cluster>

    「非同期キュー(fastasyncqueue)」の設定(waitForAck="true")
    <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">

    <AP_HOST2>
    <Engine name="Standalone" defaultHost="localhost" jvmRoute="nodeB">

    <AP_HOST3>
    <Engine name="Standalone" defaultHost="localhost" jvmRoute="nodeC">

  13. PostgreSQL用ドライバのインストール
  14. PostgreSQL用のJDBCドライバをダウンロード(http://jdbc.postgresql.org/download.html)し、AP_HOST1〜3のAP_DIR/common/lib/にコピーする。

  15. PostgreSQL用データソース設定
  16. 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>

  17. ルーティング設定
  18. クラスタメンバシップ形成用のマルチキャスト通信がインターコネクト回線上で行われるようにするため、/etc/sysconfig/static-routes に下記のスタティックルーティング設定を追加し、ネットワークの再起動を行う。

    any net 224.0.0.0 netmask 240.0.0.0 dev eth1

    # service network restart

  • 検証用アプリケーションのインストールと設定
  • 検証用アプリケーションの概要とビルド方法、およびデプロイ方法を以下に示す。

    検証用サーブレット

    検証用アプリケーションとして、2つのサーブレットを用いる。

    # サーブレット 機能
    1 CounterServlet
    1. セッションID表示
    2. 処理ノードのIPアドレス表示
    3. アクセス回数を表示
    4. アプリケーション例外の再現
    5. 致命的アプリケーション障害の再現
    6. セッション情報の負荷サイズ指定
    2 DbAccessServlet
    1. DBサーバにアクセスしダミーデータを表示
    CounterServlet 表示イメージ

    CounterServletの表示イメージを示す。

    各項目の内容を示す。

    項目 内容
    SessionID: HttpSession.getId()メソッドで取得できるリクエストのセッションIDを表示する。
    Host: リクエストを処理したノードのIPアドレスを表示する。
    Counter: リクエスト回数を表示する。Counterで示される値は、1から開始し、リクエストを受ける度に1ずつ増加する。
    CounterServlet URLパラメータ

    CounterServletのURLパラメータ一覧を示す。

    パラメータ 内容 用法
    rex RuntimeExceptionをスローし、アプリケーション障害をシミュレートする。 rex=1
    kill System.exit()メソッドを実行することで、アプリケーション処理中の致命的障害をシミュレートする。 kill=1
    replsize 引数で指定した文字列長のStringオブジェクトがHttpSession.setAttribute()メソッドに設定される。 repsize=5
    DbAccessServlet 表示イメージ

    DbAccessServletの表示イメージを示す。

    ビルド方法

    検証用アプリケーションのビルド方法を以下に示す。

  • JMeterのインストールと設定
  • JMETER_HOSTに負荷ツール(JMeter)をインストール、設定する。

    1. JDK1.5のインストール
    2. Window版のjdk-1_5_0_04をダウンロード(http://java.sun.com/j2se/1.5.0/ja/download.html)し、インストールを行う。

    3. PATHの設定
    4. システム環境変数のPATHにJDK_WIN_DIR\bin を設定する。

    5. JMeterのインストール
    6. Window版のjakarta-jmeter-2.0.3をダウンロード(http://archive.apache.org/dist/jakarta/jmeter/binaries/)し、JMETER_DIRに追加する。圧縮ファイルを展開してインストールする。

    7. JMeter設定ファイルのインストール
    8. COUNTER.jmxをJMETER_DIRにコピーする。

  • ブラウザの設定
  • CLIENT_HOSTで用いるWebブラウザのキャッシュ設定を無効にする。

    Internet Explorerの設定手順
    1. [ツール]メニューから「インターネットオプション」を選択しクリックする。
    2. [設定]ダイアログで、[保存しているページの新しいバージョンの確認]の[ページを表示するごとに確認する]のチェックをONにする。