Glassfish 3.1の自己増殖クラスタを試す

先日のオープンラボ備後で、Oracleの寺田さんにご紹介いただいたGlassfishクラスタ環境が面白そうだったので、自分でも試してみました。

前準備

今回も例によってUbuntu環境。Ubuntu 10.04をインストールしたマシンを2台用意します。自分は仮想マシンで用意しました。
また、お互いホスト名で名前解決できるように/etc/hosts辺りを設定しておきます。
合わせてJavaも両マシンにインストール。デフォルトではsshdが入ってないようなのでこれもapt-get*1して導入しておきます。

自分は以下のような構成で実験しました。

  • ホスト名:misaka - Glassfish DASサーバ
  • ホスト名:sister1 - Glassfish Nodeサーバ

DAS(Domain Administration Server)サーバはクラスタ全体をコントロールする管理サーバ。これにsister1というNodeを作成してクラスタ環境を構築していきます。

DASサーバのインストール

DASサーバといっても普通にGlassfishをインストールするのと、差はありません。Glassfishのバイナリをとってきてunzipするだけ。
この辺りからダウンロードできます。ここで注意ですが、Glassfish 3.1には2つのプロファイルがあります。

  • Full Platform - 全ての機能を網羅した完全版
  • Web profile - Web開発に特化したバージョン

通常はWeb Profileで十分なので、今回はこれを使用します。

cd /usr/local/src
wget http://download.java.net/glassfish/3.1/release/glassfish-3.1-web-ml.zip
unzip glassfish-3.1-web-ml.zip
mv glassfish3 /usr/local

インストール自体はこれで終了。あとは

cd /usr/local/glassfish3/glassfish/bin
./asadmin start-domain

とするだけでGlassfishが起動します。超簡単。試しに管理画面を見てみましょう。ブラウザから

  • http://[misakaサーバのIP]:4848

にアクセスします。start-domain実行時のログにも出ていますが、通常は管理用Web画面にアクセスする場合のポートは4848番です。以下のように管理ツールが起動しているのが確認できます。

クラスタの作成

まずはクラスタを作成。misakaサーバで以下のコマンドを実行します。

./asadmin create-cluster cluster1

管理用Web画面でも、クラスタに新しくcluster1が作成されていることが確認できると思います。*2

SSH接続の設定

次にmisakaサーバからsister1サーバへパスワードなしでSSH接続できるように設定をおこないます。

echo "AS_ADMIN_SSHPASSWORD=hogehoge" > /tmp/password

上記のhogehogeの部分はsister1サーバのrootのパスワードに置き換えてください。
その後、以下のコマンドを発行。

./asadmin --passwordfile=/tmp/password --interactive=false setup-ssh --sshuser root --generatekey=true sister1

これでパスなしでsister1にSSH接続できるようになっているはずなので、以下のような感じで接続できるか、試してみます。

ssh sister1 java -version

パスワードを聞かれることなくsister1でjava -versionを実行した場合と同じ内容が返ってくれば、問題ありません。また、/tmp/passowrdは念のため消しておきます

ここでハマったこと。
自分の場合(openssh-server)は、SSHで接続した場合ユーザの環境変数を適用できていないらしく、javaへのPATHが通っていないという現象に陥りました。
その場合は、sister1のサーバに以下の設定を行います。

  • sshd_configの修正

sister1サーバ上の/etc/ssh/sshd_configを修正します。以下の記述を追加。

PermitUserEnvironment yes

本来はこの設定のみで、ユーザの環境変数を使用できるはずなんですが、自分が使用したopenssh-serverでは動かず、さらに以下の設定を行いました。

  • environmentの作成

sister1サーバ上で/root/.ssh/environmentを作成します。javaコマンドにPATHが通るように

echo "PATH=$PATH:/usr/local/java/bin" > ~/.ssh/environment

等とかでjavaへのPATHを通します。

上記2点の設定を行い、sshdを再起動*3します。再度、misakaサーバから

ssh sister1 java -version

とやって結果を確認します。

sister1サーバへGlassfishのインストール

sister1にGlassfishをインストールします。Glassfishには自分自身をZIPにまとめて、SSH経由で他のサーバにこれを展開し、自動でインストールする機能があります。だから自己増殖です。*4

misakaサーバ上で以下のコマンドを実行します。

./asadmin install-node --installdir /usr/local/glassfish3 --sshuser root --sshkeyfile ~/.ssh/id_rsa sister1

実行すると、こんな感じで出力されます。

Created installation zip /usr/local/glassfish3/glassfish/bin/glassfish2277027524628389477.zip
Successfully connected to root@sister1 using keyfile /root/.ssh/id_rsa
Copying /usr/local/glassfish3/glassfish/bin/glassfish2277027524628389477.zip (58978127 bytes) to sister1:/usr/local/glassfish3
Installing glassfish2277027524628389477.zip into sister1:/usr/local/glassfish3
Removing sister1:/usr/local/glassfish3/glassfish2277027524628389477.zip
Fixing file permissions of all files under sister1:/usr/local/glassfish3/bin

misakaサーバでGlassfish自身のZIPを作成し、これをsister1に送って展開している様子がよくわかります。

ノードとインスタンスの作成

次にsister1サーバをDASサーバの管理下に置けるようにノードとして登録します。misakaサーバで以下を実行。

./asadmin create-node-ssh --nodehost sister1 --sshuser root --sshkeyfile ~/.ssh/id_rsa --installdir /usr/local/glassfish3 sister1

管理用Web画面のノードに、sister1が追加されていることがわかります。

次にここで追加したsister1ノードをcluster1がインスタンスとして使用できるようにします。misakaサーバで以下を実行。

./asadmin create-instance --node sister1 --cluster cluster1 instance1

管理用Web画面のクラスタからに、cluster1にinstance1が追加されていることがわかります。

クラスタを起動してみる

早速、ここまで構成したクラスタを起動してみましょう。misakaサーバで以下を実行します。

./asadmin start-cluster cluster1

するとcluster1に配備されている全てのノードのインスタンスが一度に起動し、クラスタ環境が実行されます。
管理用Web画面からwarファイルをデプロイするなどして、クラスタ環境を実際に試してみてください。

さらにNodeを増やすには

今回は1台のみの構成でしたが、クラスタ環境なので、当然これを増やしていくこともできます。手順としては

  1. ssh-setupで、対象マシンにDASサーバからパスワードなしでSSH接続できるよう設定する
  2. install-nodeで対象マシンにGlassfishのバイナリをコピーする
  3. create-node-sshでDASサーバの管理下に置く
  4. create-instanceでクラスタインスタンスを追加する

といった手順です。

このように、作業をクラスタ上の各マシンでおこなうことなく、DASサーバだけでほとんどの管理ができるのは、Glassfish 3.1の大きな特徴かと思います。

*1:apt-get install openssh-server

*2:ここではcluster1だけどmisaka-networkとかでも、ゲフンゲフン

*3:service ssh restart

*4:多分ね・・・・