2011-05-25

Cassandra0.7をWindowsのサービスで動かす

■目的
Cassandra0.7をWindowsのサービスで動かす。
Serveice化するコンポーネントは、「Apache Commons Daemon's procrun」を使用する。

■環境
OS Windows XP
Cassandra 0.7.6-2

■Cassandra用procrunのダウンロード
JIRA issueのCassandra / CASSANDRA-292に、
「Apache Commons Daemon's procrun」を使用してCssandraをWindowsのサービスで動作させる方法とインストーラーが紹介されています。
紹介されているのは、0.6用なので、0.7用にカスタマイズして使用しました。

https://issues.apache.org/jira/browse/CASSANDRA-292
から、「windows_u1.zip」をダウンロードし、解凍します。

解凍したファイル中にある「README.TXT」の手順にしたがって説明します。

●1.contribの作成

ここでは「cassandra-windows.jar」を作成します。
ダウンロードしたファイル内に「cassandra-windows.jar」が含まれていますが、log4jの設定がCassandra0.6の設定となっているので、0.7用にソースを修正してコンパイルして「cassandra-windows.jar」を作成します。

【Note】ダウンロードしたファイル内の「cassandra-windows.jar」をCassandra0.7で使用すると、サービス起動時にlog4jのプロパティファイルの読み込み失敗の警告がログに記録されますが起動させることはできました。警告を気にしないしコンパイルが面倒であれば、「2.CASSANDRA_HOMEとJAVA_HOMEの設定」に進んでください。

「cassandra-windows.jar」の作成には、jdk1.6とantが必要です。環境に合わせて、環境変数の%JAVA_HOME%と%ANT_HOME%を設定してください。

【今回のコンパイル環境】
JDK 1.6.0_21
ant 1.6.5
JAVA_HOME C:\Program Files\Java\jdk1.6.0_21
ANT_HOME C:\apache-ant-1.6.5

ダウンロードファイルを解凍してできたディレクトリ「contrib」をCassandaraのソースディストリビューションの「lib」ディレクトリと同じディレクトリに配置します。

【配置例】
D:\cassandra\apache-cassandra-0.7.6-2
├─bin
├─conf
├─contrib
│  └─windows
│      │
│      ├─bin
│      │  │
│      │  ├─amd64
│      │  │
│      │  └─ia64
│      │
│      └─src
├─lib

contrib\windows\src\main\java\org\apache\cassandra\contrib\windows\service
にある「WindowsService.java」を0.7用に修正します。
修正箇所は、main()メソッド内のlog4jのプロパティファイル名です。
【変更前のWindowsService.java】
String file = System.getProperty("storage-config") + File.separator + "log4j.properties";
【変更後のWindowsService.java】
String file = System.getProperty("storage-config") + File.separator + "log4j-server.properties";

ファイルを修正したら「contrib\windows」ディレクトリでantを実行し、jarファイルを作成します。
>ant jar

【実行例】
D:\cassandra\apache-cassandra-0.7.6-2\contrib\windows>ant jar
Buildfile: build.xml

init:
    [mkdir] Created dir: D:\cassandra\apache-cassandra-0.7.6-2\contrib\windows\build\classes

build:
    [javac] Compiling 1 source file to D:\cassandra\apache-cassandra-0.7.6-2\contrib\windows\build\classes

jar:
    [mkdir] Created dir: D:\cassandra\apache-cassandra-0.7.6-2\contrib\windows\build\classes\META-INF
      [jar] Building jar: D:\cassandra\apache-cassandra-0.7.6-2\contrib\windows\build\cassandra-windows.jar

BUILD SUCCESSFUL
Total time: 1 second

contrib\buildに「cassandra-windows.jar」が作成されます。

●2.CASSANDRA_HOMEとJAVA_HOMEの設定

環境変数にJAVA_HOMEとCASSANDRA_HOMEとJAVA_HOME設定します。
(Cassandraをサービスで動作させるときの環境変数です。)

【設定例】
項目 設定値
CASSANDRA_HOME D:\cassandra\apache-cassandra-0.7.6-2
JAVA_HOME C:\Program Files\Java\jre6

●3.ファイルの配置

サービスの起動には「contrib\bin」にある以下のファイルが必要です。
ファイル 役割
cassandra.exe Windows Service
cassandraw.exe Service Configuration Utility
cassandra-windows.jar(*1) Contains WindowsService class file
service.bat(*2) used to install and remove service

