ZooKeeper
是什么
是一个分布式的,
开放源码
的
分布式应用程序
协调服务,
是
Google
的Chubby一个开源的实现,是
Hadoop
和
Hbase
的重要组件。
是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、
域名服务
、分布式同步、组服务等。
为什么
ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟数量。
Zookeeper实现过程中非常重视高性能,高可用性,严格有序的访问。ZooKeeper的性能方面意味着它可以在大型分布式系统中使用。可靠性方面使其不会成为单点故障。严格的排序意味着可以在客户端实现复杂的同步原语。
ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如
数据发布/订阅
、
负载均衡
、
命名服务
、
分布式协调/通知
、
集群管理
、
Master 选举
、
分布式锁
和
分布式队列
等功能。
ZooKeeper 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心。
一、工作机制
Zookeeper从设计模式角度来理解:是一个基于
观察者模式设计
的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
(观察者设计模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新)
- 具体流程:
二、特点
- Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
- 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。如图所示有5台服务器,掉线两台可以继续运行。
- 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的,当数据发生变化,会有内部通信保持数据一致。
- 更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行,内部网络发送的数据包,服务器使用顺序和发送顺序一致。
- 数据更新原子性,一次数据更新要么成功,要么失败,如果某一台机器没成功,集体回退。
- 实时性,在一定时间范围内,Client能读到最新数据。
三、数据结构
ZooKeeper数据模型的结构与Linux文件系统类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
之所以说是与Linux文件系统类似,是因为ZooKeeper没有文件概念,如下图所示,在Linux目录下可以存放很多文件。
ZooKeepe直接存储文件内容,一个节点下只有内容,没有多个文件。
四、应用场景
(一)统一命名服务
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。
例如访问百度,百度后台是多台服务器组成,每个服务器都有自己的IP地址,而用户访问的地址是一个域名,从域名节点下选一台服务器访问。
(二)软负载均衡
在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求
(三)统一配置管理
-
分布式环境下,同步配置文件
- 要求一个集群中,所有节点的配置信息是一致的。
- 对配置文件修改后,希望能够快速同步到各个节点上。
-
配置管理可交由ZooKeeper实现。
- 可以将配置信息写入ZooKeeper上的一个Znode。
- 各个客户端服务器监听这个Znode,一旦Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。
(四)统一集群管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFBpdSGO-1680253564775)(…/图床/image-20230331145307110.png)]
-
分布式环境中,实时掌握每个节点的状态是必要的,可根据节点实时状态做出一些调整。
-
ZooKeeper可以实现实时监控节点状态变化
- 可将节点信息写入ZooKeeper上的一个ZNode。
- 监听这个ZNode可获取它的实时状态变化。
(五)服务器动态上下线
怎么做
(一)分布式安装部署
1、集群规划
在虚拟机hadoop102、hadoop103和hadoop104三个节点上部署Zookeeper。
2、解压安装
从官网https://zookeeper.apache.org/下载压缩包
(1)解压Zookeeper安装包到指定目录下,以目录/opt/module/为例
[atguigu@hadoop102 software]$ tar -zxvf zookeeper-3.5.7.tar.gz -C /opt/module/
(2)同步/opt/module/zookeeper-3.5.7目录内容到hadoop103、hadoop104
[atguigu@hadoop102 module]$ xsync zookeeper-3.5.7/
3、配置服务器编号
(1)在/opt/module/zookeeper-3.5.7/这个目录下创建zkData
[atguigu@hadoop102 zookeeper-3.5.7]$ mkdir -p zkData
(2)在/opt/module/zookeeper-3.5.7/zkData目录下创建一个myid的文件
[atguigu@hadoop102 zkData]$ touch myid
(3)编辑myid文件,写入2作为标记
[atguigu@hadoop102 zkData]$ vim myid
(4)拷贝配置好的zookeeper到其他机器上,并分别在hadoop103、hadoop104上修改myid文件中内容为3、4
[atguigu@hadoop102 zkData]$ xsync myid
4、配置zoo.cfg文件
(1)重命名/opt/module/zookeeper-3.5.7/conf这个目录下的zoo_sample.cfg为zoo.cfg(为了方便好记)
[atguigu@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg
(2)打开zoo.cfg文件
[atguigu@hadoop102 conf]$ vim zoo.cfg
-
修改数据存储路径配置
dataDir=/opt/module/zookeeper-3.5.7/zkData
-
增加如下配置,2888表示正常通信、3888表示选举通信
#######################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,而这个端口就是用来执行选举时服务器相互通信的端口。
-
-
(4)同步zoo.cfg配置文件
[atguigu@hadoop102 conf]$ xsync zoo.cfg
5、集群操作
(1)分别启动Zookeeper
[atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh start
[atguigu@hadoop103 zookeeper-3.5.7]$ bin/zkServer.sh start
[atguigu@hadoop104 zookeeper-3.5.7]$ bin/zkServer.sh start
(2)查看状态
[atguigu@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
[atguigu@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
[atguigu@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
(二)客户端命令操作
命令基本语法 | 功能描述 |
---|---|
help | 显示所有操作命令 |
ls path | 使用 ls 命令来查看当前znode的子节点-w 监听子节点变化-s 附加次级信息 |
create | 普通创建-s 含有序列-e 临时(重启或者超时消失) |
get path | 获得节点的值-w 监听节点内容变化-s 附加次级信息 |
set | 设置节点的具体值 |
stat | 查看节点状态 |
delete | 删除节点 |
deleteall | 递归删除节点 |
1、启动客户端
[atguigu@hadoop103 zookeeper-3.5.7]$ bin/zkCli.sh
2、查看当前znode中所包含的内容
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]