Zookeeper

Zookeeper定义

Zookeeper是一个开源的分布式(多台服务器处理一项任务)的,为分布式应用提供协调服务的Apache项目。

Zookeeper = 文件系统+通知机制(客户端通知)

Zookeeper工作机制

zookeeper从设计模式角度来理解:是一个具于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就负责通知已经在Zookeeper上注册的那些观察者做出相应的反映。

1.服务器启动时去注册信息(创建都是临时节点)

2.获取到当前在线服务器列表,并且注册监听

3.服务器节点下线

4.服务器节点上下线事件通知

5.process(){
重新再去获取服务器列表,并注册监听
}

Zookeeper集群特点

1.Zookeeper:一个领导者(leader),多个跟随者(Follower)组成的集群。

2.集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。

3.全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致。

4.同一个Client的更新请求按其发送顺序依次执行。

5.数据更新原子性,一次数据更新要么成功,要么失败。

6.实时性,在一定时间范围内,Client能读到最新数据。

Zookeeper数据结构

Zookeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称作一个Znode。每一个ZNode默认能够存储1MB的数据,每个Znode都可以通过其路径唯一标识

Zookeeper应用场景

1.统一命名服务
在分布式环境下,经常需要对应用服务器进行统一命名,便于识别。
例如:ip不容易记住,而域名容易记住。客户端访问时,zookeeper帮助你访问哪个ip。

2.分布式环境下,配置文件同步非常常见。
1.一般要求一个集群中,所有节点的配置信息是一致的,比如kafka集群。
2.对配置文件修改后,希望能够快速同步到各个节点上。

3.配置管理可交由Zookeeper实现。
1.可将配置信息写入Zookeeper上的一个znode。
2.各个客户端服务器监听这个Znodek。
3.一旦Znode中的数据被修改,Zookeeper将通知各个客户端服务器。

4.统一集群管理
1.分布式环境中,实时掌握每个节点的状态时必要的。
2.Zookeeper可以实现实时监控节点状态的变化。
1.可将节点信息写入Zookeeper上的一个Znode。
2.监听这个Znode可以获取它的实时状态变化。

5.软负载均衡
Zookeeper中记录每台服务器的访问数,让访问数最少的服务器,去处理最新的客户端请求。
注册登录服务:
/
service
www.xx.xx
192.168.22.13 访问数 60
192.168.22.13 访问数 50
60 192.168.22.13 访问数 60

Zookeeper内部原理

Stat结构体

    1.stat结构体  stat /

监听器原理【面试】

在这里插入图片描述

写数据的流程

在这里插入图片描述

Zookeeper面试题

1.请简述Zookeeper的选举机制?
在这里插入图片描述
6.2.1选举分两个阶段
1.数据恢复阶段:
当zk服务器启动时,会先从本地磁盘找到本机的最大事务id。
2.选举阶段:
zk服务器会提交选举协议 1.Zxid(最大事务id) 2.本机的选举id(myid文件里的数字) 3.逻辑时钟值 记录当前的选举轮数,确保每个zk在同一轮选举中 4.当前zk服务器状态,分4种: Looking=>选举阶段 Following=>当小弟阶段 Leading=>当领导阶段 Observering=>观察者阶段
6.2.2选举的pk原则
1.首先比较最大事务id,Zxid,谁大谁当领导
2.如果Zxid比较不出来,比较myid(选举id),谁大谁当领导
3.选举的前提满足过半同意

6.2.3Leader选举出来之后
Leader身上一般是有最新数据的(有最大事务id的),所以首先做的就是原子广播(通过原子 广播端口)。 原子广播的目的就是为了确保数据一致性(即客户端无论通过哪个zk服务器查看数据,数据都是一样的) 目的二就是为了防止leader挂掉之后,数据的丢失问题
对于事务更新,Leader会通过原子广播征询其他follower,只有满足过半同意机制,事务才能被更新
在这里插入图片描述

针对下图,Leader挂掉之后,第二个机器成为Leader
在这里插入图片描述

针对下图,不满足过半机制,集群就工作不了了
在这里插入图片描述

修改testCreateCallBack()方法
ZooKeeper zk=new ZooKeeper(“192.168.80.21:2181,
192.168.80.22:2181,192.168.80.23:2181”,3000,new Watcher(){…
测试发现,三台zk上都创建了该节点。

6.1Zookeeper事务概念
1.每一个创建节点、修改节点、删除节点操作都是一个事务,每一个事务都用一个事务id来代表,叫:zxid
2.zxid 是全局唯一,并且全局递增的。作用就是可以根据最大事务id,找到最新的事务
Zxid 最大事务id 是全局的, cZxid、mZxid、pZxid是针对某个节点路径而言的。

扩展 Zookeeper的选举机制根据Paxos 算法来实现。 Paxos算法解决的问题:在分布式环境下就某一个决议达成一致性问题。 Paxos算法存在活锁问题,Zk用的是Fast Paxos算法,解决了活锁问题。

czxid. 节点创建时的zxid.
mzxid. 节点最后一次更新发生时的zxid.
cversion. 其子节点的更新次数.
aclVersion. 节点ACL(授权信息)的更新次数.
ephemeralOwner. 如果该节点为ephemeral节点, ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是ephemeral节点, ephemeralOwner值为0x0. 至于什么是ephemeral节点, 请看后面的讲述.
dataLength. 节点数据的字节数.
numChildren. 子节点个数.

6.2.4zxid
znode节点的状态信息中包含czxid和mzxid, 那么什么是zxid呢?
ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction id, 该id称为zxid. 由于zxid的递增性质, 如果zxid1小于zxid2, 那么zxid1肯定先于zxid2发生. 创建任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会导致Zookeeper状态发生改变, 从而导致zxid的值增加.
6.2.5session
在client和server通信之前, 首先需要建立连接, 该连接称为session. 连接建立后, 如果发生连接超时, 授权失败, 或者显式关闭连接, 连接便处于CLOSED状态, 此时session结束.
6.2.6节点类型
讲述节点状态的ephemeralOwner字段时, 提到过有的节点是ephemeral节点, 而有的并不是. 那么节点都具有哪些类型呢? 每种类型的节点又具有哪些特点呢?
persistent. persistent节点不和特定的session绑定, 不会随着创建该节点的session的结束而消失, 而是一直存在, 除非该节点被显式删除.
ephemeral. ephemeral节点是临时性的, 如果创建该节点的session结束了, 该节点就会被自动删除. ephemeral节点不能拥有子节点. 虽然ephemeral节点与创建它的session绑定, 但只要该该节点没有被删除, 其他session就可以读写该节点中关联的数据. 使用-e参数指定创建ephemeral节点.

2.Zookeeper的部署方式有哪几种?集群中的角色有哪些?集群至少需要几台机器?
1.部署方式为单机模式,集群模式
2.角色:leader和Follower
3.集群最少需要3台机器数

3.Zookeeper的常用命令
ls
create
get set
delete

  • 5
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值