目录
4.3.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.本地模式安装
- 安装jdk1.8
- 拷贝Zookeeper安装包到linux系统下
- 解压到指定目录:tar -zxvf 安装包 -C /opt/
- 将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
- 在每台服务器上做完2.1.本地模式安装流程
- 每台服务器上都需要在/zkData的目录下创建一个myid的文件,内容分别是服务编号1,2,3
- 三台服务器都需要修改zoo.cfg文件:在dataDir下增加配置1
- 三台服务器中只要超过半数服务启动起来,集群才算启动成功。
配置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.监听器原理(面试)
- 首先要有一个main()主线程
- 在main主线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listenner)。
- 通过connect线程将注册的监听事件发送给Zookeeper
- 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
- Zookeeper监听到有数据或者路径的变化,就会将这个消息发送给listener线程
- listener线程内部调用process()方法。
常见的监听内容:
- 监听节点数据的变化:get path [watch]
- 监听节点增减的变化:ls path [watch]
3.4.写数据流程
当client向Zookeeper集群中Server1写数据的时候,具体流程如下:
- Client向Server1发送一个写请求(集群是否宕机了?)
- 如果Server1不是Leader,需要转发给Leader,Leader会将写请求广播给各个Server(Leader就是个大嘴巴,人尽皆知)。
- 各个Server开始并发处理写请求,写成功后,会通知给Leader(各个Follower陆续交作业)
- 当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