ZooKeeper总结
一、本质
ZooKeeper是一个为分布式应用提供一致性服务的软件。
二、ZooKeeper解决了什么问题
1.分布式系统的一致性问题
2.分布式系统的容灾容错
3.分布式系统的执行顺序问题
4.分布式系统的事务性问题
三、ZooKeeper的系统架构
1.领导者(Leader):负责进行投票的发起和决议,更新系统状态
2.学习者(Learner):包括跟随者(Follower)和观察者(Observer)
3. Follower:用于接受客户端请求并向客户端返回结果,在选主过程中参与投票
4. Observer:可接受客户端请求,将写请求转发给Leader,但Observer不参加投票过程,只同步Leader的状态,Observer的目的是为了扩展系统,提高读取速度。
5.客户端(Client):请求的发起方
四、ZooKeeper的目录结构
1.在机器的zookeeper/bin目录下输入./ zkCli.sh start后,就可以启动zookeeper集群(可以只启动一部分Server节点)
2.输入./zkCli.sh -server 127.0.0.1:2181 ,即可进入查看zookeeper的目录
3.数据模型
- ZooKeeper拥有一个层次的命名空间,图中每个方块是一个Znode
- Znode既可以像文件一样维护着数据、元信息、ACL、时间戳等数据结构
- Znode又可以像目录一样可以作为路径标识(必须为绝对路径)的一部分
-用户对Znode具有增、删、改、查等操作(权限允许的情况下)
4. Znode类型
ZooKeeper中的节点有两类四种,节点的类型在创建时即被确定,并且不能改变:
PERSISTENT:永久节点
EPHEMERAL:临时节点
PERSISTENT_SEQUENTIAL:永久节点、序列化
EPHEMERAL_SEQUENTIAL:临时节点、序列化
临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,也可以手动删除。注:ZooKeeper的临时节点不允许拥有子节点。
永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。
序列化:当创建Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数。
五、ZooKeeper的五个特征
1.Watches机制
-客户端可以在Znode上设置watch(监控器)
-当节点状态发生改变时(数据的增、删、改)将会触发watch,向客户端发送且仅发送一条通知
-存在有可能看不到所有数据变化的风险,因为多个事件的监控只会触发一次
2.一致性保证
-序列一致性:客户端发送的更新将按序在Zookeeper进行更新
-原子一致性:更新只能成功或者失败,没有中间状态
-单系统镜像:无论连接哪台Zookeeper服务器,客户端看到的服务器数据一致
3.数据访问
-每个节点上的“访问控制链”(ACL, Access Control List)保存了各客户端的访问权限。
-表示为scheme:id:permissions
4.容错性
- ZooKeeper集群中只要半数以上的机器处于可用状态,它就能够提供服务。
-若少于半数的机器出现故障,则最少有一台机器会保存最新的状态,那么这台机器就是新的Leader,其余的副本最终也会更新到这个状态
-若Leader挂了,由于其他机器保存了Leader的副本,可以从中选出一台机器作为Leader继续提供服务
5.实时性
在任何客户端的系统视图上的的时间间隔是有限的,因此他在超过几十秒的时间内部会过期。这就意味着,服务器不会让客户端看一些过时的数据,而是关闭,强制客户端转到一个更新的服务器上。
六、Zookeeper应用场景
1.配置管理(Configuration Management)
–基于watch机制的全局系统配置
–容错并且统一
2.集群管理(Group Membership)
集群状态
–采用EPHEMERAL临时节点
–所有的server getChildren(String path, boolean watch)方法
–某台服务器下线,对应的节点自动删除
选主节点
–采用EPHEMERAL_SEQUENTIAL临时序列节点
–选择当前是最小编号的Server为Master
–最小编号的Server死去,由于是EPHEMERAL节点,死去的Server对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点
3.共享锁(Locks)
–采用EPHEMERAL_SEQUENTIAL临时序列节点
4.队列管理
同步队列
–采用EPHEMERAL_SEQUENTIAL临时序列节点
FIFO队列
–采用EPHEMERAL临时节点
–保证所有成员加入队列时都有编号
–出队列时通过getChildren( )方法返回所有元素,然后消费其中最小的一个
以上.
如果觉得本文对你有帮助,可以帮忙点个赞表示支持吗,谢谢!
如果有任何意见和建议,也欢迎再下方留言~
关注这个公众号,每天22:00会有三道大数据面试题准时推送给你哦~
本文来自企鹅号 - 每天学点java干货媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - 每天学点java干货媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。