Pacemaker 資料一覧

Pacemaker + Heartbeatによる2ノードクラスタにTomcatを組み込む

2015/10/26更新

対応バージョン: Vagrant 1.4.3, Pacemaker 1.0.13, Heartbeat 3.0.5, Apache 2.2.15, Tomcat 7.0.56

以下で作成したApacheの2ノードクラスタにTomcatを組み込む手順を示す。

関連資料・記事

要件は以下の通りとする。

Tomcat用にVIP(192.168.1.102)を用意し、稼動系・待機系どちらにも接続できるようにする
コンテンツはSANやNASなどの共有領域には置かずに各サーバのローカルに置くものとする
待ち受けポートはデフォルトのままとし、Webサーバへのアクセスは8080、AJP接続は8009とする
Apacheに/app/でアクセスしてきた場合にVIPの8009ポートにAJP接続する
AJP接続がうまくいかない場合に備えてWebサーバ用のポート8080は閉じずに残しておく

Vagrantfile作成

基本的な設定は今までと同様とし、プロビジョニング用のスクリプトでTomcat環境を構築する。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define :s1 do |v|
    v.vm.box = "centos65_64"
    v.vm.hostname = "s1" 
    v.vm.network :private_network, ip: "192.168.1.121"
    v.vm.network :private_network, ip: "192.168.9.121"
    v.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2122
    v.vm.provision :shell, :path => "heartbeat.sh"
    v.vm.provision :shell, :path => "apache.sh"
    v.vm.provision :shell, :path => "tomcat.sh"
    v.vm.provision :shell, :path => "httpd-proxy.sh"
  end

  config.vm.define :s2 do |v|
    v.vm.box = "centos65_64"
    v.vm.hostname = "s2" 
    v.vm.network :private_network, ip: "192.168.1.122"
    v.vm.network :private_network, ip: "192.168.9.122"
    v.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2222
    v.vm.provision :shell, :path => "heartbeat.sh"
    v.vm.provision :shell, :path => "apache.sh"
    v.vm.provision :shell, :path => "tomcat.sh"
    v.vm.provision :shell, :path => "httpd-proxy.sh"
    v.vm.provision :shell, :path => "pacemaker.sh"
  end
end

前回のheartbeat.shからApacheの環境構築部分を切り出してapache.shとし、Tomcatの構築(tomcat.sh)とAJP接続の設定(httpd-proxy.sh)をそれぞれ新規作成する。

pacemaker.shはtomcatのリソース定義を追加する。

heartbeat.sh, apache.sh

heartbeat.shの前回作成ファイルから以下のApacheの環境構築部分を削除してapache.shに移動する。

### install httpd(Apache)
yum -y install httpd
cp /vagrant/index.html /var/www/html

tomcat.sh

#!/bin/sh

today=`date "+%Y%m%d"`

### install
yum -y install java-1.7.0-openjdk

useradd -s /sbin/nologin -u 700 tomcat

cd /tmp

wget http://ftp.riken.jp/net/apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz

tar zxvf apache-tomcat-7.0.56.tar.gz
rm -f apache-tomcat-7.0.56.tar.gz
mv apache-tomcat-7.0.56 /usr/local
cd /usr/local
chown -R tomcat:tomcat apache-tomcat-7.0.56
ln -s apache-tomcat-7.0.56 tomcat

install -m 0755 /vagrant/tomcat /etc/init.d
chkconfig --add tomcat
chkconfig tomcat off

### setting
cp -p /etc/profile /etc/profile.${today}

JAVA_PATH=`readlink -e $(which java)`

cat << EOD >> /etc/profile

JAVA_HOME=${JAVA_PATH}
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
EOD

source /etc/profile

### firewall
cd /etc/sysconfig

cp -p iptables iptables.${today}

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8009 -j ACCEPT

service iptables save
service iptables restart
### install

Tomcatに先立ちOpenJDKをインストールする。

実行ユーザのtomcatを作成する2台のサーバでそれぞれ作成するが、UIDの付与をシステムに任せておくと2台で別々のUIDが割り当てられる可能性があるので-uオプションでUIDを指定しておく。今回の構成のようにコンテンツが各ローカルにあれば問題ないが、共有領域に両サーバからアクセスする構成にする場合にUIDが異なっているとファイルの書き込みができなくなる。

