zk伪集群部署实践

229 阅读4分钟

1、下载并解压

通过官网下载文件,tar -zxvf tar.gz结合mv apache-zookeeper-3.7.1 apache-zookeeper-2181解压并重命名,生成3个节点的源码文件

2、修改配置文件

2.1、修改JVM参数

3个节点,每个节点都需要修改JVM参数,位置:/root/zk/apache-zookeeper-2181/bin,修改zkServer.sh,部分配置文件为:-Xmx150M -Xms150M

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 1
      fi
    fi
    nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \
    "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \
    -cp "$CLASSPATH" $JVMFLAGS -Xmx150M -Xms150M $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 ];

2.2、修改zoo.cfg

压缩文件解压后conf中的文件为:zoo_sample.cfg,需要修改为zoo.cfg,同时需要配置该文件,首先介绍该文件中部分参数的含义:

  1. 基本配置,这些参数都是zk运行所必须的,如果不配置那么zk启动不起来
  • clientPort:当前服务器对外的服务端口,客户端通过该端口与当前服务器创建连接,一般设置为2181,同时,每台zk都可以配置任意可用端口,集群中所有的服务器不要求clientPort一致;
  • dataDir:zk服务器存储快照数据的目录,默认如果没有配置dataLogDir,那么事务日志也会存储在这个目录中,由于事务日志的写性能直接影响zk的整体服务能力,其对磁盘的IO能力要求非常高,因此建议通过dataDir+dataLogDir的方式来配置,此处使用默认值存储在一个目录中;
  • tickTime:配置zk中最小时间单元,很多运行时的时间间隔都是tickTime的整数倍来表示的,例如,session的最小超时时间是minSessionTimeout=2*tickTime
  1. 高级配置,介绍几个主要的,还有一些额外的参数
  • initLimit:leader等待follower启动,并完成数据同步的时间,一般使用默认值10即可,代表tickTime*10
  • syncLimit:leader和follower之间进行心跳检测的最大延迟时间,如果超过该时间后leader未收到follower的心跳检测响应,那么认为该follower已断开同步,一般使用默认值5即可,代表tickTime*5
  • server.id=host:port1:port2:配置zk集群的机器列表
    • id:serverId,当前zk服务器启动时,根据myid的中的serverId来确定自己是哪台服务器,并使用配置中对应的端口来启动
    • host:地址
    • port1:用于指定follower和leader进行运行时通信和数据同步时所使用的端口
    • port2:leader选举过程中的投票端口
  • electionAlg:之前的版本中,可以使用该参数来配置zk leaderElection algorithm,但是从3.4.0版本开始,只保留了fastLeaderElection算法,因此该参数已失效
  1. 通过上述描述,在3个节点上我们的配置分别如下,以client1节点为例,贴出了配置文件
  • clientPort=2181,clientPort=2182,clientPort=2183
  • dataDir=/root/zk/zookeeper1,dataDir=/root/zk/zookeeper2,dataDir=/root/zk/zookeeper3
  • server.N集群节点信息配置,3个节点保持一致,注意:一开始我配置的不是127的ip而是阿里云的公网ip但是发现节点启动后连接不上,所以使用了127的ip,单一节点启动后也是正常的
# 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,...
dataDir=/root/zk/zookeeper1
# 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=60
#
# 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

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true

server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

2.3、新增myid

在上一节中,针对于每一个节点,我们均配置了dataDir的地址

  1. 在dataDir所配置的目录下,创建一个名为myid的文件
  2. 在该文件的第一行写上一个数字,和zoo.cfg中当前机器上的编号对应上

3、启动并验证

进入节点所在的bin目录,使用zkServer.sh脚本进行启动

[root@XXXXX bin]# /root/zk/apache-zookeeper-2181/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/zk/apache-zookeeper-2181/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@XXXXX bin]#

启动一台机器后,jmap发现jvm启动参数生效

[root@XXXXXX conf]# jmap -heap 24145
Attaching to process ID 24145, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.342-b07

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 157286400 (150.0MB)
   NewSize                  = 52428800 (50.0MB)
   MaxNewSize               = 52428800 (50.0MB)
   OldSize                  = 104857600 (100.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:...[略]

启动2台机器后,查看状态信息

[root@XXXXX conf]# /root/zk/apache-zookeeper-2182/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/zk/apache-zookeeper-2182/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: leader