Zookeeper 3.6.x 极致运维

2024-03-23 20:20
文章标签 运维 zookeeper 3.6 极致

本文主要是介绍Zookeeper 3.6.x 极致运维,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一开始让我运维 Zookeeper 是拒绝的,这东西我没搞过啊,只是一直以来都知道个大概大概而已还从来没使用过;好了,经过一段时间看官网文档和尝试,我只能说“就那样~”。

本文没有参杂过多别人的博客知识,就多看几眼 zk 官方文档,与 k8s 的官方文档中 zk 教程:运行 ZooKeeper,一个分布式协调系统;

然后升级了 start-zookeeper.sh 配置 zk 高版本,编写 zookeeper.yaml 部署 k8s 的 zk 集群;转念又想只能 k8s 单集群部署似乎不够稳啊,那就再出一个 ECS 版吧,这样 zookeeper-ECS.sh 就应运而生了。

单纯部署确实是搞掂了,但后续的一系列运维你还是得了解了解的;

  • 你不清楚 Zookeeper 选举策略,那你知道 myid 有什么特殊的含义和用途吗?
  • 你不知晓 客户端的连接方式,就设计不好它的域名,是否需要多个域名,要不要 SLB,扩缩容如何处理这层网络连接问题;
  • 你不搞好 监控+Metrics,不知何时挂了要背个大锅!
  • 你不了解 新版提供的 reconfig,就不知道居然可以热扩缩集群成员了;

极致运维之 清楚 Zookeeper 选举策略

  • zxid(事务日志 Id)值大优先,zxid 相等时 myid 值大优先
    • 再具体就不说了,看别人的博客是这么说的,我没看过源码,且根据实践来说确实是这样;(三个节点的顺序初始化,必定是第二个启动的 myid=2 为 leader,你细品)
  • 所以这里可以讨论一个问题:双主机房+第三机房架构,那么应该把 myid “最小值” 还是 “最大值” 安排在第三机房呢?
    • 若第三机房的 myid 最小值,则主节点基本不会到第三机房,那么在机房容灾时,存在主节点需重新选举;
    • 若第三机房的 myid 最大值,则主节点基本上可以常驻第三机房,那么在机房容灾时,不存在主节点需重新选举;(除非是第三机房容灾)

极致运维之 知晓客户端的连接方式

org.apache.zookeeper.client.StaticHostProvider
    // 对维护的 zk-cluster 地址列表进行 shuffle,顺序不重要,会打乱去提供选择。private List<InetSocketAddress> shuffle(Collection<InetSocketAddress> serverAddresses) {List<InetSocketAddress> tmpList = new ArrayList<>(serverAddresses.size());tmpList.addAll(serverAddresses);Collections.shuffle(tmpList, sourceOfRandomness);return tmpList;}// 对 zk-cluster 地址列表选出的做域名解析,域名可以解析出多个 ip,得到 ip 列表后再 shuffle 打乱去选择其一。private InetSocketAddress resolve(InetSocketAddress address) {try {String curHostString = address.getHostString();List<InetAddress> resolvedAddresses = new ArrayList<>(Arrays.asList(this.resolver.getAllByName(curHostString)));if (resolvedAddresses.isEmpty()) {return address;}Collections.shuffle(resolvedAddresses);return new InetSocketAddress(resolvedAddresses.get(0), address.getPort());} catch (UnknownHostException e) {LOG.error("Unable to resolve address: {}", address.toString(), e);return address;}}

总结上述的地址选择和筛选: Zookeeper 集群在内网直连使用的情况下,不需要 SLB 作中转,直连即可; 对于域名一个还是多个请看下节。

Zookeeper 集群域名
  • 可选1(推荐):仅一个域名,域名挂载集群的所有 zk-node 的 ip。(扩缩容时,仅需要在 DNS 上加减 ip 的挂载)
    在这里插入图片描述

  • 可选2:集群中每个 zk-node 都有自己的一个域名。(扩缩容时,需加减域名,并且需要变更客户端维护的地址列表!!!)
    在这里插入图片描述

  • 当然!若特殊的情况,想做机房收敛等等,请客官另外斟酌考虑~