Tomcatのバイナリを任意のミラーサイトからダウンロードして/usr/local配下に配置する。

/vagrantに用意した起動スクリプトtomcatを/etc/init.dにインストールし、システム起動時の自動起動はOFFにする。

(tomcat)

#!/bin/bash
#
# tomcat       Startup script for the Tomcat Servlet Container
#
# chkconfig: 2345 35 65
# description: Tomcat is the servlet container that is used in the official \
#              Reference Implementation for the Java Servlet and JavaServer \
#              Pages technologies

TOMCAT_USER=tomcat
CATALINA_HOME=/usr/local/tomcat
 
. /etc/rc.d/init.d/functions
prog=tomcat

start() {
    echo -n $"Starting $prog: "
    daemon --user $TOMCAT_USER $CATALINA_HOME/bin/startup.sh > /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/$prog
    return $RETVAL
}
stop() {
    echo -n $"Stopping $prog: "
    daemon --user $TOMCAT_USER $CATALINA_HOME/bin/shutdown.sh > /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/$prog
    return $RETVAL
}
 
# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    INSTANCES=`ps --columns 512 -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`
    if [ $INSTANCES -eq 0 ]; then
        echo $prog is stopped
        RETVAL=3
    else
        if [ $INSTANCES -eq 1 ]; then
            echo $prog is running 1 instance...
        else
            echo $prog is running $INSTANCES instances...
        fi
        RETVAL=0
    fi
    ;;
  *)
    echo $"Usage: $prog {start|stop|restart|status|help}"
    exit 1
esac
 
exit $RETVAL
### setting

/etc/profileにTomcatが動作するための環境変数JAVA_HOME,CATALINA_HOMEを定義する。

### firewall

2つの待受ポート(8080,8009)へのアクセスを許可する。

httpd-proxy.sh

### connect Apache - Tomcat
cp /vagrant/httpd-proxy.conf /etc/httpd/conf.d/
### connect Apache - Tomcat

/vagrantに用意したApache - TomcatのAJP接続用のファイルを配置する。

(httpd-proxy.conf)

<Location /app/>
  ProxyPass ajp://192.168.1.102:8009/
</Location>

pacemaker.sh

前回の設定にTomcatのリソース定義を追加する。

:
### setting resouce - Tomcat
JAVA_PATH="/usr"

crm configure primitive vip_tomcat ocf:heartbeat:IPaddr2 params \
ip="192.168.1.102" nic="eth1" cidr_netmask="24" op monitor interval="10"

crm configure primitive tomcat ocf:heartbeat:tomcat params \
java_home="${JAVA_PATH}" catalina_home="/usr/local/tomcat" \
tomcat_user="tomcat" statusurl="http://192.168.1.102:8080/" \
op start interval="0" timeout="90" on-fail="restart" \
op monitor interval="10" timeout="60" on-fail="restart" \
op stop interval="0" timeout="300" on-fail="block"

crm configure group webapp vip_tomcat tomcat
### setting resouce - Tomcat

java_homeに指定するのはjavaプログラムそのものではなく2つ上のディレクトリ。RA(/usr/lib/ocf/resource.d/heartbeat/tomcat)の中でjavaのパスを以下のように決めているので注意が必要である。

(tomcat)

:
586 JAVA_HOME="${OCF_RESKEY_java_home}"
:
644 JAVA=${JAVA_HOME}/bin/java
:

仮想マシン起動

以上の設定が終わったら仮想マシンを起動し、以下のURLにアクセスしてどちらもTomcatのトップ画面が出ればOKである。

http://192.168.1.102:8080/ ... TomcatのWebサーバ
http://192.168.1.101/app/ .... Apache - Tomcat AJP接続

リソースの状態は以下のようになっているはずである。

# crm_mon -f
:
Online: [ s1 s2 ]

 Resource Group: web
     vip_httpd  (ocf::heartbeat:IPaddr2):  Started s1
     httpd      (ocf::heartbeat:apache):   Started s1
 Resource Group: webapp
     vip_tomcat (ocf::heartbeat:IPaddr2):  Started s1
     tomcat     (ocf::heartbeat:tomcat):   Started s1

Migration summary:
* Node s1: 
* Node s2: