一、什么是Zookeeper
1.1 概述
在我的印象中,zookeeper是可以作为注册中心来存在的,之前的微服务架构更多的是采用Dubbo+zookeeper来搭配着使用的,因此,zookeeper它是主要服务于分布式系统。
而分布式系统的特点就是会有多个节点存在,实时感知每个节点的状态,管理每个节点就变得尤为重要。而zookeeper的出现就解决了这个问题。
从设计模式角度来理解:它是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生了变化,zookeeper就负责通知已经在zookeeper上注册的那些观察者,让他们做出相应的反应。
因此,zookeeper可以概况为:文件系统+通知机制。
工作机制:
1、服务端启动时去注册信息(创建的都是临时节点)
2、获取到当前在线服务器列表,并且注册监听
3、服务器节点下线
4、服务器节点下线事件通知
5、process重新再去获取服务器列表,并注册监听
1.2 特点
1、Zookeeper是设计模式是由一个领导者和多个跟随者组成的集群
2、半数原则:集群中只要有半数以上的节点存活,zookeeper集群就能正常服务
3、全局数据一致,每个server服务器保存一份相同的数据副本,client无论连接到哪个server,数据都一致
4、数据更新原子性:一次数据更新要么成功,要么失败。
5、实时性:在一定时间范围内,client能够读到最新数据。
1.3 数据结构
zookeeper的数据模型与linux文件系统很类似,整体可以看作是一棵树,每个节点称为znode,默认能够存储1Mb的数据,每个znode都可以通过其路径唯一标识:
而这些节点可以分为两类:临时和持久。因此一个面试题产生了:zookeeper的节点类型有哪些?
- 临时普通节点
- 临时有序节点
- 持久普通节点
- 持久有序节点
1.4 zookeeper能干啥?
zookeeper 提供的服务包括:统一命名服务,统一配置管理,统一集群管理,软负载均衡,分布式锁。
1.4.1 统一命名服务
可以理解为访问域名:www.baidu.com 的时候,这个域名下面有很多台服务器:192.168.1.100,192.168.1.101,192.168.1.102等。别人只要访问这个域名,zookeeper就会把请求转发给注册过的某个服务器上。而用户并不用去记住访问哪个ip地址,只需要知道这个域名就可以了。
1.4.2 统一配置管理
把公共的配置文件抽取出来,分发给其他系统。
配置文件同步非常常见。一般要求一个集群中,所有的节点的配置信息是一致的,比如kafka集群,对配置文件修改后,希望能够快速同步到各个配置上。
1.4.3 统一集群管理
1)分布式环境中,实时掌握每个节点的状态是必要的,可根据节点实时状态进行调整。
zookeeper 可以实现实时监控节点状态变化。
可将节点信息写入zookeeper上的一个Znode
监听这个znode可获取它的实时状态变化。
1.4.4 软负载均衡
再zookeeper中记录每台服务器的访问数,让访问最少的服务器去处理最新的客户端请求。
1.4.5 分布式锁
如果有a、b、c多个客户端去抢一个zookeeper分布式锁。原理是这样的:
刚访问 /lock 锁节点的时候,大家都上来直接创建一个接一个的有序节点。例如a系统创建了001节点。b系统创建了002节点,c系统创建了003节点。
系统拿到所有的节点后,会比较自己的节点是不是最小的,如果是,则得到锁,如果不是,就对上个节点加监听器,监视它。
只要上一个节点释放锁,自己就排到前面去了,相当于一个排队机制。
用临时节点 第一个用意:如果某个客户端创建临时顺序节点之后,不小心自己宕机了也没关系,zookeeper感知到那个客户端宕机,会自动删除对应的临时顺序节点,相当于自动释放锁,或者是自动取消自己的排队。
二、zookeeper安装
2.1 本地模式安装部署
1、步骤:
配置修改:conf下的zoo_sample.cfg修改为zoo.cfg
在zookeeper目录下创建dataDir文件夹,存放数据的存储目录。
在zookeeper conf 的zoo.cfg下面添加数据存放路径:
dataDir=/opt/module/zookeeper-3.5.7/zkData
- 启动
[root@hadoop101 zookeeper-3.5.7]# bin/zkServer.sh start
- 查看状态
[root@hadoop101 zookeeper-3.5.7]# bin/zkServer.sh status
- 启动客户端 连接指定的host的zk服务
root@hadoop101 zookeeper-3.5.7]# bin/zkCli.sh -server host:port
- 停止
[root@hadoop101 zookeeper-3.5.7]# bin/zkServer.sh stop
2.2 配置参数解读
1)tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。
(session的最小超时时间是2*tickTime)
2)initLimit =10:LF初始通信时限
集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
3)syncLimit =5:LF同步通信时限
集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
4)dataDir:数据文件目录+数据持久化路径
主要用于保存Zookeeper中的数据。
5)clientPort =2181:客户端连接端口
监听客户端连接的端口