前言
:开发和维护开源服务器
概念
:Apache ZooKeeper致力于开发和维护实现高度可靠的分布式协调的开源服务器。
目的:开发和维护开源服务器
干什么:做分布式协调
特点:高度的可靠性
诞生过程
:ZooKeeper诞生于Yahoo,后转入Apache孵化,最终孵化成Apache的顶级项目,是Hadoop和Hbase的重要组件。
作用
:ZooKeeper是开源的分布式的协调服务框架,是Apache Hadoop的子件,适用于绝大部分分布式集群的管理(ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务。所有这些类型的服务都以分布式应用程序的某种形式使用)
分布式引发的问题
死锁:至少有一个线程占用了资源,但是不占用CPU
活锁:所有线程都没有把持资源,但是线程却是在不断地调度占用CPU
需要引入一个管理节点
为了防止入口的单点问题,需要引入管理节点集群
需要确定一套选举算法
主节点和从节点之间要保持数据的一致
特点
本身是一个树状结构 --- Znode树
每一个节点称之为znode节点
根节点是 /
zookeeper 的所有操作都必须以根节点为基准进行计算 /
每一个znode节点都必须存储数据
任意一个持久节点都可以有子节点
任意一个节点的路径都是唯一的
Znode树是维系在内存中 --- 目的是为了快速查询
Zookeeper 不适合存储海量数据
(维系在内存中,如果存储大量数据会消耗内存,
不是一个存储框架而是一个服务协调框架)
ZooKeeper会为每一次事务(除了读取以外的所有操作都是事务)
分配一个全局的事务id ---Zid
节点类型
持久节点
临时节点(在客户端退出之后就自动删除)
持久顺序节点
临时顺序节点
命令
create /子节点名字 "文本信息":在根节点下创建子节点并且为其赋值内容
set /子节点名字 "新的文本信息" :更新子节点的内容为新的文本信息
get /子节点名字:获取子节点的信息
ls /:查看根节点下所有的子节点
delete /子节点名称:删除子节点(要求这个节点中没有子节点)
rmr /子节点名称:删除子节点(报括他的子节点)
quit :退出客户端
create -e /子节点名称:在根目录下创建临时节点
create -s /子节点名称:在根目录下创建持久顺序节点
create -e -s /子节点名称 :在根目录下创建临时顺序节点
节点信息
cZxid:全局分配的创建的事务id
ctime:创建时间
mZxid:修改的事务id(记录自己本身修改)
mtime:修改时间
pZxid:子节点的变化的事务id(记录子节点的创建和删除)
cversion:记录字节点变化次数
dataVersion:数据版本
aclVersion:记录当前节点的acl的变化次数
ephemeralOwner:如果当前节点不是临时节点,那么这个属性的值为0
(如果是临时节点,这个属性的值记录的是当前临时节点的session id)
dataLength:数据长度(实际上是字节个数)
numChildren 子节点个数
节点状态
Looking:选举状态
follower:追随者
leader:领导者
observe:观察者
选举机制
第一阶段:数据恢复阶段(会从数据目录中(dataDir)中恢复数据)
第二阶段:选举阶段
1.所有的节点都会推荐自己当leader并且发动自己的选举信息(
最大事务id(pZxid) 编号(myid),逻辑时钟值)
2.选举原则:先比较最大事务id,谁的事务id大谁就胜出,如果
最大事务id一样,则比较myid,谁的myid大谁就胜出
3. 选举出的leader的胜出要满足过半性(即要比至少一般的节点大)
4. 如果在集群中新加入一个节点,节点的事务id比leader的事务id大
(新的id不会成为leader,只要选定了一个leader,
那么后续节点的事务id和myid无论是多少,
一律都是follower)
5.如果leader宕机,集群中会自动选举一个新的leader;
6.如果超过一般的服务器宕机,那么此时Zookeeper不再对外提供服务(过半性)
{ 01 02 03 --》02成为leader
01 03 02 --》03成为leader }
ZAB协议
Zookeeper的投票是ZAB协议,ZAB是2PC协议的基础上来进行的延伸
2PC:将节点分为了协调者和参与者,当来一个请求的时候,协调者是
将请求者分发给每一个参与者,如果所有的参与者决定执行这个请
求,那么协调者就真正提交操作,有参与者执行,参与者在执行完
成之后返回Ack表示执行成功,如果协调者将请求分发给每一个参与
者之后,有一个或者多个参与者不同意执行或者是没有返回消息,那
么将这个操作回滚,不执行(一票否决)
在Zookeeper中,接收一个请求之后,leader会将请求分发给每一个
节点,由所有的节点投票确定是否执行这个请求(如果有一半的节点同意
执行这个请求,那么这个时候leader才会决定这个操作)
过半性
1.选举leader的要满足过半性
2.请求操作也要满足过半性
3.过半集群才能对外提供服务,防止脑裂,一般将集群点设置为奇数
(脑裂:集群中产生2个及以上的leader)
观察者
执行操作,但是不参与选举和投票
(21个节点 (14个观察者,6个follower,1个leader)
12个观察者宕机,依然对外提供服务
4个follower宕机,不对外提供服务
观察者不参与投票,所以就不影响集群的运行)