5

製品 (3.3.3) で Zookeeper を使用しています。Windows で Zookeeper を使用しているときに、(prunsrv を使用して) サービスを作成しています。クエリや問題はほとんどありません。それらをすべてリストアップし、

問題: 1) zkServer.cmd が Win サーバー 2008 マシンと Win 7 Enterprise (どちらも 64 ビット) で起動せず、次の行を置き換える必要がありました。

java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%"
          And it worked, could it be fixed in some other way?

2)zoo.cnf で dataDir を指定しましたが、別のディレクトリ (bin/zookeeper-3.4.5zookeeper-3.4.5data/ version-2/snapshot) が作成され、そこにスナップショットが保存されます。

クエリ: 1) zkServer.sh のように zkServer.cmd での開始/停止はないので、基本的には zkServer.cmd で開始しますが、停止するには Ctrl+C/Z を実行します。はフォアグラウンド プロセスであり、ctrl+C を実行すると強制終了されます

2) Zookeeper サービスを作成する必要があり、そのために prunsrv を使用しています。私はそうするために次の2つの方法を考え出しました。

a)   

prunsrv //IS//Zookeeper --DisplayName=" ZOOKEEPER Service" --Description=" ZOOKEEPER Service" --Startup=auto --StartMode=exe --StartPath=%ZOOKEEPER_HOME% --StartImage=%ZOOKEEPER_HOME%\bin\zkServer.cmd --StopTimeout=5 --LogPath=%LOGS_DIR% --LogPrefix=zookeeper --LogLevel=Info --PidFile=zookeeper.pid --StdOutput=auto --StdError=auto


b)  

cd %ZOOKEEPER_HOME%\bin\
                call "%~dp0zkEnv.cmd"
                set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
                prunsrv //IS//Zookeeper --DisplayName=" ZOOKEEPER Service" --Description=" ZOOKEEPER Service" --Jvm="%JVM_DLL%" --JvmOptions=!JAVA_OPTS!  --Environment=zookeeper.log.dir=%ZOO_LOG_DIR%;zookeeper.root.logger=%ZOO_LOG4J_PROP%; --Startup=auto --LibraryPath=%LIB_DIR% --StartMode=jvm --Classpath=%CLASSPATH% %ZOOMAIN% %ZOOCFG% --StartClass=org.apache.zookeeper.server.quorum.QuorumPeerMain --StartMethod=start --StopMode=jvm --StopClass=org.apache.zookeeper.server.quorum.QuorumPeerMain --StopMethod=stop --StopTimeout=10 --LogPath=%LOGS_DIR% --LogPrefix=zookeeper --LogLevel=Info --PidFile=zookeeper.pid --StdOutput=auto --StdError=auto

基本的に2番目のアプローチでは、zkServer.cmdによって実行されるすべてのタスクを自分で実行しています

=>> 私のクエリは 2 番目のステップ (2b) にあります。サービスを停止するには、停止メソッドが公開されている必要があるため、サービスを停止すると呼び出されます。したがって、現在、サービスを作成して開始すると、ZK は正常に動作しますが、停止には無期限にかかるため、プロセスを強制終了する必要があります。同じためのいくつかの stop() がありますか、shutdown() が表示されますが、その説明はありません

私はクラス org.apache.zookeeper.server.quorum.QuorumPeerMain を調べました。ここで main() は開始メソッド (私の理解が正しければ) であり、プロセスをシャットダウンするメソッドが必要です。

次のリンクを取得しました

https://issues.apache.org/jira/browse/ZOOKEEPER-1122、開始/停止を公開しますが、停止にはいくつかの問題があります

次のエラーがスローされます。

E:\zookeeper-3.4.5\zookeeper-3.4.5\bin>zkServer.cmd stop
"JMX enabled by default"
"Using config: E:\zookeeper-3.4.5\zookeeper-3.4.5\bin\..\conf\zoo.cfg"
 "Stopping zookeeper ... "
ERROR: The process with PID 452 (child process of PID 4) could not be terminated.
Reason: This is critical system process. Taskkill cannot end this process.
ERROR: The process with PID 4 (child process of PID 0) could not be terminated.
Reason: Access is denied.
ERROR: The process with PID 0 (child process of PID 0) could not be terminated.
Reason: This is critical system process. Taskkill cannot end this process.
STOPED

管理コンソールでこの停止コマンドを実行しています。

E:\zookeeper-3.4.5\zookeeper-3.4.5\bin>タスクリスト | findstr "java" java.exe 10324 コンソール 1 36,036 K.

どんな助けでも大歓迎です

4

1 に答える 1

4

したがって、Zookeeper を Windows サービスとして実行する必要があります。私は同じ要件を持っていました。ここに私が選んだ解決策があります:

  1. 前提条件: Zookeeper & prunsrv
  2. ZOOKEEPER_SERVICE環境変数を、作成する Windows サービスの名前とZOOKEEPER_HOME、Zookeeper のホーム フォルダーへのパスに設定します。それで、

    prunsrv.exe "//IS//%ZOOKEEPER_SERVICE%" ^
            --DisplayName="Zookeeper (%ZOOKEEPER_SERVICE%)" ^
            --Description="Zookeeper (%ZOOKEEPER_SERVICE%)" ^
            --Startup=auto --StartMode=exe ^
            --StartPath=%ZOOKEEPER_HOME% ^
            --StartImage=%ZOOKEEPER_HOME%\bin\zkServer.cmd ^
            --StopPath=%ZOOKEEPER_HOME%\ ^
            --StopImage=%ZOOKEEPER_HOME%\bin\zkServerStop.cmd ^
            --StopMode=exe --StopTimeout=5 ^
            --LogPath=%ZOOKEEPER_HOME% --LogPrefix=zookeeper-wrapper ^
            --PidFile=zookeeper.pid --LogLevel=Info --StdOutput=auto --StdError=auto
    
  3. 以下の内容で zkServerStop.cmd ファイルを Zookeeper の bin フォルダーに追加します。

    @echo off
    setlocal
    TASKLIST /svc | findstr /c:"%ZOOKEEPER_SERVICE%" > %ZOOKEEPER_HOME%\zookeeper_svc.pid
    FOR /F "tokens=2 delims= " %%G IN (%ZOOKEEPER_HOME%\zookeeper_svc.pid) DO (
        @set zkPID=%%G
    )
    taskkill /PID %zkPID% /T /F
    del %ZOOKEEPER_HOME%/zookeeper_svc.pid
    endlocal
    

    (もちろん、2 つの環境変数ZOOKEEPER_HOME&ZOOKEEPER_SERVICEを設定する必要があります)

役に立てば幸いです、
ギヨーム。

于 2015-08-12T08:37:02.457 に答える