Zookeeper框架从入门到原理

目录

1.入门

1.1.概述

1.2.工作机制

1.3.特点

1.4.数据结构(树)

1.5.应用场景

1.6.下载地址(3.6.3)

2.Zookeeper安装

2.1.本地模式安装

2.2.分布式安装

2.3.操作

2.3.配置参数

3.Zookeeper内部原理

3.1.选举机制和流程(面试点)

3.2.节点类型

3.3.监听器原理(面试)

3.4.写数据流程

4.常见面试题

4.1.Zookeeper选举机制?

4.2.Zookeeper的监听原理?

4.3.Zookeeper部署方式有哪几种?集群最少需要几台?

4.4.Zookeeper角色有哪些?

4.5.Zookeeper常用命令?


1.入门

1.1.概述

Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。

Zookeeper = 文件系统+监听器

1.2.工作机制

是一个基于观察者模式的分布式服务管理框架

  • 负责存储和管理大家都关心的数据
  • 接收观测者注册
  • 数据发生变化,负责通知已经在Zookeeper上注册的观察者

1.3.特点

  • Zookeeper:一个领导者(leader),多个跟随者(Follower)组成的集群
  • 集群中只要半数以上节点存活,Zookeeper集群就能正常服务
  • 全局数据一致:每个Server保存一份相同的数据副本,无论连哪个Server,数据都一致
  • 单个Client的请求顺序依次执行
  • 数据更新原子性,一次数据更新,要么成功,要么失败
  • 实时性,在一定时间范围内,Client能读到最新数据

1.4.数据结构(树)

  • 与Unix文件系统很类似,整体可以看作是一颗数,每个节点称作ZNode
  • 每个ZNode默认存储1M数据
  • 每个ZNode都可以通过其路径唯一标识

1.5.应用场景

  • 统一命名服务:例如访问域名,然后分配到不同的IP地址
  • 统一配置管理:分布式环境下,所有节点的配置文件信息是一致的,比如kafka集群,配置文件修改,希望能快速同步到各个节点上去
  • 统一集群服务:分布式环境下,实时掌握每个节点之间的状态
  • 服务器节点动态上下线:客户端实时洞察到服务上下线的变化
  • 软负载均衡:在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求

1.6.下载地址(3.6.3)

官网地址:https://zookeeper.apache.org/

3.6.3版本的地址:https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz

2.Zookeeper安装

2.1.本地模式安装

  1. 安装jdk1.8
  2. 拷贝Zookeeper安装包到linux系统下
  3. 解压到指定目录:tar -zxvf 安装包 -C /opt/
  4. 将conf下的zoo_sample.cfg修改成zoo.cfg:mv zoo_sample.cfg zoo.cfg;修改zoo.fg中的数据目录:dataDir=/opt/zookeeper-3.6.3/zkData;记得创建zkData这个目录

2.2.分布式安装

假如有3台服务器,ip分别是192.168.1.1,192.168.1.2,192.168.1.3,打算对应起的编号是1,2,3

  1. 在每台服务器上做完2.1.本地模式安装流程
  2. 每台服务器上都需要在/zkData的目录下创建一个myid的文件,内容分别是服务编号1,2,3
  3. 三台服务器都需要修改zoo.cfg文件:在dataDir下增加配置1
  4. 三台服务器中只要超过半数服务启动起来,集群才算启动成功。

配置1如下:

server.1=192.168.1.1:2888:3888

server.2=192.168.1.2:2888:3888

server.3=192.168.1.3:2888:3888

配置解读:server.A=B.C.D

A:是一个数字,代表这个是第几号服务器

B:这个服务器的IP地址

C:这个服务器与Leader服务器进行交换信息的端口,这里的信息是指存储的数据信息,也就是副本

D:这个服务器与Leader服务器进行交换信息的端口,这里的信息是指Leader挂了之后,服务器之间的选举信息

2.3.操作

//启动zookeeper服务
bin/zkServer.sh start
//停止zookeeper服务
bin/zkServer.sh stop
//查看进程是否启动
jps
//查看状态
bin/zkServer.sh status
//启动客户端
bin/zkCli.sh
//退出
quit

2.3.配置参数

tickTime=2000:Client-Server的心跳每两秒

initLimit=10:集群启动的过程中,leader与各个follower之间的最大连接时长10*tickTime=20秒,超过时长就认为连接断了

syncLimit=5:集群启动完成后,在运行期间leader与各个follower之间的最大连接时长10*tickTime=10,超过时长就认为连接断了

dataDir:文件系统的目录,存储数据的地方

clientPort=2181:Zookeeper的端口号

3.Zookeeper内部原理

3.1.选举机制和流程(面试点)

  • 半数机制:集群半数以上(不包含半数)的机器存活,集群可用,所以Zookeeper适合安装奇数台服务器
  • Zookeeper虽然在配置文件中并没有指定Master和Slave,但是在工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部选举机制临时产生的
  • 选举流程遵循半数机制,服务器启动默认先投自己,没选上(累计投票数大于半数),选择编号大于自己的服务器一票

假如5台机器,编号是1,2,3,4,5,3成为leader,其他都是follower

  • 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
  • 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
  • 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
  • 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
  • 服务器5启动,后面的逻辑同服务器4成为小弟。

3.2.节点类型

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

短暂:客户端和服务端断开连接后,创建节点删除

持久类型也分两类:

  • 持久化目录节点
  • 持久化顺序编号目录节点:断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号,顺序号是一个单调递增的计数器,由父节点维护

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

3.3.监听器原理(面试)

  1. 首先要有一个main()主线程
  2. 在main主线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listenner)。
  3. 通过connect线程将注册的监听事件发送给Zookeeper
  4. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
  5. Zookeeper监听到有数据或者路径的变化,就会将这个消息发送给listener线程
  6. listener线程内部调用process()方法。

常见的监听内容:

  • 监听节点数据的变化:get path [watch]
  • 监听节点增减的变化:ls path [watch]

3.4.写数据流程

当client向Zookeeper集群中Server1写数据的时候,具体流程如下:

  1. Client向Server1发送一个写请求(集群是否宕机了?
  2. 如果Server1不是Leader,需要转发给Leader,Leader会将写请求广播给各个Server(Leader就是个大嘴巴,人尽皆知)。
  3. 各个Server开始并发处理写请求,写成功后,会通知给Leader(各个Follower陆续交作业
  4. 当Leader收到大多数Server写成功了,才说明数据写成功了,这时Leader会告诉Server1写成功了,Server1进一步告诉Client写成功了(大于半数以上写成功,才叫成功

4.常见面试题

4.1.Zookeeper选举机制?

半数机制

4.2.Zookeeper的监听原理?

在main主线程中创建zkClient客户端,包含了两个线程,一个是connect,一个是listener

connect线程将注册的监听事件发送给Zookeeper

Zookeeper将注册的监听事件添加到列表中

Zookeeper监听到有数据或者路径的变化,就会将这个消息发送给listener线程,listener线程内部调用process()方法。

4.3.Zookeeper部署方式有哪几种?集群最少需要几台?

单机和集群两种

集群至少3台

4.4.Zookeeper角色有哪些?

Leader和Follower

4.5.Zookeeper常用命令?

ls create get delete set

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彼岸花@开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值