You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@heron.apache.org by ni...@apache.org on 2021/04/18 06:18:20 UTC

[incubator-heron] branch master updated: Use the proper featured Zookeeper config generation script (#3688)

This is an automated email from the ASF dual-hosted git repository.

nicknezis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-heron.git


The following commit(s) were added to refs/heads/master by this push:
     new db5c992  Use the proper featured Zookeeper config generation script (#3688)
db5c992 is described below

commit db5c992d30e0f0357256b0df519fa630ddc8260e
Author: Nicholas Nezis <ni...@gmail.com>
AuthorDate: Sun Apr 18 02:18:12 2021 -0400

    Use the proper featured Zookeeper config generation script (#3688)
    
    * Updates to make Zookeeper configurable through the Helm chart logic
---
 deploy/kubernetes/helm/templates/zookeeper.yaml  |   4 -
 docker/base/scripts/generate-zookeeper-config.sh |  27 ++--
 docker/base/scripts/install-zookeeper.sh         |   8 +-
 docker/dist/scripts/generate-zookeeper-config.sh | 174 ++++++++++++++++++-----
 4 files changed, 161 insertions(+), 52 deletions(-)

diff --git a/deploy/kubernetes/helm/templates/zookeeper.yaml b/deploy/kubernetes/helm/templates/zookeeper.yaml
index 537d1bc..725957f 100644
--- a/deploy/kubernetes/helm/templates/zookeeper.yaml
+++ b/deploy/kubernetes/helm/templates/zookeeper.yaml
@@ -118,10 +118,6 @@ spec:
           value: "{{ .Values.zookeeper.serverPort }}"
         - name: ZK_ELECTION_PORT
           value: "{{ .Values.zookeeper.leaderElectionPort }}"
-        - name: ZOOKEEPER_SERVERS
-          {{- $replicaCount := int .Values.zkReplicas }}
-          {{- $fullName := printf "%s-%s" .Release.Name "zookeeper" }}
-          value: "{{ range $i, $e := until $replicaCount }}{{ $fullName }}-{{ $e }},{{ end }}"
         command:
         - sh
         - -c
diff --git a/docker/base/scripts/generate-zookeeper-config.sh b/docker/base/scripts/generate-zookeeper-config.sh
index 02febd1..8e7a6df 100644
--- a/docker/base/scripts/generate-zookeeper-config.sh
+++ b/docker/base/scripts/generate-zookeeper-config.sh
@@ -1,17 +1,20 @@
 #!/usr/bin/env bash
-# Copyright 2016 The Kubernetes Authors.
+# 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
 #
-# Licensed 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
 #
-#     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.
+# 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.
 
 ZK_USER=${ZK_USER:-"zookeeper"}
 ZK_LOG_LEVEL=${ZK_LOG_LEVEL:-"INFO"}
@@ -98,6 +101,8 @@ function create_config() {
   echo "maxSessionTimeout=$ZK_MAX_SESSION_TIMEOUT" >> $ZK_CONFIG_FILE
   echo "autopurge.snapRetainCount=$ZK_SNAP_RETAIN_COUNT" >> $ZK_CONFIG_FILE
   echo "autopurge.purgeInteval=$ZK_PURGE_INTERVAL" >> $ZK_CONFIG_FILE
+  echo "# Enable all four letter word commands by default" >> $ZK_CONFIG_FILE
+  echo "4lw.commands.whitelist=*" >> $ZK_CONFIG_FILE
 
   if [ $ZK_REPLICAS -gt 1 ]; then
     print_servers >> $ZK_CONFIG_FILE
diff --git a/docker/base/scripts/install-zookeeper.sh b/docker/base/scripts/install-zookeeper.sh
index ea86e91..4e772fb 100644
--- a/docker/base/scripts/install-zookeeper.sh
+++ b/docker/base/scripts/install-zookeeper.sh
@@ -40,10 +40,10 @@ rm -rf \
 # copy zk scripts
 mkdir -p /opt/zookeeper/scripts
 cp /opt/heron-docker/scripts/generate-zookeeper-config.sh /opt/zookeeper/scripts/
-chmod +x /opt/heron-docker/scripts/generate-zookeeper-config.sh
+chmod +x /opt/zookeeper/scripts/generate-zookeeper-config.sh
 cp /opt/heron-docker/scripts/zookeeper-ruok.sh /opt/zookeeper/scripts/
-chmod +x /opt/heron-docker/scripts/zookeeper-ruok.sh
+chmod +x /opt/zookeeper/scripts/zookeeper-ruok.sh
 cp /opt/heron-docker/scripts/start-zookeeper.sh /opt/zookeeper/scripts/
-chmod +x /opt/heron-docker/scripts/start-zookeeper.sh
+chmod +x /opt/zookeeper/scripts/start-zookeeper.sh
 cp /opt/heron-docker/scripts/wait-for-zookeeper.sh /opt/zookeeper/scripts/
-chmod +x /opt/heron-docker/scripts/wait-for-zookeeper.sh
+chmod +x /opt/zookeeper/scripts/wait-for-zookeeper.sh
\ No newline at end of file
diff --git a/docker/dist/scripts/generate-zookeeper-config.sh b/docker/dist/scripts/generate-zookeeper-config.sh
index 678707a..14473c3 100755
--- a/docker/dist/scripts/generate-zookeeper-config.sh
+++ b/docker/dist/scripts/generate-zookeeper-config.sh
@@ -6,9 +6,9 @@
 # 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
@@ -16,39 +16,147 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# Apply env variables to config file and start the regular command
+ZK_USER=${ZK_USER:-"zookeeper"}
+ZK_LOG_LEVEL=${ZK_LOG_LEVEL:-"INFO"}
+ZK_DATA_DIR=${ZK_DATA_DIR:-"/var/lib/zookeeper/data"}
+ZK_DATA_LOG_DIR=${ZK_DATA_LOG_DIR:-"/var/lib/zookeeper/log"}
+ZK_LOG_DIR=${ZK_LOG_DIR:-"var/log/zookeeper"}
+ZK_CONF_DIR=${ZK_CONF_DIR:-"/opt/zookeeper/conf"}
+ZK_CLIENT_PORT=${ZK_CLIENT_PORT:-2181}
+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/zookeeper.conf"
+LOGGER_PROPS_FILE="$ZK_CONF_DIR/log4j.properties"
+JAVA_ENV_FILE="$ZK_CONF_DIR/java.env"
+HOST=`hostname -s`
+DOMAIN=`hostname -d`
 
-CONF_FILE=$1
+function print_servers() {
+  for (( i=1; i<=$ZK_REPLICAS; i++ ))
+  do
+    echo "server.$i=$NAME-$((i-1)).$DOMAIN:$ZK_SERVER_PORT:$ZK_ELECTION_PORT"
+  done
+}
 
-if [ $? != 0 ]; then
-  echo "Error: Failed to apply changes to config file"
-  exit 1
-fi
+function validate_env() {
+  echo "Validating enviornment"
+  if [ -z $ZK_REPLICAS ]; then
+    echo "ZK_REPLICAS is a mandatory environment variable"
+    exit 1
+  fi
 
-DOMAIN=`hostname -d`
+  if [[ $HOST =~ (.*)-([0-9]+)$ ]]; then
+    NAME=${BASH_REMATCH[1]}
+    ORD=${BASH_REMATCH[2]}
+  else
+    echo "Failed to extract ordinal from hostname $HOST"
+    exit 1
+  fi
+  MY_ID=$((ORD+1))
+  echo "ZK_REPLICAS=$ZK_REPLICAS"
+  echo "MY_ID=$MY_ID"
+  echo "ZK_LOG_LEVEL=$ZK_LOG_LEVEL"
+  echo "ZK_DATA_DIR=$ZK_DATA_DIR"
+  echo "ZK_DATA_LOG_DIR=$ZK_DATA_LOG_DIR"
+  echo "ZK_LOG_DIR=$ZK_LOG_DIR"
+  echo "ZK_CLIENT_PORT=$ZK_CLIENT_PORT"
+  echo "ZK_SERVER_PORT=$ZK_SERVER_PORT"
+  echo "ZK_ELECTION_PORT=$ZK_ELECTION_PORT"
+  echo "ZK_TICK_TIME=$ZK_TICK_TIME"
+  echo "ZK_INIT_LIMIT=$ZK_INIT_LIMIT"
+  echo "ZK_SYNC_LIMIT=$ZK_SYNC_LIMIT"
+  echo "ZK_MAX_CLIENT_CNXNS=$ZK_MAX_CLIENT_CNXNS"
+  echo "ZK_MIN_SESSION_TIMEOUT=$ZK_MIN_SESSION_TIMEOUT"
+  echo "ZK_MAX_SESSION_TIMEOUT=$ZK_MAX_SESSION_TIMEOUT"
+  echo "ZK_HEAP_SIZE=$ZK_HEAP_SIZE"
+  echo "ZK_SNAP_RETAIN_COUNT=$ZK_SNAP_RETAIN_COUNT"
+  echo "ZK_PURGE_INTERVAL=$ZK_PURGE_INTERVAL"
+  echo "ENSEMBLE"
+  print_servers
+  echo "Enviorment validation successful"
+}
+
+function create_config() {
+  rm -f $ZK_CONFIG_FILE
+  echo "Creating ZooKeeper configuration"
+  echo "#This file was autogenerated by k8szk DO NOT EDIT" >> $ZK_CONFIG_FILE
+  echo "clientPort=$ZK_CLIENT_PORT" >> $ZK_CONFIG_FILE
+  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.purgeInteval=$ZK_PURGE_INTERVAL" >> $ZK_CONFIG_FILE
+  echo "# Enable all four letter word commands by default" >> $ZK_CONFIG_FILE
+  echo "4lw.commands.whitelist=*" >> $ZK_CONFIG_FILE
+
+  if [ $ZK_REPLICAS -gt 1 ]; then
+    print_servers >> $ZK_CONFIG_FILE
+  fi
+  echo "Wrote ZooKeeper configuration file to $ZK_CONFIG_FILE"
+}
+
+function create_data_dirs() {
+  echo "Creating ZooKeeper data directories and setting permissions"
+  if [ ! -d $ZK_DATA_DIR  ]; then
+    mkdir -p $ZK_DATA_DIR
+    chown -R $ZK_USER:$ZK_USER $ZK_DATA_DIR
+  fi
 
-# Generate list of servers and detect the current server ID,
-# based on the hostname
-IDX=1
-for SERVER in $(echo $ZOOKEEPER_SERVERS | tr "," "\n")
-do
-    echo "server.$IDX=$SERVER.$DOMAIN:2888:3888" >> $CONF_FILE
-
-    if [ "$HOSTNAME" == "$SERVER" ]; then
-        MY_ID=$IDX
-        echo "Current server id $MY_ID"
-    fi
-
-	((IDX++))
-done
-
-# For ZooKeeper container we need to initialize the ZK id
-if [ ! -z "$MY_ID" ]; then
-    # Get ZK data dir
-    DATA_DIR=`grep '^dataDir=' $CONF_FILE | awk -F= '{print $2}'`
-    if [ ! -e $DATA_DIR/myid ]; then
-        echo "Creating $DATA_DIR/myid with id = $MY_ID"
-        mkdir -p $DATA_DIR
-        echo $MY_ID > $DATA_DIR/myid
-    fi
+  if [ ! -d $ZK_DATA_LOG_DIR  ]; then
+    mkdir -p $ZK_DATA_LOG_DIR
+    chown -R $ZK_USER:$ZK_USER $ZK_DATA_LOG_DIR
+  fi
+
+  if [ ! -d $ZK_LOG_DIR  ]; then
+    mkdir -p $ZK_LOG_DIR
+    chown -R $ZK_USER:$ZK_USER $ZK_LOG_DIR
+  fi
+  if [ ! -f $ID_FILE ]; then
+    echo $MY_ID >> $ID_FILE
+  fi
+  echo "Created ZooKeeper data directories and set permissions in $ZK_DATA_DIR"
+}
+
+function create_log_props () {
+  rm -f $LOGGER_PROPS_FILE
+  echo "Creating ZooKeeper log4j configuration"
+  echo "zookeeper.root.logger=CONSOLE" >> $LOGGER_PROPS_FILE
+  echo "zookeeper.console.threshold="$ZK_LOG_LEVEL >> $LOGGER_PROPS_FILE
+  echo "log4j.rootLogger=\${zookeeper.root.logger}" >> $LOGGER_PROPS_FILE
+  echo "log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender" >> $LOGGER_PROPS_FILE
+  echo "log4j.appender.CONSOLE.Threshold=\${zookeeper.console.threshold}" >> $LOGGER_PROPS_FILE
+  echo "log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout" >> $LOGGER_PROPS_FILE
+  echo "log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n" >> $LOGGER_PROPS_FILE
+  echo "Wrote log4j configuration to $LOGGER_PROPS_FILE"
+}
+
+function create_java_env() {
+  rm -f $JAVA_ENV_FILE
+  echo "Creating JVM configuration file"
+  echo "ZOO_LOG_DIR=$ZK_LOG_DIR" >> $JAVA_ENV_FILE
+  echo "JVMFLAGS=\"-Xmx$ZK_HEAP_SIZE -Xms$ZK_HEAP_SIZE\"" >> $JAVA_ENV_FILE
+  echo "Wrote JVM configuration to $JAVA_ENV_FILE"
+}
+
+if [ "$#" -ne 1 ]; then
+  echo "Usage: $0 <configuration-file>"
+  exit 1
 fi
+
+ZK_CONFIG_FILE=$1
+validate_env && create_config && create_log_props && create_data_dirs && create_java_env