#!/bin/bash set -a ROOT=$(echo /apache-zookeeper-*) ZK_USER=${ZK_USER:-"zookeeper"} ZK_LOG_LEVEL=${ZK_LOG_LEVEL:-"INFO"} ZK_DATA_DIR=${ZK_DATA_DIR:-"/data"} ZK_DATA_LOG_DIR=${ZK_DATA_LOG_DIR:-"/data/log"} ZK_CONF_DIR=${ZK_CONF_DIR:-"/conf"} ZK_CLIENT_PORT=${ZK_CLIENT_PORT:-2181} ZK_SSL_CLIENT_PORT=${ZK_SSL_CLIENT_PORT:-2281} ZK_SERVER_PORT=${ZK_SERVER_PORT:-2888} ZK_ELECTION_PORT=${ZK_ELECTION_PORT:-3888} ZK_TICK_TIME=${ZK_TICK_TIME:-2000} ZK_INIT_LIMIT=${ZK_INIT_LIMIT:-10} ZK_SYNC_LIMIT=${ZK_SYNC_LIMIT:-5} ZK_HEAP_SIZE=${ZK_HEAP_SIZE:-2G} ZK_MAX_CLIENT_CNXNS=${ZK_MAX_CLIENT_CNXNS:-60} ZK_MIN_SESSION_TIMEOUT=${ZK_MIN_SESSION_TIMEOUT:- $((ZK_TICK_TIME*2))} ZK_MAX_SESSION_TIMEOUT=${ZK_MAX_SESSION_TIMEOUT:- $((ZK_TICK_TIME*20))} ZK_SNAP_RETAIN_COUNT=${ZK_SNAP_RETAIN_COUNT:-3} ZK_PURGE_INTERVAL=${ZK_PURGE_INTERVAL:-0} ID_FILE="$ZK_DATA_DIR/myid" ZK_CONFIG_FILE="$ZK_CONF_DIR/zoo.cfg" LOG4J_PROPERTIES="$ZK_CONF_DIR/log4j.properties" HOST=$(hostname) DOMAIN=`hostname -d` JVMFLAGS="-Xmx$ZK_HEAP_SIZE -Xms$ZK_HEAP_SIZE" APPJAR=$(echo $ROOT/*jar) CLASSPATH="${ROOT}/lib/*:${APPJAR}:${ZK_CONF_DIR}:" if [[ $HOST =~ (.*)-([0-9]+)$ ]]; then NAME=${BASH_REMATCH[1]} ORD=${BASH_REMATCH[2]} MY_ID=$((ORD+1)) else echo "Failed to extract ordinal from hostname $HOST" exit 1 fi mkdir -p $ZK_DATA_DIR mkdir -p $ZK_DATA_LOG_DIR echo $MY_ID >> $ID_FILE if [[ -f /tls/server/ca.crt ]]; then cp /tls/server/ca.crt /data/server-ca.pem cat /tls/server/tls.crt /tls/server/tls.key > /data/server.pem fi if [[ -f /tls/client/ca.crt ]]; then cp /tls/client/ca.crt /data/client-ca.pem cat /tls/client/tls.crt /tls/client/tls.key > /data/client.pem fi echo "dataDir=$ZK_DATA_DIR" >> $ZK_CONFIG_FILE echo "dataLogDir=$ZK_DATA_LOG_DIR" >> $ZK_CONFIG_FILE echo "tickTime=$ZK_TICK_TIME" >> $ZK_CONFIG_FILE echo "initLimit=$ZK_INIT_LIMIT" >> $ZK_CONFIG_FILE echo "syncLimit=$ZK_SYNC_LIMIT" >> $ZK_CONFIG_FILE echo "maxClientCnxns=$ZK_MAX_CLIENT_CNXNS" >> $ZK_CONFIG_FILE echo "minSessionTimeout=$ZK_MIN_SESSION_TIMEOUT" >> $ZK_CONFIG_FILE echo "maxSessionTimeout=$ZK_MAX_SESSION_TIMEOUT" >> $ZK_CONFIG_FILE echo "autopurge.snapRetainCount=$ZK_SNAP_RETAIN_COUNT" >> $ZK_CONFIG_FILE echo "autopurge.purgeInterval=$ZK_PURGE_INTERVAL" >> $ZK_CONFIG_FILE echo "4lw.commands.whitelist=*" >> $ZK_CONFIG_FILE # Client TLS configuration if [[ -f /tls/client/ca.crt ]]; then echo "secureClientPort=$ZK_SSL_CLIENT_PORT" >> $ZK_CONFIG_FILE echo "ssl.keyStore.location=/data/client.pem" >> $ZK_CONFIG_FILE echo "ssl.trustStore.location=/data/client-ca.pem" >> $ZK_CONFIG_FILE else echo "clientPort=$ZK_CLIENT_PORT" >> $ZK_CONFIG_FILE fi # Server TLS configuration if [[ -f /tls/server/ca.crt ]]; then echo "serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory" >> $ZK_CONFIG_FILE echo "sslQuorum=true" >> $ZK_CONFIG_FILE echo "ssl.quorum.keyStore.location=/data/server.pem" >> $ZK_CONFIG_FILE echo "ssl.quorum.trustStore.location=/data/server-ca.pem" >> $ZK_CONFIG_FILE fi for (( i=1; i<=$ZK_REPLICAS; i++ )) do echo "server.$i=$NAME-$((i-1)).$DOMAIN:$ZK_SERVER_PORT:$ZK_ELECTION_PORT" >> $ZK_CONFIG_FILE done rm -f $LOG4J_PROPERTIES echo "zookeeper.root.logger=$ZK_LOG_LEVEL, CONSOLE" >> $LOG4J_PROPERTIES echo "zookeeper.console.threshold=$ZK_LOG_LEVEL" >> $LOG4J_PROPERTIES echo "zookeeper.log.threshold=$ZK_LOG_LEVEL" >> $LOG4J_PROPERTIES echo "zookeeper.log.dir=$ZK_DATA_LOG_DIR" >> $LOG4J_PROPERTIES echo "zookeeper.log.file=zookeeper.log" >> $LOG4J_PROPERTIES echo "zookeeper.log.maxfilesize=256MB" >> $LOG4J_PROPERTIES echo "zookeeper.log.maxbackupindex=10" >> $LOG4J_PROPERTIES echo "zookeeper.tracelog.dir=$ZK_DATA_LOG_DIR" >> $LOG4J_PROPERTIES echo "zookeeper.tracelog.file=zookeeper_trace.log" >> $LOG4J_PROPERTIES echo "log4j.rootLogger=\${zookeeper.root.logger}" >> $LOG4J_PROPERTIES echo "log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender" >> $LOG4J_PROPERTIES echo "log4j.appender.CONSOLE.Threshold=\${zookeeper.console.threshold}" >> $LOG4J_PROPERTIES echo "log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout" >> $LOG4J_PROPERTIES echo "log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n" >> $LOG4J_PROPERTIES if [ -n "$JMXDISABLE" ] then MAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain else MAIN="-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 set -x exec java -cp "$CLASSPATH" $JVMFLAGS $MAIN $ZK_CONFIG_FILE