2010年11月26日金曜日

TerracottaでTomcat(CAS)のクラスタリング

■Terracottaとは?
「Terracotta 3.4.0 - Simple Scale for Enterprise Java」(『README.txt』より)
よく分かりません。
要は、JAVAの実行プロセスにフックをかけることで、
内部データがTerracottaサーバを経由するようにできる。

■テスト環境
1. 2つのサーバ:
 ホスト名=dog、IPアドレス=192.168.1.11
 ホスト名=cat、IPアドレス=192.168.1.12
 ※ 時間設定があっていること!
2. 各Tomcatディレクトリ($CATALINA_HOME):「/usr/local/tomcat」
3. 各Java実行ディレクトリ($JAVA_HOME):「/usr/local/tomcat/jre」

■テラコッタダウンロード・設置
「http://www.terracotta.org/」の「DOWNLOAD」> 「Get Open Source」
> 適当にフォーム入力するとダウンロード先がメールで送られてくる。
ダウンロード先:http://www.terracotta.org/dl/oss-download-catalog
「Terracotta Tarball Binary」の「terracotta-3.4.0.tar.gz」をダウンロード。

■解凍してできたディレクトリを「tc」として、各「$CATALINA_HOME」に入れる。
以下「$CATALINA_HOME」での作業。
※JAVA_HOMEを設定
export JAVA_HOME=/usr/local/tomcat/jre

■設定ファイルを作成
1. CASサーバ用の設定をダウンロード
wget https://source.jasig.org/cas3/tags/cas-server-3.4.3.1/etc/terracotta/sample-terracotta-config.xml -O tc/tc-config.xml

2. 設定を修正
vi tc/tc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<tc:tc-config xsi:schemaLocation="http://www.terracotta.org/schema/terracotta-4.xsd" xmlns:tc="http://www.terracotta.org/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- サーバを2つ設定 -->
<servers>
<server name="dog" host="192.168.1.11" />
<server name="cat" host="192.168.1.12" />
</servers>
<!-- モジュール設定を追加 -->
<clients>
<modules>
<module name="tim-tomcat-6.0"/>
<module name="tim-spring-webflow-2.0"/>
<module name="tim-spring-security-2.0"/>
</modules>
</clients>
...
</tc:tc-config>


■必要なモジュール(上の「<modules>」設定したもの)のダウンロード・インストールを行う。
1. プロキシ設定が必要な場合は以下のファイルを編集
vi tc/lib/resource/tim-get.properties
org.terracotta.modules.tool.proxyUrl = http://プロキシサーバ:ポート


2. サポートされているモジュールを確認
tc/bin/tim-get.sh list

3. ダウンロード・インストール
tc/bin/tim-get.sh upgrade tc/tc-config.xml

4. インストールされたものを確認
ls tc/platform/modules/org/terracotta/modules

■テラコッタの起動
tc/bin/start-tc-server.sh -f tc/tc-config.xml &

■Tomcat起動時のブート・クラス(jar)を作成
tc/bin/platform/bin/make-boot-jar.sh -o tc/lib/dso-boot.jar

■Tomcat起動時の環境変数(JAVA_OPTS)を確認
export TC_INSTALL_DIR=tc
export TC_CONFIG_PATH=192.168.1.11:9510,192.168.1.12:9510
export DSO_BOOT_JAR=tc/lib/dso-boot.jar
tc/bin/platform/dso-evn.sh
↓出力(最終行)
-Xbootclasspath/p:tc/lib/dso-boot.jar -Dtc.install-root=tc -Dtc.config=192.168.1.11:9510,192.168.1.12:9510


■Tomcatを起動
# 上の結果を「JAVA_OPTS」に設定する
export JAVA_OPTS="-Xbootclasspath/p:tc/lib/dso-boot.jar -Dtc.install-root=tc -Dtc.config=192.168.1.11:9510,192.168.1.12:9510"
export CATALINA_PID=logs/catalina.pid
bin/startup.sh; tail -f logs/catalina.out


■デベロッパ・コンソールで、データ確認
tc/bin/dev-console.sh
Platform > Clustered heep > Object browser > ...

■Tomcatの停止
export JAVA_OPTS= #テラコッタは無視
bin/shutdown.sh 3 -force #約3秒待機して、残っていたら殺す


■Terracottaの停止
tc/bin/stop-tc-server.sh -f tc/tc-config.xml -n dog
※「-n」に自分のサーバのホスト名(<server>の`name`属性)を指定

■テラコッタのログ/データについて
設定ファイル「tc-config.xml」で、ログ/データの保存先を全く指定しなかった場合、以下のようなファイルが作成されます。
・サーバデータ(デフォルト=data)→ tomcat/tc/data/*
・サーバログ(デフォルト=logs)→ tomcat/tc/logs/terracotta-server.log*
・サーバ統計(デフォルト=statistics)→ tomcat/tc/statistics/statistics-*
・クライアントログ(デフォルト=logs-%i)→ tomcat/logs-127.0.0.1/terracotta-client.log*


つまり、
1. サーバの場合は、「tc-config.xml」の場所からの相対パス。
2. クライアントの場合は、実行位置からの相対パス。
、、、になってしまいます。
「logs-127.0.0.1」が嫌な場合は、設定(「tc-config.xml」の<clients>)を例えば以下のように変更
<clients>
<!-- Tomcatのログディレクトリに保存 -->
<logs>logs</logs>
</clients>


■「$CATALINA_HOME」内のMakefileの例
JAVA_HOME=jre
CATALINA_HOME=.
CATALINA_PID=logs/catalina.pid

TC_INSTALL_DIR=tc
TC_DSO_BOOT_JAR=$(TC_INSTALL_DIR)/lib/dso-boot.jar
TC_CONFIG_FILE=$(TC_INSTALL_DIR)/tc-config.xml
TC_CONFIG_HOSTS=192.168.1.11:9510,192.168.1.12:9510
TC_STOP_HOST=$(shell hostname -s) #自分のサーバのホスト名

TC_JAVA_OPTS=-Xbootclasspath/p:$(TC_DSO_BOOT_JAR)
TC_JAVA_OPTS+=-Dtc.install-root=$(TC_INSTALL_DIR)
TC_JAVA_OPTS+=-Dtc.config=$(TC_CONFIG_HOSTS)

export JAVA_HOME

#Tomcatの起動
start:$(TC_DSO_BOOT_JAR)
export CATALINA_PID=$(CATALINA_PID); \
export JAVA_OPTS="$(TC_JAVA_OPTS)"; \
$(CATALINA_HOME)/bin/startup.sh

#Tomcatの停止
stop:
export CATALINA_PID=$(CATALINA_PID); \
$(CATALINA_HOME)/bin/shutdown.sh 3 -force

#ブートJarの作成
$(TC_DSO_BOOT_JAR):
$(TC_INSTALL_DIR)/platform/bin/make-boot-jar.sh -o $@

#環境チェック
check-tc:
export TC_INSTALL_DIR=$(TC_INSTALL_DIR); \
export TC_CONFIG_PATH=$(TC_CONFIG_HOSTS); \
export DSO_BOOT_JAR=$(TC_DSO_BOOT_JAR); \
$(TC_INSTALL_DIR)/platform/bin/dso-env.sh

#Terracotta起動
start-tc:
$(TC_INSTALL_DIR)/bin/start-tc-server.sh -f $(TC_CONFIG_FILE) &

#Terracottaの停止
stop-tc:
$(TC_INSTALL_DIR)/bin/stop-tc-server.sh -f $(TC_CONFIG_FILE) -n $(TC_STOP_HOST) &


■Eclipse・Tomcatプラグインの設定
ウィンドー > 設定 > Tomcat > JVMの設定
、、、で「JAVA_OPTS」の各パラメタを追加(ただし絶対パス指定)
・-Xbootclasspath/p:/usr/local/tomcat/tc/lib/dso-boot.jar
・-Dtc.install-root=/usr/local/tomcat/tc
・-Dtc.config=192.168.1.11:9510,192.168.1.12:951