zk集群搭建

236 阅读5分钟

本文已参与 \lceil新人创作礼\rfloor 活动,一起开启掘金创作之路

ZooKeeper在很多分布式集群中都会用到,比如常用的 Hadoop、HBase、Kafka、Dubbo 等都有使用到 ZooKeeper

在使用 ZooKeeper 的时候,最好是使用 集群版的 ZooKeeper 而不是单机版的。官网给出的架构图就描述的是一个集群版的 ZooKeeper 。通常 3 台服务器就可以构成一个 ZooKeeper 集群了。

zookeeper中引入了Leader、Follower 和 Observer 三种角色。

image.png

ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器,Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,Follower 和 Observer 都只能提供读服务。Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略,因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。

image.png 为什么最好使用奇数台服务器构成 ZooKeeper 集群?

我们知道在Zookeeper中 Leader 选举算法采用了Zab协议。Zab核心思想是当多数 Server 写成功,则任务数据写成功。

①如果有3个Server,则最多允许1个Server 挂掉。

②如果有4个Server,则同样最多允许1个Server挂掉。

既然3个或者4个Server,同样最多允许1个Server挂掉,那么它们的可靠性是一样的,所以选择奇数个ZooKeeper Server即可。

1.1 规划

准备三台机器,我用的是自己创建的三台Vmware虚机,操作系统都是CentOS7.6,规划如下:

192.168.60.100     node1

192.168.60.101     node2

192.168.60.102     node3

1.2 准备工作

1、关闭防火墙和selinux(三个节点都做)

# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2、配置好hosts(三个节点都做)

# vim /etc/hosts
192.168.60.100 node1
192.168.60.101 node2
192.168.60.102 node3

image.png

image.png

image.png

3、创建数据、日志存放目录(三个节点都做)

# mkdir -p /data/zookeeper/{data,logs,tmp}

4、上传JDK和zookeeper压缩包到/data/zookeeper/tmp/下面(三个节点都做)

1.3 部署

1、解压缩

# cd /data/zookeeper
# tar -zxvf tmp/jdk-8u172-linux-x64.tar.gz -C ./
# tar -zxvf tmp/apache-zookeeper-3.5.5-bin.tar.gz -C ./

2、配置jdk和zookeeper环境变量

# vi /etc/profile

加入:
#JAVA ENV
export JAVA_HOME=/data/zookeeper/jdk1.8.0_172
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
#ZK ENV
export ZK_HOME=/data/zookeeper/apache-zookeeper-3.5.5-bin
export PATH=$PATH:$ZK_HOME/bin

# source /etc/profile
# java -version

3、修改zookeeper配置文件

# cd apache-zookeeper-3.5.5-bin/conf
# vim log4j.properties

image.png

# mv zoo_sample.cfg zoo.cfg
# vim zoo.cfg    //所有的zk进程可以使用相同的配置文件

tickTime=2000\
initLimit=10\
syncLimit=5

dataDir=/data/zookeeper/data

clientPort=2181\
server.1=node1:2888:3888\
server.2=node2:2888:3888\
server.3=node3:2888:3888

参数说明:

  • initLimit

    ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。

    当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。initLimit配置follower与leader之间建立连接后进行同步的最长时间。

  • syncLimit

    配置follower和leader之间发送消息,请求和应答的最大时间长度。

  • tickTime

    tickTime则是上述两个超时配置的基本单位,例如对于initLimit,其配置值为5,说明其超时时间为 2000ms * 5 = 10秒。

  • server.id=host:port1:port2

    其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。

  • dataDir

    其配置的含义跟单机模式下的含义类似,不同的是集群模式下还有一个myid文件。myid文件的内容只有一行,且内容只能为1 - 255之间的数字,这个数字亦即上面介绍server.id中的id,表示zk进程的id。

4、创建myid文件

node1上:
# echo "1" > /data/zookeeper/data/myid

node2上:
# echo "2" > /data/zookeeper/data/myid


node3上:
# echo "3" > /data/zookeeper/data/myid

5、启动集群服务

三个节点上都启动zk

# zkServer.sh start
# zkCli.sh status

image.png

image.png

image.png

6、测试

写入数据:

# zkCli.sh -server node1:2181
create /test data

image.png

再连接另外一个节点尝试获取数据,如果能获取到数据说明集群部署成功:

# zkCli.sh -server node3:2181
get /test

image.png

7、连接集群

# zkCli.sh -server 192.168.60.100:2181,192.168.60.101:2181,192.168.60.102:2181

成功连接后的输出: image.png

1.4 常用命令

help       输出zk支持的所有命令 image.png

create     创建一个节点(用给定的路径创建一个znode。flag参数指定创建的znode是临时的,持久的还是顺序的。默认情况下,所有znode都是持久的。创建顺序节点请添加flag:-s,ZooKeeper集合将向znode路径填充10位序列号,例如,znode路径 /myapp 将转换为/myapp0000000001,下一个序列号将为/myapp0000000002。访问顺序节点,必须输入znode的完整路径;创建临时节点,请添加flag:-e,当客户端断开连接时,临时节点将被删除) 语法:create /path /data image.png

ls         查看指定路径下包含的节点 image.png

get        显示指定路径下节点的信息

image.png

watch  当指定的znode或znode的子数据更改时,监视器会显示通知。你只能在 get 命令中设置watch。 语法:get /path [watch] 1

set        设置节点的内容 语法:set /path /data image.png

delete     删除一个节点 config  zk服务配置的详细信息 stat 客户端与zk连接的简要信息

好了,这次的分享就到这里了,希望对大家有所帮助,我们下期再见~~