上記のファイルを%CASSANDRA_HOME%\binにコピーします。

(*1)1.で「cassandra-windows.jar」を作成した場合は作成した「cassandra-windows.jar」をコピーしてください。

(*2)ダウンロードしたファイルの「service.bat」は、サービスに登録する時のデフォルトの設定(Java Classpath や Java Optionが0.6の設定なので、サービスの登録はできますが、Cassandra0.7が正常に起動できません。
Cassandra0.7を動作させるためには、サービス登録後に「cassandraw.exe」を起動して Java Classpath や Java Option を0.7用に設定する必要がありますが、事前に「service.bat」に0.7用の設定を記述しておけば便利です。
0.7用のserivce.batは、後述の【0.7用service.bat】を参照してください。

【コピー後のファイルの配置】
D:\cassandra\apache-cassandra-0.7.6-2
├─bin
│      cassandra-windows.jar
│      cassandra.exe
│      cassandraw.exe
│      service.bat
│      :
│
├─conf
├─contrib
├─interface
├─javadoc
└─lib

●4. サービスのインストールとアンインストール

D:\cassandra\apache-cassandra-0.7.6-2\binで、コマンドプロンプトを開きます。

サービスのインストールは、以下のコマンドを実行します。
>service.bat install

【実行例】
D:\cassandra\apache-cassandra-0.7.6-2\bin>service.bat install

Setting JAVA_OPTS: -ea;-Xdebug;-Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n;-XX:TargetSurvivorRatio=90;
-XX:+AggressiveOpts;-XX:+UseParNewGC;-XX:+UseConcMarkSweepGC;-XX:+CMSParallelRemarkEnabled;-XX:+HeapDumpOnOutOfMemoryErr
or;-XX:SurvivorRatio=128;-XX:MaxTenuringThreshold=0;-Dcom.sun.management.jmxremote.port=8080;-Dcom.sun.management.jmxrem
ote.ssl=false;-Dcom.sun.management.jmxremote.authenticate=false-Dlog4j.configuration=log4j-server.properties-Dlog4j.defa
ultInitOverride=true

Using Executable: D:\cassandra\apache-cassandra-0.7.6-2\bin\\cassandra.exe

Installing the service 'Cassandra' ...

Using CASSANDRA_HOME:    D:\cassandra\apache-cassandra-0.7.6-2

Using JAVA_HOME:        C:\Program Files\Java\jdk1.6.0_21

Using CASSANDRA_PARAMS:  -ea;-Xdebug;-Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n;-XX:TargetSurvivorRat
io=90;-XX:+AggressiveOpts;-XX:+UseParNewGC;-XX:+UseConcMarkSweepGC;-XX:+CMSParallelRemarkEnabled;-XX:+HeapDumpOnOutOfMem
oryError;-XX:SurvivorRatio=128;-XX:MaxTenuringThreshold=0;-Dcom.sun.management.jmxremote.port=8080;-Dcom.sun.management.
jmxremote.ssl=false;-Dcom.sun.management.jmxremote.authenticate=false-Dlog4j.configuration=log4j-server.properties-Dlog4
j.defaultInitOverride=true;-Dcassandra;-Dcassandra-foreground=yes

Using JVM: C:\Program Files\Java\jdk1.6.0_21\jre\bin\server\jvm.dll

The service 'Cassandra' has been installed.
D:\cassandra\apache-cassandra-0.7.6-2\bin

D:\cassandra\apache-cassandra-0.7.6-2\bin>

コンピュータの管理のサービスとアプリケーションで確認してみましょう。
【サービスとアプリケーションの画面】

サービスのアンインストールは、以下のコマンドを実行します。
>service.bat remove

【実行例】
D:\cassandra\apache-cassandra-0.7.6-2\bin>service.bat remove

Setting JAVA_OPTS: -ea;-Xdebug;-Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n;-XX:TargetSurvivorRatio=90;
-XX:+AggressiveOpts;-XX:+UseParNewGC;-XX:+UseConcMarkSweepGC;-XX:+CMSParallelRemarkEnabled;-XX:+HeapDumpOnOutOfMemoryErr
or;-XX:SurvivorRatio=128;-XX:MaxTenuringThreshold=0;-Dcom.sun.management.jmxremote.port=8080;-Dcom.sun.management.jmxrem
ote.ssl=false;-Dcom.sun.management.jmxremote.authenticate=false-Dlog4j.configuration=log4j-server.properties-Dlog4j.defa
ultInitOverride=true

Using Executable: D:\cassandra\apache-cassandra-0.7.6-2\bin\\cassandra.exe

The service 'Cassandra' has been removed
D:\cassandra\apache-cassandra-0.7.6-2\bin

D:\cassandra\apache-cassandra-0.7.6-2\bin>

●5.サービスの実行

サービスの実行はコマントプロンプトで、以下のコマンドを実行します。
(もちろんコンピュータの管理のサービスとアプリケーションで実行可能)
>net start cassandra

【実行例】
D:\cassandra\apache-cassandra-0.7.6-2\bin>net start cassandra
Cassandra サービスを開始します.
Cassandra サービスは正常に開始されました。

サービスのログは、「%CASSANDRA_HOME%\logs」に出力されます。
サービスのログ
jakarta_service_YYYYMMDD.log
stderr_YYYMMDD.log
stdout_YYYMMDD.log

以上で、サービスでの動作は完了です。
クライアントからアクセスして動作を確認してみてください。

●service.batの修正点
(1)Java Optionに以下の設定を追加します。(JAVA_OPTS)
-Dlog4j.configuration=log4j-server.properties
(2)Class PathにCassandraのconfディレクトリを追加します。(CLASSPATH)
set CLASSPATH=%CLASSPATH%;%CASSANDRA_CONF%

【0.7用に修正したservice.bat】
@echo off
@echo off
if "%OS%" == "Windows_NT" setlocal
rem ---------------------------------------------------------------------------
rem NT Service Install/Uninstall script for Cassandra
rem
rem Options
rem install                Install the service using Cassandra as service name.
rem                        Service is installed using default settings.
rem remove                 Remove the service from the System.
rem
rem name        (optional) If the second argument is present it is considered
rem                        to be new service name                                           
rem
rem ---------------------------------------------------------------------------

REM ***** Check/Set CASSANDRA_HOME *****
if NOT DEFINED CASSANDRA_HOME set CASSANDRA_HOME=%~dp0..\..\..

REM ***** Check/Set CASSANDRA_CONF *****
if NOT DEFINED CASSANDRA_CONF set CASSANDRA_CONF=%CASSANDRA_HOME%\conf

REM ***** Check/Set CASSANDRA_MAIN *****
if NOT DEFINED CASSANDRA_MAIN set CASSANDRA_MAIN=org.apache.cassandra.contrib.windows.service.WindowsService

REM ***** Check JAVA_HOME is defined *****
if DEFINED JAVA_HOME goto java_home_defined_ok
echo The JAVA_HOME environment variable was not found...
echo Make sure the JAVA_HOME environment variable is correclty defined.
echo This environment variable is needed to run this program.
goto end
:java_home_defined_ok

REM ***** Make sure JAVA_HOME is actually set *****
if not "%JAVA_HOME%" == "" goto java_home_actually_set_ok
echo The JAVA_HOME environment variable is not defined properly
echo This environment variable is needed to run this program
goto end
:java_home_actually_set_ok

REM ***** SET JAVA_OPTS *****
set JAVA_OPTS=-ea;^
-Xdebug;^
-Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n;^
-XX:TargetSurvivorRatio=90;^
-XX:+AggressiveOpts;^
-XX:+UseParNewGC;^
-XX:+UseConcMarkSweepGC;^
-XX:+CMSParallelRemarkEnabled;^
-XX:+HeapDumpOnOutOfMemoryError;^
-XX:SurvivorRatio=128;^
-XX:MaxTenuringThreshold=0;^
-Dcom.sun.management.jmxremote.port=8080;^
-Dcom.sun.management.jmxremote.ssl=false;^
-Dcom.sun.management.jmxremote.authenticate=false^
-Dlog4j.configuration=log4j-server.properties

echo.
echo Setting JAVA_OPTS: %JAVA_OPTS%

REM ***** Check that cassandra.exe exists! *****
if exist "%~dp0\cassandra.exe" goto cassandra_home_ok
echo The cassandra.exe was not found...
goto end
:cassandra_home_ok


REM ***** Now we can setup all the PROCRUN variables!! *****
 
set EXECUTABLE=%~dp0\cassandra.exe
echo.
echo Using Executable: %EXECUTABLE%

REM ***** Set default Service name *****
set SERVICE_NAME=Cassandra
set PR_DISPLAYNAME=Cassandra

REM ***** Process batch parameters *****
if "%1" == "" goto displayUsage
if "%2" == "" goto setServiceName
set SERVICE_NAME=%2
set PR_DISPLAYNAME=%2
:setServiceName
if %1 == install goto doInstall
if %1 == remove goto doRemove
if %1 == uninstall goto doRemove
echo Unknown parameter "%1"

:displayUsage
echo.
echo Usage: service.bat install/remove [service_name]
goto end

REM ***** Remove the service *****
:doRemove
"%EXECUTABLE%" //DS//%SERVICE_NAME%
echo.
echo The service '%SERVICE_NAME%' has been removed
goto end

REM ***** Install the service *****
:doInstall
echo.
echo Installing the service '%SERVICE_NAME%' ...
echo.
echo Using CASSANDRA_HOME:    %CASSANDRA_HOME%
echo.
echo Using JAVA_HOME:        %JAVA_HOME%

REM ***** CLASSPATH library setting *****

REM ***** Ensure that any user defined CLASSPATH variables are not used on startup *****
set CLASSPATH=%~dp0cassandra-windows.jar
set CLASSPATH=%CLASSPATH%;%CASSANDRA_CONF%

REM ***** For each jar in the CASSANDRA_HOME lib directory call append to build the CLASSPATH variable.*****
for %%i in (%CASSANDRA_HOME%\lib\*.jar) do call :append %%~fi
goto okClasspath

:append
set CLASSPATH=%CLASSPATH%;%1%2
goto :eof

:okClasspath

REM ***** Include the build\classes directory so it works in development *****
set CASSANDRA_CLASSPATH=%CLASSPATH%;%CASSANDRA_HOME%\build\classes

REM ***** Set the CASSANDRA_PARMS to include JAVA_OPTS plus storage-config ****
set CASSANDRA_PARAMS=%JAVA_OPTS%;-Dcassandra;-Dstorage-config="%CASSANDRA_CONF%";-Dcassandra-foreground=yes

echo.
echo Using CASSANDRA_PARAMS:  %CASSANDRA_PARAMS%


rem ***** Each PROCRUN command line option is prefixed with PR_ *****

set PR_DESCRIPTION=Cassandra
set PR_INSTALL=%EXECUTABLE%
set PR_LOGPATH=%CASSANDRA_HOME%\log
set PR_CLASSPATH=%CASSANDRA_CLASSPATH%
set PR_STDOUTPUT=auto
set PR_STDERROR=auto
set PR_JVMMS=128
set PR_JVMMX=1024
set PR_STOPTIMEOUT=5

rem ***** Set the server jvm from JAVA_HOME *****
set PR_JVM=%JAVA_HOME%\jre\bin\server\jvm.dll
if exist "%PR_JVM%" goto foundJvm
rem Set the client jvm from JAVA_HOME
set PR_JVM=%JAVA_HOME%\jre\bin\client\jvm.dll
if exist "%PR_JVM%" goto foundJvm
set PR_JVM=auto
:foundJvm

echo.
echo Using JVM: %PR_JVM%

REM ***** Install the Service!!! *****
"%EXECUTABLE%" //IS//%SERVICE_NAME% --StartClass %CASSANDRA_MAIN% --StartParams start --StopClass %CASSANDRA_MAIN% --StopParams stop
if not errorlevel 1 goto installed
echo Failed installing '%SERVICE_NAME%' service
goto end

REM ***** Update the service with some extra paramters *****
:installed
rem Clear the environment variables. They are not needed any more.
set PR_DISPLAYNAME=
set PR_DESCRIPTION=
set PR_INSTALL=
set PR_LOGPATH=
set PR_CLASSPATH=
set PR_JVM=
SET PR_STDOUTPUT=
SET PR_STDERROR=
set PR_JVMMS=
set PR_JVMMX=

REM ***** Set some more extra parameters ****
REM ***** Note: Cassandra only seems start if using StartMode "java" *****
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions "%CASSANDRA_PARAMS%" --StartMode jvm --StopMode jvm

echo.
echo The service '%SERVICE_NAME%' has been installed.

:end
cd %CURRENT_DIR%

0 件のコメント: