大数据技术之Zookeeper

109 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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. 客户端命令行操作

image.png

4. Zookeeper内部原理

4.1 节点类型

image.png 创建znode时集群会设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

注意:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

持久(Persistent): 客户端和服务器端断开连接后,创建的节点不删除

短暂(Ephemeral): 客户端和服务器端断开连接后,创建的节点自己删除

(1)持久化目录节点

  客户端与Zookeeper断开连接后,该节点依旧存在

(2)持久化顺序编号目录节点

  客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

(3)临时目录节点

  客户端与Zookeeper断开连接后,该节点被删除

(4)临时顺序编号目录节点

  客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号。

4.2 监听器原理

image.png 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