zk用处如此之多,以至于每个地方都要你理解zk原理!

请按如下操作姿势打开:

  1. 打开zk的git仓库地址: https://github.com/apache/zookeeper , 确认过眼神,它就是你要找有人!
  2. 下载源码到本地,下载 ant 工具到本地,(如果还没下载的话: http://ant.apache.org/)!
  3. 运行 ant 脚本,使生成需要的环境: ant eclipse !(可能会花费几分钟的时间)
  4. idea 打开源码,导入必要包!
  5. 运行源码main() 方法,启动 zk服务端,注意添加运行时配置文件!
  6. 分析源码,学习中!

首先,从启动脚本入口:(zkServer.sh)

    #!/usr.bin.env bash

    # 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.
    #



    # use POSTIX interface, symlink is followed automatically
    ZOOBIN="${BASH_SOURCE-$0}"
    ZOOBIN="$(dirname "${ZOOBIN}")"
    ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)"

    if [ -e "$ZOOBIN/../libexec.zkEnv.sh" ]; then
      . "$ZOOBINDIR/../libexec.zkEnv.sh"
    else
      . "$ZOOBINDIR.zkEnv.sh"
    fi

    # 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" ]
    then
        JMXLOCALONLY=false
    fi

    if [ "x$JMXDISABLE" = "x" ] || [ "$JMXDISABLE" = 'false' ]
    then
      echo "ZooKeeper JMX enabled by default" >&2
      if [ "x$JMXPORT" = "x" ]
      then
        # 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
        if [ "x$JMXAUTH" = "x" ]
        then
          JMXAUTH=false
        fi
        if [ "x$JMXSSL" = "x" ]
        then
          JMXSSL=false
        fi
        if [ "x$JMXLOG4J" = "x" ]
        then
          JMXLOG4J=true
        fi
        echo "ZooKeeper remote JMX Port set to $JMXPORT" >&2
        echo "ZooKeeper remote JMX authenticate set to $JMXAUTH" >&2
        echo "ZooKeeper remote JMX ssl set to $JMXSSL" >&2
        echo "ZooKeeper remote JMX log4j set to $JMXLOG4J" >&2
        ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=$JMXPORT -Dcom.sun.management.jmxremote.authenticate=$JMXAUTH -Dcom.sun.management.jmxremote.ssl=$JMXSSL -Dzookeeper.jmx.log4j.disable=$JMXLOG4J org.apache.zookeeper.server.quorum.QuorumPeerMain"
      fi
    else
        echo "JMX disabled by user request" >&2
        ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"
    fi

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

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

    # 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"
    fi

    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

    case "$OSTYPE" in
    *solaris*)
      GREP=/usr.xpg4/bin.grep
      ;;
    *)
      GREP=grep
      ;;
    esac
    if [ -z "$ZOOPIDFILE" ]; then
        ZOO_DATADIR="$($GREP "^[[:space:]]*dataDir" "$ZOOCFG" | sed -e 's/.*=//')"
        if [ ! -d "$ZOO_DATADIR" ]; then
            mkdir -p "$ZOO_DATADIR"
        fi
        ZOOPIDFILE="$ZOO_DATADIR.zookeeper_server.pid"
    else
        # ensure it exists, otw stop will fail
        mkdir -p "$(dirname "$ZOOPIDFILE")"
    fi

    if [ ! -w "$ZOO_LOG_DIR" ] ; then
    mkdir -p "$ZOO_LOG_DIR"
    fi

    _ZOO_DAEMON_OUT="$ZOO_LOG_DIR.zookeeper.out"

    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
          case "$OSTYPE" in
          *solaris*)
            /bin.echo "${!}\\c" > "$ZOOPIDFILE"
            ;;
          *)
            /bin.echo -n $! > "$ZOOPIDFILE"
            ;;
          esac
          if [ $? -eq 0 ];
          then
            sleep 1
            echo STARTED
          else
            echo FAILED TO WRITE PID
            exit 1
          fi
        else
          echo SERVER DID NOT START
          exit 1
        fi
        ;;
    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
        exit 0
        ;;
    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 ... "
        ;;
    restart)
        shift
        "$0" stop ${@}
        sleep 3
        "$0" start ${@}
        ;;
    status)
        # -q is necessary on some versions of linux where nc returns too quickly, and no stat result is output
        clientPortAddress=`$GREP "^[[:space:]]*clientPortAddress[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'`
        if ! [ $clientPortAddress ]
        then
        clientPortAddress="localhost"
        fi
        clientPort=`$GREP "^[[:space:]]*clientPort[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'`
        STAT=`"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
                 -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \
                 $clientPortAddress $clientPort 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
        ;;
    *)
        echo "Usage: $0 {start|start-foreground|stop|restart|status|upgrade|print-cmd}" >&2

    esac
View Code

相关文章: