携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情。
之前我们说过,Zookeeper是一个开源的、分布式的并为分布式应用提供协调服务的Apache项目。从设计模式角度来理解Zookeeper,它是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理数据,然后接受观察者的注册,一旦这些数据的状态发生了变化,Zookeeper就负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
这篇文章我们主要讲一下 Zookeeper的安装 和 API应用。
Zookeeper安装
1. Zookeeper安装部署
(1)安装前准备
之前我们搭建好了数据分布式集群架构,创建了三个分布式节点 hadoop102 、 hadoop103 、 hadoop104,并且安装了 JDK 、 Hadoop。
(2)集群规划
在hadoop102、hadoop103 和 hadoop104 三个节点上部署Zookeeper。
(3)解压安装并同步三个节点
[leony@hadoop102 software]$ tar -zxvf zookeeper-3.5.7.tar.gz -C /opt/module/
[leony@hadoop102 module]$ xsync zookeeper-3.5.7/
(4)配置服务器编号
在 /opt/module/zookeeper-3.5.7/ 这个目录下创建 zkData 并创建 myid 文件
[leony@hadoop102 zookeeper-3.5.7]$ mkdir -p zkData
[leony@hadoop102 zkData]$ touch myid
[leony@hadoop102 zkData]$ vi myid
在文件中添加与 server 对应的编号:
2
拷贝配置好的zookeeper到其他机器上,并分别在hadoop103、hadoop104上修改myid文件中内容为 3、4
[leony@hadoop102 zkData]$ xsync myid
(5)配置 zoo.cfg 文件
[leony@hadoop102 conf]$ vim zoo.cfg
# 修改数据存储路径配置
dataDir=/opt/module/zookeeper-3.5.7/zkData
# 增加如下配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
配置参数解读 server.A=B:C:D
- A是一个数字,表示这个是第几号服务器;
集群模式下配置myid文件,这个文件在dataDir目录下,里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
-
B是这个服务器的地址;
-
C是这个服务器Follower与集群中的Leader服务器交换信息的端口;
-
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
(6)修改环境变量
[leony@hadoop102 zookeeper-3.5.7]$ sudo vim /etc/profile.d/my_env.sh
#ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin
2. Zookeeper集群启动
(1)分别启动Zookeeper
[leony@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh start
[leony@hadoop103 zookeeper-3.5.7]$ bin/zkServer.sh start
[leony@hadoop104 zookeeper-3.5.7]$ bin/zkServer.sh start
(2)查看状态
[leony@hadoop102 zookeeper-3.5.7]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg
Mode: follower
[leony@hadoop103 zookeeper-3.5.7]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg
Mode: leader
[leony@hadoop104 zookeeper-3.5.7]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg
Mode: follower
3. 客户端命令行操作
4. Zookeeper内部原理
4.1 节点类型
创建znode时集群会设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
注意:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
持久(Persistent): 客户端和服务器端断开连接后,创建的节点不删除
短暂(Ephemeral): 客户端和服务器端断开连接后,创建的节点自己删除
(1)持久化目录节点
客户端与Zookeeper断开连接后,该节点依旧存在
(2)持久化顺序编号目录节点
客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
(3)临时目录节点
客户端与Zookeeper断开连接后,该节点被删除
(4)临时顺序编号目录节点
客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号。
4.2 监听器原理
1、监听原理详解:
l)首先要有一个main()线程
2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet) , 一个负责监听(listener)。
3)通过connect线程将注册的监听事件发送给Zookeeper。
4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
5) Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
6) listener线程内部调用了process()方法。
2、常见的监听
1)监听节点数据的变化
get -w path
2)监听子节点增减的变化
ls -w path