ZOOKEEPER原理与功能详解
1. Zookeeper是什么
ZooKeeper 是一个开源的分布式协调服务,主要服务于分布式系统。
由于分布式系统中节点的管理问题(实时感知节点的状态、对节点进行统一管理作出合理的调度分配等)比较麻烦或提高了系统的复杂度,就出现了能够通用解决这些问题的中间件–Zookeeper。
分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列等功能。
2. ZooKeeper集群
2.1 角色
Zookeeper集群中的所有机器通过一个Leader选举机制来选定 “Leader”,Leader既可以为客户端提供写服务又能提供读服务。除了Leader外,Follower和Observer都只能提供读服务。
Leader 领导者 :
Leader 节点负责Zookeeper集群内部投票的发起和决议(一次事务操作),更新系统的状态;同时它也能接收并且响应Client端发送的请求。
Follower 跟随者 :
Follower 节点用于接收并且响应Client端的请求,如果是事务操作,会将请求转发给Leader节点,发起投票,参与集群的内部投票,
Observer 观察者:
Observer 节点功能和Follower相同,只是Observer 节点不参与投票过程,只会同步Leader节点的状态。
为何加入Observer角色?
Observer为ZK从3.3版本引入的新角色;在加入Observer之前,想要对ZK集群进行扩展,我们通过添加Follower节点,通过给集群配置更多的节点资源来实现集群的可伸缩性,提高集群的读性能;但随着Follower节点的增加,集群的读性能受到了限制,也会拖慢整个集群的选举过程。
所以为了打破加置资源与系统吞吐性能之间的矛盾,引入Observer节点,同样可以与客户端建立连接并将请求转发给Leader但不参与投票。
2.2 结构
2.3 服务器数量
对于一个集群来说,如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之间能够正常通信。
基于这个特性,如果想搭建一个能够允许 N 台机器宕掉的集群,那么就要部署一个由 2*N+1 台服务器构成的 ZooKeeper 集群。比如对于一个由 5 台服务器构成的 ZooKeeper 集群,能够对 2 台机器挂掉的情况进行容灾。注意,如果是一个由6台服务器构成的 ZooKeeper 集群,同样只能够挂掉 2 台机器,因为如果挂掉 3 台,剩下的机器就无法实现过半了。
2.4 数据操作流程
- 在Client向Follwer发出一个写的请求
- Follwer把请求发送给Leader
- Leader接收到以后开始发起投票并通知Follwer进行投票
- Follwer把投票结果发送给Leader
- Leader将结果汇总后如果需要写入,则开始写入同时把写入操作通知给Leader,然后commit;
- Follwer把请求结果返回给Client
Follower主要有四个功能:
• 1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
• 2 .接收Leader消息并进行处理;
• 3 .接收Client的请求,如果为写请求,发送给Leader进行投票;
• 4 .返回Client结果。
Follower的消息循环处理如下几种来自Leader的消息:
• 1 .PING消息: 心跳消息;
• 2 .PROPOSAL消息:Leader发起的提案,要求Follower投票;
• 3 .COMMIT消息:服务器端最新一次提案的信息;