极致运维之 监控+Metrics

  • 配置 磁盘 80% 告警
  • 端口 2181 down 告警
  • Prometheus 采集 :7000/metrics

极致运维之 reconfig:热扩缩集群成员

  • zk-Reconfig 针对 ECS 的场景更适用,扩缩容再也不怕啦~
    • 【样例】剔除 server.1
[zk: localhost:2181(CONNECTED) 8] reconfig help
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
[zk: localhost:2181(CONNECTED) 9] reconfig -remove 1
Committed new configuration:
server.2=zookeeper-1.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.3=zookeeper-2.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
version=100000003
[zk: localhost:2181(CONNECTED) 10] config
server.2=zookeeper-1.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.3=zookeeper-2.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
version=100000003
[zk: localhost:2181(CONNECTED) 11] quit[root@zookeeper-1 conf]# ll
total 32
-rw-r--r-- 1 1000 1000  535 Apr  8  2021 configuration.xsl
-rw-r--r-- 1 root root  264 Nov  9 06:43 dynamicConfigFile.cfg.dynamic
-rw-r--r-- 1 root root   84 Nov  9 06:43 java.env
-rw-r--r-- 1 1000 1000 3452 Nov  9 06:43 log4j.properties
-rw-r--r-- 1 root root  553 Nov  9 07:59 zoo.cfg
-rw-r--r-- 1 root root  323 Nov  9 06:43 zoo.cfg.dynamic.100000000
-rw-r--r-- 1 root root  215 Nov  9 07:59 zoo.cfg.dynamic.100000003
-rw-r--r-- 1 1000 1000 1148 Apr  8  2021 zoo_sample.cfg
[root@zookeeper-1 conf]# cat dynamicConfigFile.cfg.dynamic 
server.1=zookeeper-0.zookeeper-hs.default.svc.cluster.local:2888:3888;2181
server.2=zookeeper-1.zookeeper-hs.default.svc.cluster.local:2888:3888;2181
server.3=zookeeper-2.zookeeper-hs.default.svc.cluster.local:2888:3888;2181
[root@zookeeper-1 conf]# cat zoo.cfg.dynamic.100000000 
server.1=zookeeper-0.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.2=zookeeper-1.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.3=zookeeper-2.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
[root@zookeeper-1 conf]# cat zoo.cfg.dynamic.100000003
server.2=zookeeper-1.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.3=zookeeper-2.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
  • 【样例】再加回 server.1
[zk: localhost:2181(CONNECTED) 0] config
server.2=zookeeper-1.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.3=zookeeper-2.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
version=100000003
[zk: localhost:2181(CONNECTED) 2] reconfig -add server.1=zookeeper-0.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
Committed new configuration:
server.1=zookeeper-0.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.2=zookeeper-1.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.3=zookeeper-2.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
version=100000008
[zk: localhost:2181(CONNECTED) 3] config
server.1=zookeeper-0.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.2=zookeeper-1.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.3=zookeeper-2.zookeeper-hs.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
version=100000008

附录

