本文已参与 新人创作礼 活动,一起开启掘金创作之路
ZooKeeper在很多分布式集群中都会用到,比如常用的 Hadoop、HBase、Kafka、Dubbo 等都有使用到 ZooKeeper
在使用 ZooKeeper 的时候,最好是使用 集群版的 ZooKeeper 而不是单机版的。官网给出的架构图就描述的是一个集群版的 ZooKeeper 。通常 3 台服务器就可以构成一个 ZooKeeper 集群了。
zookeeper中引入了Leader、Follower 和 Observer 三种角色。
ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器,Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,Follower 和 Observer 都只能提供读服务。Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略,因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。
为什么最好使用奇数台服务器构成 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
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
# 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
6、测试
写入数据:
# zkCli.sh -server node1:2181
create /test data
再连接另外一个节点尝试获取数据,如果能获取到数据说明集群部署成功:
# zkCli.sh -server node3:2181
get /test
7、连接集群
# zkCli.sh -server 192.168.60.100:2181,192.168.60.101:2181,192.168.60.102:2181
成功连接后的输出:
1.4 常用命令
help 输出zk支持的所有命令
create 创建一个节点(用给定的路径创建一个znode。flag参数指定创建的znode是临时的,持久的还是顺序的。默认情况下,所有znode都是持久的。创建顺序节点请添加flag:-s,ZooKeeper集合将向znode路径填充10位序列号,例如,znode路径 /myapp 将转换为/myapp0000000001,下一个序列号将为/myapp0000000002。访问顺序节点,必须输入znode的完整路径;创建临时节点,请添加flag:-e,当客户端断开连接时,临时节点将被删除)
语法:create /path /data
ls 查看指定路径下包含的节点
get 显示指定路径下节点的信息
watch 当指定的znode或znode的子数据更改时,监视器会显示通知。你只能在 get 命令中设置watch。 语法:get /path [watch] 1
set 设置节点的内容
语法:set /path /data
delete 删除一个节点 config zk服务配置的详细信息 stat 客户端与zk连接的简要信息
好了,这次的分享就到这里了,希望对大家有所帮助,我们下期再见~~