提示:文章先作为初版,等后续时间充足后,补充更深的内容
Zookeeper简单了解
一、Zookeeper与Eureka区别
Zookeeper | Eureka |
---|---|
CP设计(强一致性),目标是一个分布式的协调系统,用于进行资源的统一管理 | AP设计(高可用),目标是一个服务注册发现系统,专门用于微服务的服务发现注册 |
当节点crash后,需要进行leader的选举,在这个期间内,Zookeeper 服务是不可用的。 | Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时如果发现连接失败,会自动切换至其他节点,只要有一台Eurekai还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)同时当eureka的服务端发现85%以上的服务都没有心跳的话,它就会认为自己的网络出了问题,就不会从服务列表中删除这些失去心跳的服务,同时eureka的客户端也会级存服务信息。eureka对于服务注册发现来说是非常好的选择。 |
二、Zookeeper集群中节点之间的数据如何同步
启动阶段:
集群启动时,所有节点通过选举算法选出一个Leader节点。
Leader节点和其他节点建立通信连接,并进行数据同步,采用发送快照和发送Diff日志的方式。
数据同步阶段:
集群在工作过程中,所有的写请求都会交给Leader节点来进行处理,并将写请求转化为一个事务(Leader节点维护一个全局的递增事务ID(Zxid)来标识每个事务)。从节点只能处理读请求
Leader节点收到一个写请求时,会通过两阶段机制来处理
Leader节点首先将事务写入本地的日志文件(类似于WAL)中,再将该写请求对应的日志发送给其他Follower节点,并等待Follower节点持久化日志成功
Follower节点收到日志后会进行持久化,如果持久化成功则发送一个Ack给Leader节点
当Leader节点收到半数以上的Ack后,就会开始提交,先更新Leader节点本地的内存数据
Leader节点将该事务的提交请求广播给所有节点包括Follower节点和Observer节点。
其他节点接收到提交请求后,将该事务应用到自己的数据副本中,并发送ACK确认给Leader节点。
Leader节点收到大多数节点的ACK确认后,向客户端返回写请求成功的响应。
通过同步机制和两阶段提交机制来达到集群中节点数据一致
补充:
Follower节点 | Observer节点 |
---|---|
常规节点 | 观察者节点 |
参与领导者选举过程,并将自己的选票发送给Leader节点 | 不参与领导者选举,它们不会成为Leader节点 |
通过与Leader节点的通信来接收并复制写操作的日志,保持数据的一致性 | 通过与Leader节点和Follower节点的通信来接收并复制写操作的日志,保持数据的一致性 |
总结:
Follower节点和Observer节点都是参与ZooKeeper集群的数据同步和读取,它们都维护了最新的数据副本。主要区别在于Follower节点参与领导者选举、投票和写操作的同步,而Observer节点不参与选举和投票,仅被动地接收并复制数据,用于扩展读取负载。使用Observer节点可以减轻Leader节点和Follower节点的读取压力,提高整个集群的性能。
三、Zookeeper集群领导者选取流程
初始化阶段:
当集群中的节点启动时,它们会以 参与者(Follower) 的身份加入集群。
每个节点都会与其他节点建立连接,形成一个集群网络。
选举触发:
当集群中的某个节点认为当前的领导者无法响应或发生了故障时,它会触发选举过程。
选举过程:
触发选举的节点发起一次选举,将自己成为候选者(Candidate)【后面通过比较进行改票】。
候选者向其他节点发送选举请求(包含自己的编号和ZXID,即事务ID)。
收到选举请求的节点根据一定的规则进行投票(如zxid和myid的大小),将投票结果回复给候选者。
选票投票:
节点在收到选举请求后,会比较候选者的编号和ZXID与自己的编号和ZXID。
如果候选者的编号和ZXID较大,则节点会将自己的选票投给候选者。
如果候选者的编号和ZXID较小,则节点会拒绝投票或忽略选举请求。
选票统计:
候选者收到超过半数节点的选票后,会成为新的领导者。
候选者会向其他节点发送领导者的通知,宣布自己成为新的领导者。
领导者同步:
新选出的领导者会将最新的数据状态广播给其他节点,确保数据的一致性。
其他节点接收领导者的广播后,会更新自己的数据状态。
完成选举:
当选举过程完成后,集群中的节点会根据最新的选举结果来确定领导者。
集群中的所有节点都知道谁是当前的领导者,并且与其建立通信。
需要注意的是,ZooKeeper的选举过程是基于Paxos算法的变种实现的,确保选举结果的一致性和可靠性。选举过程中,节点会相互通信、投票和统计选票,最终确定一个节点成为领导者,以维护集群的正常运行和数据的一致性。