zookeeper-ECS.sh
#!/bin/sh
##
## - server-list, examples=10.1.2.200,10.1.3.78,10.1.4.111  若三机房部署,采用 2 2 1 部署架构,建议第三机房的 1 节点 server 放在第一位,其 myid=1
## `sh zookeeper-ECS.sh [server-list]`
##USER=`whoami`
CUR_HOST_IP=`hostname -i`
CUR_PWD=`pwd`
ZK_VERSION="3.6.3"
ZK_TAR_GZ="apache-zookeeper-${ZK_VERSION}-bin.tar.gz"
ZK_PACKAGE_DIR="apache-zookeeper-${ZK_VERSION}-bin"
MYID="1"
SERVER_PORT="2888"
ELECTION_PORT="3888"
CLIENT_PORT="2181"SERVERS=${1:-${CUR_HOST_IP}}if [ ! -f ${ZK_TAR_GZ} ]; thenwget --no-check-certificate https://dlcdn.apache.org/zookeeper/zookeeper-${ZK_VERSION}/${ZK_TAR_GZ}
fiif [ ! -f ${ZK_TAR_GZ} ]; thenecho "error: has no ${ZK_TAR_GZ}"exit 1;
fitar -zxvf ${ZK_TAR_GZ}ZOO_CFG="${ZK_PACKAGE_DIR}/conf/zoo.cfg"
ZOO_CFG_DYNAMIC="${ZK_PACKAGE_DIR}/conf/dynamicConfigFile.cfg.dynamic"
ZOO_JAVA_ENV="${ZK_PACKAGE_DIR}/conf/java.env"function print_zoo_cfg() {
echo """
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=${CUR_PWD}/zkdata
dataLogDir=${CUR_PWD}/zkdata_log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
maxClientCnxns=2000
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
autopurge.purgeInterval=1#audit.enable=true## Metrics Providers @see https://prometheus.io Metrics Exporter
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true## Reconfig Enabled @see https://zookeeper.apache.org/doc/current/zookeeperReconfig.html
reconfigEnabled=true
dynamicConfigFile=/root/zoo363/conf/dynamicConfigFile.cfg.dynamic
skipACL=yes""" > ${ZOO_CFG}
}## server list
function print_servers_to_zoo_cfg_dynamic() {# 先存储旧的分隔符OLD_IFS="$IFS"# 设置 Configurations 分隔符IFS=","SERVERS_ARR=(${SERVERS})SERVERS_ARR_LEN=${#SERVERS_ARR[@]}# 恢复原来的分隔符IFS="$OLD_IFS"echo "## 集群成员列表 role is also optional, it can be participant or observer (participant by default). peerType=participant." > ${ZOO_CFG_DYNAMIC}for (( i=0; i < ${SERVERS_ARR_LEN}; i++ ))do## 判断 ip 相等获取到 myidif [ "${SERVERS_ARR[${i}]}" == "${CUR_HOST_IP}" ]; thenMYID=$((i+1))fiecho "server.$((i+1))=${SERVERS_ARR[${i}]}:$SERVER_PORT:$ELECTION_PORT;$CLIENT_PORT" >> ${ZOO_CFG_DYNAMIC}done
}## ZK_SERVER_HEAP
function print_zoo_java_env() {ZK_SERVER_HEAP_MEM=1000pyhmem=`free -m |grep "Mem:" |awk '{print $2}'`if [[ ${pyhmem} -gt 3666 ]]; thenZK_SERVER_HEAP_MEM=$((1024 * 3))elif [[ ${pyhmem} -gt 1888 ]]; thenZK_SERVER_HEAP_MEM=$((1024 * 3/2))fiecho """
### 默认值 1000,-Xmx 容量单位是 m,别自己带单位,即 -Xmx1000m
ZK_SERVER_HEAP=${ZK_SERVER_HEAP_MEM}
### 关闭 JMX
JMXDISABLE=true
""" > ${ZOO_JAVA_ENV}
}function create_zoo_data_dir() {mkdir -p ${CUR_PWD}/zkdata ${CUR_PWD}/zkdata_logecho ${MYID} > "${CUR_PWD}/zkdata/myid"
}print_zoo_cfg && print_servers_to_zoo_cfg_dynamic && print_zoo_java_env && create_zoo_data_dir && sh ${ZK_PACKAGE_DIR}/bin/zkServer.sh start
zookeeper.yaml
### @see https://kubernetes.io/zh/docs/tutorials/stateful-application/zookeeper/#创建一个-zookeeper-ensemble
#### 1. 修改字符 zk -> zookeeper
#### 2. 修改 start-zookeeper command
#### 3. 修改 podManagementPolicy: OrderedReady -> Parallel
#### 4. 使用自定义的镜像 cherish/zookeeperapiVersion: v1
kind: Service
metadata:name: zookeeper-hslabels:app: zookeeper
spec:ports:- port: 2888name: server- port: 3888name: leader-electionclusterIP: Noneselector:app: zookeeper---
apiVersion: v1
kind: Service
metadata:name: zookeeper-cslabels:app: zookeeper
spec:ports:- port: 2181name: clientselector:app: zookeeper---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:name: zookeeper-pdb
spec:selector:matchLabels:app: zookeepermaxUnavailable: 1---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: zookeeper
spec:selector:matchLabels:app: zookeeperserviceName: zookeeper-hsreplicas: 3updateStrategy:type: RollingUpdatepodManagementPolicy: Parallel ## Parallel 能批量初始化 pod 达成 3 个 pod,若是 OrderedReady 它会先创建一个 pod 在 ready 后再逐步创建后面的两个。template:metadata:labels:app: zookeeperspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: "app"operator: Invalues:- zookeepertopologyKey: "kubernetes.io/hostname"containers:- name: kubernetes-zookeeperimagePullPolicy: Alwaysimage: "cherish/zookeeper:3.6.3-20211121.154529" ## 自定义的镜像resources:requests:memory: "2Gi"cpu: "2" ##ports:- containerPort: 2181name: client- containerPort: 2888name: server- containerPort: 3888name: leader-electioncommand:- sh- -c- "/opt/zookeeper/bin/start-zookeeper.sh \--servers=3 \--data_dir=/var/lib/zookeeper/data \--data_log_dir=/var/lib/zookeeper/data_log \--log_dir=/var/log/zookeeper \--conf_dir=/opt/zookeeper/conf \--client_port=2181 \--election_port=3888 \--server_port=2888 \--tick_time=2000 \--init_limit=10 \--sync_limit=5 \--heap=1536 \--max_client_cnxns=2000 \--snap_retain_count=3 \--purge_interval=3 \--max_session_timeout=40000 \--min_session_timeout=4000 \--log_level=INFO"readinessProbe:exec:command:- sh- -c- "curl 127.0.0.1:8080/commands/ruok"initialDelaySeconds: 10timeoutSeconds: 5livenessProbe:exec:command:- sh- -c- "curl 127.0.0.1:8080/commands/ruok"initialDelaySeconds: 10timeoutSeconds: 5volumeMounts:- name: zkdatadirmountPath: /var/lib/zookeepersecurityContext:runAsUser: 1000fsGroup: 1000volumeClaimTemplates:- metadata:name: zkdatadirspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 20Gi##  -----  无 PVC 暂去掉这段提交,无 PVC 仅能作为样例,生产环境还是得有呀。
#         volumeMounts:
#         - name: zkdatadir
#           mountPath: /var/lib/zookeeper
#       securityContext:
#         runAsUser: 1000
#         fsGroup: 1000
#   volumeClaimTemplates:
#   - metadata:
#       name: zkdatadir
#     spec:
#       accessModes: [ "ReadWriteOnce" ]
#       resources:
#         requests:
#           storage: 20Gi
start-zookeeper.sh
#!/usr/bin/env bash
# Copyright 2017 The Kubernetes Authors.
#
# 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
#
# 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.
#
#
#Usage: start-zookeeper [OPTIONS]
# Starts a ZooKeeper server based on the supplied options.
#     --servers           The number of servers in the ensemble. The default
#                         value is 1.#     --data_dir          The directory where the ZooKeeper process will store its
#                         snapshots. The default is /var/lib/zookeeper/data.#     --data_log_dir      The directory where the ZooKeeper process will store its
#                         write ahead log. The default is
#                         /var/lib/zookeeper/data/log.#     --conf_dir          The directoyr where the ZooKeeper process will store its
#                         configuration. The default is /opt/zookeeper/conf.#     --client_port       The port on which the ZooKeeper process will listen for
#                         client requests. The default is 2181.#     --election_port     The port on which the ZooKeeper process will perform
#                         leader election. The default is 3888.#     --server_port       The port on which the ZooKeeper process will listen for
#                         requests from other servers in the ensemble. The
#                         default is 2888.#     --tick_time         The length of a ZooKeeper tick in ms. The default is
#                         2000.#     --init_limit        The number of Ticks that an ensemble member is allowed
#                         to perform leader election. The default is 10.#     --sync_limit        The maximum session timeout that the ensemble will
#                         allows a client to request. The default is 5.#     --heap              The maximum amount of heap to use. The format is the
#                         same as that used for the Xmx and Xms parameters to the
#                         JVM. e.g. --heap=2G. The default is 2G.#     --max_client_cnxns  The maximum number of client connections that the
#                         ZooKeeper process will accept simultaneously. The
#                         default is 60.#     --snap_retain_count The maximum number of snapshots the ZooKeeper process
#                         will retain if purge_interval is greater than 0. The
#                         default is 3.#     --purge_interval    The number of hours the ZooKeeper process will wait
#                         between purging its old snapshots. If set to 0 old
#                         snapshots will never be purged. The default is 0.#     --max_session_timeout The maximum time in milliseconds for a client session
#                         timeout. The default value is 2 * tick time.#     --min_session_timeout The minimum time in milliseconds for a client session
#                         timeout. The default value is 20 * tick time.#     --log_level         The log level for the zookeeeper server. Either FATAL,
#                         ERROR, WARN, INFO, DEBUG. The default is INFO.USER=`whoami`
HOST=`hostname -s`
DOMAIN=`hostname -d`
LOG_LEVEL=INFO
DATA_DIR="/var/lib/zookeeper/data"
DATA_LOG_DIR="/var/lib/zookeeper/data_log"
LOG_DIR="/var/log/zookeeper"
CONF_DIR="/opt/zookeeper/conf"
CLIENT_PORT=2181
SERVER_PORT=2888
ELECTION_PORT=3888
TICK_TIME=2000
INIT_LIMIT=10
SYNC_LIMIT=5
JVM_OPTS=
HEAP=2048
MAX_CLIENT_CNXNS=60
SNAP_RETAIN_COUNT=3
PURGE_INTERVAL=1
SERVERS=1
ADMINSERVER_ENABLED=true
AUDIT_ENABLE=false
METRICS_PORT=7000
JMX_DISABLE=truefunction print_usage() {
echo "\
Usage: start-zookeeper [OPTIONS]
Starts a ZooKeeper server based on the supplied options.--servers           The number of servers in the ensemble. The defaultvalue is 1.--data_dir          The directory where the ZooKeeper process will store itssnapshots. The default is /var/lib/zookeeper/data.--data_log_dir      The directory where the ZooKeeper process will store itswrite ahead log. The default is /var/lib/zookeeper/data/log.--log_dir           The directory where the ZooKeeper process will store its log.The default is /var/log/zookeeper.--conf_dir          The directory where the ZooKeeper process will store itsconfiguration. The default is /opt/zookeeper/conf.--client_port       The port on which the ZooKeeper process will listen forclient requests. The default is 2181.--election_port     The port on which the ZooKeeper process will performleader election. The default is 3888.--server_port       The port on which the ZooKeeper process will listen forrequests from other servers in the ensemble. Thedefault is 2888.--tick_time         The length of a ZooKeeper tick in ms. The default is2000.--init_limit        The number of Ticks that an ensemble member is allowedto perform leader election. The default is 10.--sync_limit        The maximum session timeout that the ensemble willallows a client to request. The default is 5.--jvm_props         The jvm opts must not contants the Xmx and Xms parameters to theJVM. e.g. -XX:+UseG1GC -XX:MaxGCPauseMillis=200. The default not set.--heap              The maximum amount of heap to use. The format is thesame as that used for the Xmx and Xms parameters to theJVM. e.g. --heap=2048. The default is 2048m.--max_client_cnxns  The maximum number of client connections that theZooKeeper process will accept simultaneously. Thedefault is 60.--snap_retain_count The maximum number of snapshots the ZooKeeper processwill retain if purge_interval is greater than 0. Thedefault is 3.--purge_interval    The number of hours the ZooKeeper process will waitbetween purging its old snapshots. If set to 0 oldsnapshots will never be purged. The default is 1.--max_session_timeout The maximum time in milliseconds for a client sessiontimeout. The default value is 2 * tick time.--min_session_timeout The minimum time in milliseconds for a client sessiontimeout. The default value is 20 * tick time.--log_level         The log level for the zookeeeper server. Either FATAL,ERROR, WARN, INFO, DEBUG. The default is INFO.--audit_enable      The audit.enable=?. The default is false.--metrics_port      The metricsProvider.httpPort=?. The default is 7000.
"
}function create_data_dirs() {if [ ! -d $DATA_DIR  ]; thenmkdir -p $DATA_DIRchown -R $USER:$USER $DATA_DIRfiif [ ! -d $DATA_LOG_DIR  ]; thenmkdir -p $DATA_LOG_DIRchown -R $USER:$USER $DATA_LOG_DIRfiif [ ! -d $LOG_DIR  ]; thenmkdir -p $LOG_DIRchown -R $USER:$USER $LOG_DIRfiif [ ! -f $ID_FILE ] && [ $SERVERS -gt 1 ]; thenecho $MY_ID >> $ID_FILEfi
}function print_servers() {for (( i=1; i<=$SERVERS; i++ ))doecho "server.$i=$NAME-$((i-1)).$DOMAIN:$SERVER_PORT:$ELECTION_PORT;$CLIENT_PORT"done
}function create_config() {rm -f $CONFIG_FILEecho "# This file was autogenerated DO NOT EDIT" >> $CONFIG_FILEecho "clientPort=$CLIENT_PORT" >> $CONFIG_FILEecho "dataDir=$DATA_DIR" >> $CONFIG_FILEecho "dataLogDir=$DATA_LOG_DIR" >> $CONFIG_FILEecho "tickTime=$TICK_TIME" >> $CONFIG_FILEecho "initLimit=$INIT_LIMIT" >> $CONFIG_FILEecho "syncLimit=$SYNC_LIMIT" >> $CONFIG_FILEecho "maxClientCnxns=$MAX_CLIENT_CNXNS" >> $CONFIG_FILEecho "minSessionTimeout=$MIN_SESSION_TIMEOUT" >> $CONFIG_FILEecho "maxSessionTimeout=$MAX_SESSION_TIMEOUT" >> $CONFIG_FILEecho "autopurge.snapRetainCount=$SNAP_RETAIN_COUNT" >> $CONFIG_FILEecho "autopurge.purgeInterval=$PURGE_INTERVAL" >> $CONFIG_FILEecho "admin.enableServer=$ADMINSERVER_ENABLED" >> $CONFIG_FILEecho "audit.enable=${AUDIT_ENABLE}" >> $CONFIG_FILEecho "## Metrics Providers @see https://prometheus.io Metrics Exporter" >> $CONFIG_FILEecho "metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider" >> $CONFIG_FILEecho "metricsProvider.exportJvmInfo=true" >> $CONFIG_FILEecho "metricsProvider.httpPort=${METRICS_PORT}" >> $CONFIG_FILEecho "## Reconfig Enabled @see https://zookeeper.apache.org/doc/current/zookeeperReconfig.html" >> $CONFIG_FILEecho "reconfigEnabled=true" >> $CONFIG_FILEecho "dynamicConfigFile=${DINAMIC_CONF_FILE}" >> $CONFIG_FILEecho "skipACL=yes" >> $CONFIG_FILEif [ $SERVERS -gt 1 ]; thenprint_servers >> $DINAMIC_CONF_FILEficat $CONFIG_FILE >&2cat $DINAMIC_CONF_FILE >&2
}function create_jvm_props() {rm -f $JAVA_ENV_FILEecho "ZOO_LOG_DIR=$LOG_DIR" >> $JAVA_ENV_FILEecho "SERVER_JVMFLAGS=${JVM_OPTS}" >> $JAVA_ENV_FILEecho "ZK_SERVER_HEAP=${HEAP}" >> $JAVA_ENV_FILEecho "JMXDISABLE=${JMX_DISABLE}" >> $JAVA_ENV_FILE
}function change_log_props() {sed -i "s!zookeeper\.log\.dir=\.!zookeeper\.log\.dir=${LOG_DIR}!g" $LOGGER_PROPS_FILE
}optspec=":hv-:"
while getopts "$optspec" optchar; docase "${optchar}" in-)case "${OPTARG}" inservers=*)SERVERS=${OPTARG##*=};;data_dir=*)DATA_DIR=${OPTARG##*=};;data_log_dir=*)DATA_LOG_DIR=${OPTARG##*=};;log_dir=*)LOG_DIR=${OPTARG##*=};;conf_dir=*)CONF_DIR=${OPTARG##*=};;client_port=*)CLIENT_PORT=${OPTARG##*=};;election_port=*)ELECTION_PORT=${OPTARG##*=};;server_port=*)SERVER_PORT=${OPTARG##*=};;tick_time=*)TICK_TIME=${OPTARG##*=};;init_limit=*)INIT_LIMIT=${OPTARG##*=};;sync_limit=*)SYNC_LIMIT=${OPTARG##*=};;jvm_props=*)JVM_OPTS=${OPTARG##*=};;heap=*)HEAP=${OPTARG##*=};;max_client_cnxns=*)MAX_CLIENT_CNXNS=${OPTARG##*=};;snap_retain_count=*)SNAP_RETAIN_COUNT=${OPTARG##*=};;purge_interval=*)PURGE_INTERVAL=${OPTARG##*=};;max_session_timeout=*)MAX_SESSION_TIMEOUT=${OPTARG##*=};;min_session_timeout=*)MIN_SESSION_TIMEOUT=${OPTARG##*=};;log_level=*)LOG_LEVEL=${OPTARG##*=};;audit_enable=*)AUDIT_ENABLE=${OPTARG##*=};;metrics_port=*)METRICS_PORT=${OPTARG##*=};;*)echo "Unknown option --${OPTARG}" >&2exit 1;;esac;;h)print_usageexit;;v)echo "Parsing option: '-${optchar}'" >&2;;*)if [ "$OPTERR" != 1 ] || [ "${optspec:0:1}" = ":" ]; thenecho "Non-option argument: '-${OPTARG}'" >&2fi;;esac
doneMIN_SESSION_TIMEOUT=${MIN_SESSION_TIMEOUT:- $((TICK_TIME*2))}
MAX_SESSION_TIMEOUT=${MAX_SESSION_TIMEOUT:- $((TICK_TIME*20))}
ID_FILE="$DATA_DIR/myid"
CONFIG_FILE="$CONF_DIR/zoo.cfg"
DINAMIC_CONF_FILE="$CONF_DIR/dynamicConfigFile.cfg.dynamic"
LOGGER_PROPS_FILE="$CONF_DIR/log4j.properties"
JAVA_ENV_FILE="$CONF_DIR/java.env"
if [[ $HOST =~ (.*)-([0-9]+)$ ]]; thenNAME=${BASH_REMATCH[1]}ORD=${BASH_REMATCH[2]}
elseecho "Fialed to parse name and ordinal of Pod"exit 1
fiMY_ID=$((ORD+1))create_config && create_jvm_props && change_log_props && create_data_dirs && exec ./bin/zkServer.sh start-foreground
Dockerfile
FROM apaas/edas:latest
MAINTAINER Cherish "785427346@qq.com"# set environment
ENV CLIENT_PORT=2181 \SERVER_PORT=2888 \ELECTION_PORT=3888 \BASE_DIR="/opt/zookeeper"WORKDIR ${BASE_DIR}# add zookeeper-?-bin.tar.gz file, override by --build-arg ZK_VERSION=3.6.3
ARG ZK_VERSION=3.6.3
RUN wget --no-check-certificate "https://dlcdn.apache.org/zookeeper/zookeeper-${ZK_VERSION}/apache-zookeeper-${ZK_VERSION}-bin.tar.gz" \&& tar -zxf apache-zookeeper-${ZK_VERSION}-bin.tar.gz --strip-components 1 -C ./ \&& rm -rf apache-zookeeper-${ZK_VERSION}-bin.tar.gzADD ./start-zookeeper.sh ${BASE_DIR}/bin/start-zookeeper.shRUN chmod +x ${BASE_DIR}/bin/start-zookeeper.shEXPOSE ${CLIENT_PORT} ${SERVER_PORT} ${ELECTION_PORT}
# examples START_ZOOKEEPER_COMMAMDS=--servers=3 --data_dir=/var/lib/zookeeper/data --data_log_dir=/var/lib/zookeeper/data/data_log --conf_dir=/opt/zookeeper/conf --client_port=2181 --election_port=3888 --server_port=2888 --tick_time=2000 --init_limit=10 --sync_limit=5 --heap=1535 --max_client_cnxns=1000 --snap_retain_count=3 --purge_interval=12 --min_session_timeout=4000 --max_session_timeout=40000 --log_level=INFO
ENTRYPOINT ${BASE_DIR}/bin/start-zookeeper.sh ${START_ZOOKEEPER_COMMAMDS}
参考文档
  • Zookeeper 官方文档
    • zk-Administrator
    • zk-Reconfig
  • 运行 ZooKeeper,一个分布式协调系统

这篇关于Zookeeper 3.6.x 极致运维的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/839435

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

网络安全运维培训一般多少钱

在当今数字化时代,网络安全已成为企业和个人关注的焦点。而网络安全运维作为保障网络安全的重要环节,其专业人才的需求也日益增长。许多人都对网络安全运维培训感兴趣,那么,网络安全运维培训一般多少钱呢?   一、影响网络安全运维培训价格的因素   1. 培训内容的深度和广度   不同的网络安全运维培训课程涵盖的内容有所不同。一些基础的培训课程可能主要涉及网络安全基础知识、常见安全工具的使用等,价

设置zookeeper开机自启动/服务化

设置启动zk的用户为zookeeper 设置启动zk的用户为zookeeper用户,而非root用户,这样比较安全。 可以使用root用户进行zookeeper的管理(启动、停止…),但对于追求卓越和安全的的人来说,采用新非root用户管理zookeeper更好。 步骤: 1. 创建用户和用户组 2. 相关目录设置用户和用户组属性 3. 采用zookeeper用户启动进程 设置z

Zookeeper集群是如何升级到新版本的

方案1:复用老数据方案 这是经过实践的升级方案,该方案是复用旧版本的数据,zk集群拓扑,配置文件都不变,只是启动的程序为最新的版本。 参考文章: Zookeeper集群是如何升级到新版本的 方案2:重新建立数据方案 该方案的思路是:先停掉一台follower的机器上的服务,然后加入一个新版本的zk(zk的数据目录是空的),然后启动新zk,之后新zk会把旧集群中的数据同步过来。之后再操作另

Zookeeper基本原理

1.什么是Zookeeper?         Zookeeper是一个开源的分布式协调服务器框架,由Apache软件基金会开发,专为分布式系统设计。它主要用于在分布式环境中管理和协调多个节点之间的配置信息、状态数据和元数据。         Zookeeper采用了观察者模式的设计理念,其核心职责是存储和管理集群中共享的数据,并为各个节点提供一致的数据视图。在Zookeeper中,客户端(如

linux运维排查常用命令(开发专享)

cd: 进入到某个目录下 cd hikvision ll:详细展示该目录下有的文件 ll su 用户名:切换用户名 例子: su root 根据字符串在文件中查找信息:Grep –a –i 字符串 文件名 例子: grep -a -i 'indexCode=4a28a0dfe0244c0cbabcd9b2c3b60327' nms.nmsweb.debug.log cat 文