zookeeper 脚本 zkServer.sh zkCli.sh zkCleanup.sh zkEnv.sh 详解(一)

学习使用zookeeper已经有一段时间了,%ZK_HOME%/bin目录下有几个常用的脚本文件,要想用好zookeeper我们必须要弄明白这几个脚本的含义和用法,在实际的生产环境下对于zookeeper自带脚本文件有时需要进行修改后使用,以便能更好地服从业务需求。

今天来总结一下zookeeper自带脚本的功能和脚本含义

%Zk_HOME%/bin目录下有7个比较有用的脚本文件其中*.sh*.cmd分别是适用于UNIX系统和Windows系统下的文件,我主要对*.sh脚本进行讲解

zkCleanup.sh 功能:清理zookeeper历史数据 -包括事务日志文件和快照数据文件 ,但是实际生产环境中很少使用,因为zookeeper3.0版本之后提供了对历史事务日志和快照                              文件的自动清理。另外在生产环境中我们一般采取自动脚本来定点定量清除指定日期的日志文件

zkCli.cmd

zkCli.sh 功能: zookeeper的简易客户端通过这个客户端可以对zookeeper服务端数据进行各种操作

                 在本机上可以直接执行./zkCli.sh  若要连接远程机器可以执行./zkCli.sh  -server  ip:port

zkEnv.cmd

zkEnv.sh 功能:设置zookeeper启动时的环境变量   这个脚本不要单独执行,它需要嵌入到zkServer.sh或者其他脚本中使用 例如:可以对其中的jdk/bin路径和zoo.cfg路径进行配置。当然为了保持脚本文件的完整性,我们一般单独编写定义环境变量的脚本然后在其他脚本文件中引入。

zkServer.cmd

zkServer.sh 功能zookeeper服务器的启动停止重启和状态查询。如

./zkServer.sh   start /etc/conf/zoo.cfg


#!/bin/sh


# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


#
# If this scripted is run out of /usr/bin or some other system bin directory
# it should be linked to and not copied. Things like java jar files are found
# relative to the canonical path of this script.
#


# See the following page for extensive details on setting
# up the JVM to accept JMX remote management:
# http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
# by default we allow local JMX connections


if [ "x$JMXLOCALONLY" = "x" ] 判断变量JMXLOCALONLY是否为空 若为空设置 JMXLOCALONLY=false
then
    JMXLOCALONLY=false
fi


if [ "x$JMXDISABLE" = "x" ]  变量JMXDISABLE若为空 使用默认的JMX 只允许本地进行连接;若不为空则不允许使用JMX
then
    echo "JMX enabled by default" >&2
    # for some reason these two options are necessary on jdk6 on Ubuntu
    #   accord to the docs they are not necessary, but otw jconsole cannot
    #   do a local attach
    ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quorum.QuorumPeerMain"
else
    echo "JMX disabled by user request" >&2
    ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"
fi


JMX(JMX java Management Extensions java管理扩展 这是一个管理功能框架 能获得系统运行时信息)
zookeeper 从3.3.0版本开始使用标准的JMX方式来对外提供运行时信息查询和便捷的管控接口,zookeeper 
默认开启JMX功能,但是只限于本地机器连接但不能通过远程机器进行连接,如果想要JMX通过远程连接需要对第40行代码
进行如下改写:
ZOOMAIN="-Dcom.sun.management.jmxremote.port=21811
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
org.apache.zookeeper.server.quorum.QuorumPeerMain"
开启21811端口不使用权限认证连接,通常情况下我们可以通过JConsole(Java监视和管理控制台)来进行JMX连接


# Only follow symlinks if readlink supports it
if readlink -f "$0" > /dev/null 2>&1  
then
  ZOOBIN=`readlink -f "$0"`  获取当前脚本文件的绝对路径
else
  ZOOBIN="$0"
fi
ZOOBINDIR=`dirname "$ZOOBIN"`  提取当前脚本所在目录


. "$ZOOBINDIR"/zkEnv.sh   执行环境设置脚本


if [ "x$SERVER_JVMFLAGS" ]
then
    JVMFLAGS="$SERVER_JVMFLAGS $JVMFLAGS"
fi


if [ "x$2" != "x" ]
then
    ZOOCFG="$ZOOCFGDIR/$2"
fi


设置zookeeper配置文件的绝对路径


# if we give a more complicated path to the config, don't screw around in $ZOOCFGDIR
if [ "x`dirname $ZOOCFG`" != "x$ZOOCFGDIR" ]
then
    ZOOCFG="$2"
    echo "Using config:$2" >&2
