目录
概述
Zookeeper 是一个开源的分布式的,为分布式框架提供协调服务的 Apache 项目。
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架(一个人在干活一个人在监工),它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
Zookeeper=文件系统+通知机制
文件系统是用来存储数据的,这里存储的是服务器各种上线信息,一上线就有对应的记录。不上线就没有记录。通知机制就是说任何客户端都可以提前跟我注册,客户端询问某某服务器在不在线,然后zookeeper通知到客户端。
特点
上面一些是服务器,上面一些是zoo keeper客户端,客户端和服务端可以进行交互通信。
- Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
- 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
- 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
- 更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行(谁先来的先处理谁)。
- 数据更新原子性,一次数据更新要么成功,要么失败。
- 实时性,在一定时间范围内,Client能读到最新数据。当第一个客户端往服务器中写入了数据,那其他的节点什么时候能拿到数据呢?Zookeeper有一个同步数据的过程,且时间非常快,因为每个节点存储的数据量非常小,所以同步的快。
数据结构
ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个
节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过
其路径唯一标识。不可以用zookeeper存储海量的数据,他只适合存储一些简单的配置信息,数据量要在1M以下。
应用场景
Zookeeper提供的服务包括:统一命名服务、 统一配置管理、统一集群管理、 服务器节点动态上下线、软负载均衡等。
统一命名服务
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。 例如:IP不容易记住,而域名容易记住。
在zookeeper集群当中的根目录下,有一个service文件夹,下面有一个域名,在这个域名下就会存储着成百上千台服务器,当客户端进行访问的时候,只需要记住域名就可以了,Zookeeper就可以帮助我们去找去访问哪台服务器,他会根据负载情况进行分配,哪怕后台那某一个服务器挂掉也不影响域名。
统一配置管理
- 分布式环境下,配置文件同步非常常见。
1.一般要求一个集群中,所有节点的配置信息是一致的,比如 Kafka 集群。
2.对配置文件修改后,希望能够快速同步到各个 节点上。
- 配置管理可交由ZooKeeper实现。
1.可将配置信息写入ZooKeeper上的一个Znode。
2.个客户端服务器监听这个Znode。
3.一旦Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。
只要configuration目录下的内容发生改变,那么第一时间就会通知客户端,然后客户端就会更新自己的配置文件。
统一集群管理
- 分布式环境中,实时掌握每个节点的状态是必要的。
1.可根据节点实时状态做出一些调整。
- ZooKeeper可以实现实时监控节点状态变化
1.可将节点信息写入ZooKeeper上的一个ZNode。
2.监听这个ZNode可获取它的实时状态变化。
客户端跟GroupManager进行注册,相当于在这个节点有一个目录,那么在这个目录里面可以放着这个客户端相关的运行信息,比如何时上线,上线状态等,都可以写入到这个节点上。别人监听这个节点状态就可以收到这个信息,然后做出其他的操作,比如,运维可以监控这些节点是否好坏,如果运行话的话可以将它卸掉。
同时客户端还可以监控别人,比如客户端1还可以监控客户端2的上线状态好坏,然后再决定自己是否上线。相当于把所有的客户端的相关信息。都注册上之后,进行统一的集群管理,任何一个进程挂掉都可以看得到。
服务器节点动态上下线
软负载均衡
在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求
本地安装
安装步骤
将压缩文件传到linux系统/opt目录下并解压,改名
bin目录下放着框架相关的启动停止等一些脚本,或者一些系统命令
conf目录存储配置文件,docs存储一些文档,lib存储一些依赖文件和jar包
对zookeeper进行配置需要进入conf修改zoo_sample.cfg
创建自己的目录存储快照文件
随后更改配置文件中的dataDir
先启动服务端
然后再启动客户端访问
查看zookeeper状态
配置修改
(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 文件,修改 dataDir 路径:
[atguigu@hadoop102 zookeeper-3.5.7]$ vim zoo.cfg
修改如下内容:
dataDir=/opt/module/zookeeper-3.5.7/zkData
(3)在/opt/module/zookeeper-3.5.7/这个目录上创建 zkData 文件夹
[atguigu@hadoop102 zookeeper-3.5.7]$ mkdir zkData
操作 Zookeeper
(1)启动 Zookeeper
[atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh start
(2)查看进程是否启动
[atguigu@hadoop102 zookeeper-3.5.7]$ jps
4020 Jps
4001 QuorumPeerMain
(3)查看状态
[atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg
Mode: standalone
(4)启动客户端
[atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh
(5)退出客户端:
[zk: localhost:2181(CONNECTED) 0] quit
(6)停止 Zookeeper
[atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh stop
配置参数解读
1)tickTime = 2000:通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒,周期性的发送信息
2)initLimit = 10:LF初始通信时限
10表示10个心跳,如果在初始化的时候在20s内还没有建立相关链接,那这次通信就失败了
3)syncLimit = 5:LF同步通信时限
两者一旦建立好链接之后,那下次在连接的视乎最大通信时限就是 5*2000ms
4)dataDir:保存Zookeeper中的数据
注意:默认的tmp目录,容易被Linux系统定期删除,所以一般不用默认的tmp目录。
5)clientPort = 2181:客户端连接端口,通常不做修改。