Zookeeper基础

一、概述与特点?

Zookeeper 是一个分布式服务框架,是ApacheHadoop的一个子项目。从设计模式角度来看,它是基于观察者模式设计的一个分布式协调框架;它负责存储大家关心的数据,观察者订阅关心的数据或结点,当发生变化时,它将通知观察者以实现分布协调。常称分布式协调指挥官

特点:

  • 一个领导者Leader,多个跟跟随者Follower;
  • 一个Zookeeper集群,半数以上存活,则集群可用;
  • 全局数据一致:无论Client连接哪个Server,获取得到的数据都一致的;
  • 更新请求顺序进行,来自同一个client的请求按顺序执行;
  • 数据更新原子性,一次数据更新要么成功,要么失败;
  • 实时性,一定时间能Client能读到最新的数据;

1、数据结构

Zookeeper数据结构与Unix很相似,整体上可以看作是一个树,每个结点称作一个ZNode,每个Znode可以存储1M数据,每个结点可以通过路径唯一标识。
在这里插入图片描述

2、应用场景

  • 统一命名服务
  • 统一配置管理
  • 统一集群管理
  • 集群服务上下线通知
  • 软负载

二、安装与部署

  1. 下载与安装官网下载3.4.14:
  2. tar -zxvf zookeeper-3.4.14.tar.gz -C /opt/module/;
  3. mv zoo_sample.cfg zoo.cfg;
  4. vi zoo.cfg,一般会更改zookeeper存储数据的路径:dataDir=/opt/module/zookeeper-3.4.14/zkData;
[root@vm-1154-0-2 conf]# vi zoo.cfg

#The number of milliseconds of each tick
#心跳时间
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
#初始化启动时10*2000内Leader与Follower的通信期限,没有通信上认为挂了;
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
#启动之后5*2000内Leader与Follower的通信期限,没有通信上认为挂了;
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/module/zookeeper-3.4.14/zkData
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
  1. 启动服务:zkServer.sh start
[root@vm-1154-0-2 zookeeper-3.4.14]# bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
  1. 查看启动状态:zkServer.sh status
[root@vm-1154-0-2 zookeeper-3.4.14]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: standalone
  1. 根据需要启动客户端可以进行zkCli.sh

常用命令

  • help 帮助命令;
  • create 创建结点命令,创建的同事需要指定值;
  • ls 查看结点;
  • ls2 查看结点详情;
  • get 获取结点值;
  • delete 删除结点;
  • rmr 递归删除结点;
  • set 设置结点值;

以上为本地模式

三、内部原理

1、选举机制

半数以上机制:半数以上主机存活,集群可用,因此Zookeeper适合安装奇数台服务器,否则机器存在浪费;

以5台服务器为例描述选举过程:

  1. 第一台主机启动,它选择自己一票,发出去的信息一直没有人收到,此时一直是looking状态;
  2. 第二台主机启动,它也选择自己一票,与第一台主机交换信息,都没有超过半数,但自己的ID大,然后第一台投第二台一票,此时第二台主机2票,仍然未超过半数;
  3. 第三台服务器启动,它也选择自己一票,与其它主机交互信息,此时三台主机的票数均未超过半数,主机间交换,第三台服务器ID最大,于数第一台与第二台将票投给第三台,此时第三台有3票,超过半数,于是第三台被选为Leader;
  4. 第四台,第五台启动,由于此时已经有Leader,不再发生变化,除非Leader挂掉;

2、结点类型

结点类型分为是否持久、是否有序;

  • 持久结点:客户端与Zookeeper断掉后结点不会删除;
  • 临时结点:客户端与Zookeeper断开,结点会被删除;创建结点时带-e参数 create -e;
  • 有序结点:生成结点会根据生成先后,生成对应的序号,序号单调增加,可以根据序号大写判断结点生成的时间先后,序号由父结点维护;创建结点时带-s参数 create -s;

3、监听机制

在这里插入图片描述

  1. 首先要有一个main线程;
  2. 在main线程中创建Zookeeper客户端,此时会创建两个线程,一个connect线程,一个listener线程;
  3. 通过connect线程建立连接并发送注册监听事件给Zookeeper服务;
  4. Zookeeper服务器将监听路径添加到监听列表中;
  5. 当监听的路径发生数据或结点变化,Zookeeper会主动通过listener线程通知客户端;
  6. 客户端调用内部和理processor;

常用监听

  • 数据监听 get path watch;
  • 结点监听 ls path watch;

注意:上面的命令每执行一次只监听一次变化。

4、写数据流程

以下以三个结点的Zookeeper集群为例介绍写数据流程server1,leader,server2:

  1. client向server1发送写数据请求;
  2. server1通知leader,leader写入数据,并通知serverr1与server2写入;
  3. server1与server2写入成功后分别通知leader写入成功;
  4. leader通知server1与server2本次写入成功;
  5. server1通知client写入成功;

四、企业面试真题

1、请描述Zookeeper的选举机制?

2、Zookeeper的监听原理?

3、Zookeeper的部署方式有几种?集群方式中有几种角色?集群至少需要几台机器?

4、Zookeeper常用命令有哪些?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章