fi
如果我们在运行zkServer.sh 没有配置ZOOCFGDIR变量 但是指定了配置文件的绝对路径 此时 就需要如上的逻辑加以判断
直接将配置文件设为ZOOCFG="$2"




if $cygwin
then
    ZOOCFG=`cygpath -wp "$ZOOCFG"`
    # cygwin has a "kill" in the shell itself, gets confused
    KILL=/bin/kill
else
    KILL=kill
fi


echo "Using config: $ZOOCFG" >&2


if [ -z $ZOOPIDFILE ]
  then ZOOPIDFILE=$(grep dataDir "$ZOOCFG" | sed -e 's/.*=//')/zookeeper_server.pid
fi


我们在配置zookeeper时必须要新建一个名为 zookeeper_server.pid的文件 只有1行内容指定的就是zookeeper进程id
一般将这个文件放置在dataDir配置的目录下面


_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"


在zEnv.sh 脚本中将ZOO_LOG_DIR变量设置为与当前脚本为同一级目录下面


case $1 in
start)
    echo  -n "Starting zookeeper ... "
    if [ -f $ZOOPIDFILE ]; then
      if kill -0 `cat $ZOOPIDFILE` > /dev/null 2>&1; then
         echo $command already running as process `cat $ZOOPIDFILE`. 
         exit 0
      fi
    fi
    nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
    if [ $? -eq 0 ]
    then
      if /bin/echo -n $! > "$ZOOPIDFILE"
      then
        sleep 1
        echo STARTED
      else
        echo FAILED TO WRITE PID
        exit 1
      fi
    else
      echo SERVER DID NOT START
      exit 1
    fi
    ;;

运行命令zkServer.sh start启动zookeeper服务  kill -0 `cat $ZOOPIDFILE` 先检查一下server.pid进程是否存在 如果存在就表名该服务已经启动
如果pid不存在就运行启动zooKeeper服务命令  执行完成功之后将进程id写入ZOOPIDFILE文件中
注意我们这里启动是将启动java命令放入后台执行 如果想在前台执行就执行下面的参数start-foreground


start-foreground)
    ZOO_CMD="exec $JAVA"
    if [ "${ZOO_NOEXEC}" != "" ]; then
      ZOO_CMD="$JAVA"
    fi
    $ZOO_CMD "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG"
    ;;
print-cmd)
    echo "$JAVA -Dzookeeper.log.dir=\"${ZOO_LOG_DIR}\" -Dzookeeper.root.logger=\"${ZOO_LOG4J_PROP}\" -cp \"$CLASSPATH\" $JVMFLAGS $ZOOMAIN \"$ZOOCFG\" > \"$_ZOO_DAEMON_OUT\" 2>&1 < /dev/null"
    ;;


stop)
    echo -n "Stopping zookeeper ... "
    if [ ! -f "$ZOOPIDFILE" ]
    then
      echo "no zookeeper to stop (could not find file $ZOOPIDFILE)"
    else
      $KILL -9 $(cat "$ZOOPIDFILE")
      rm "$ZOOPIDFILE"
      echo STOPPED
    fi
    ;;

运行命令./zkServer.sh stop 关闭zookeeper服务端进程


upgrade)
    shift
    echo "upgrading the servers to 3.*"
    $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.server.upgrade.UpgradeMain ${@}
    echo "Upgrading ... "
    ;;
升级zookeeper服务


restart)
    shift
    "$0" stop ${@}
    sleep 3
    "$0" start ${@}
    ;;
运行./zkServer.sh restart命令重启zookeeper服务  
先调用shift命令左移一个参数 将restart参数移除 然后再执行./zkServer stop  之后进程sleep 3 再执行./zkServer start




status)
    # -q is necessary on some versions of linux where nc returns too quickly, and no stat result is output
    STAT=`$JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
             -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain localhost \
             $(grep "^[[:space:]]*clientPort" "$ZOOCFG" | sed -e 's/.*=//') srvr 2> /dev/null    \
          | grep Mode`
    if [ "x$STAT" = "x" ]
    then
        echo "Error contacting service. It is probably not running."
        exit 1
    else
        echo $STAT
        exit 0
    fi
    ;;
*)


运行srvr命令 输出服务端信息 这个状态不包括客户端的连接状况


    echo "Usage: $0 {start|start-foreground|stop|restart|status|upgrade|print-cmd}" >&2


esac



你可能感兴趣的:(zookeeper 脚本 zkServer.sh zkCli.sh zkCleanup.sh zkEnv.sh 详解(一))