1.Zookeeper的服务注册与发现
Zookeeper的服务注册与发现,主要应用的是Zookeeper的Znode数据模型和Watcher机制
服务注册:服务提供者会向Zookeeper服务端注册服务信息,即创建一个服务节点,并在节点上存储服务的相关数据(如服务提供者的ip地址、端口等):
服务发现:服务消费者会根据本身依赖的服务信息,向Zookeeper服务端获取注册的服务信息并设置Watch,获取到注册的服务信息之后将服务提供者信息缓存在本地,调用服务时直接根据从Zookeeper注册中心获取到的服务注册信息调用服务。
服务通知:当服务提供者因为某种原因宕机或不提供服务之后,Zookeeper服务注册中心的对应服务节点会被删除,因为服务消费者在获取服务信息的时候在对应节点上设置了Watch,因此节点删除之后会触发对应的Watcher,Zookeeper注册中心会异步向服务所关联的所有服务消费者发出节点删除的通知,服务消费者根据收到的通知更新缓存的服务列表。
2.Zookeeper的Watch机制
我们可以将Watch理解成是一个和指定Znode所绑定的监听器,当这个Znode发生变化,也就是在这个Znode上进行了数据的写操作(create、delete、setData),这个监听器监听到这些写操作之后会异步向请求Watch的客户端发送通知。
具体交互流程大致如下:
客户端调用getData方法向服务器获取某个Znode节点的数据时,设置watch为true。服务端接到请求后,返回节点的数据,并在维护的WatchTable中插入被Watch的Znode路径以及Watcher(watch该Znode的客户端);
当被Watch的Znode被删除或者更新之后,Zookeeper服务器会查找Watch Table,找到在Znode上对应的所有Watcher,异步通知对应的客户端,并且删除Watch Table中对应的Key:Value
3.zookeeper的ZAB协议
ZAB 协议是专门为 Zookeeper 设计的,用于实现分布式系统中的高可用性和一致性。它主要包括两个阶段:Leader 选举和消息广播。
Leader 选举:
在集群启动或 Leader 失效时,所有节点会进行 Leader 选举。
通过投票机制,选出一个新的 Leader。
消息广播:
Leader 负责处理所有的写请求,并将这些请求广播给所有的 Follower。
Follower 接收到消息后,进行确认(ack)。
当 Leader 收到多数派 Follower 的确认后,提交该请求,并通知所有 Follower 提交
4.Zookeeper中的领导者选举的流程是怎样的?
对于Zookeeper集群,整个集群需要从集群节点中选出一个节点作为Leader,大体流程如下:
1.集群中各个节点首先都是观望状态(LOOKING),一开始都会投票给自己,认为自己比较适合作为leader
2.然后相互交互投票,每个节点会收到其他节点发过来的选票,然后pk,先比较zxid,zxid大者获胜,zxid如果相等则比较myid,myid大者获胜;(zxid-文件id,myid-服务器id)
3.一个节点收到其他节点发过来的选票,,经过PK后,如果PK输了,此节点就会投给zxid或myid更大的节点,并将选票放入自己的投票箱中,并将新的选票发送给其他节点
4.如果pk是平局则将接收到的选票放入自己的投票箱中
5.如果pk赢了,则忽略所接收到的选票
6.当然一个节点将一张选票放入到自己的投票箱之后,就会从投票箱中统计票数,看是否超过一半的节点都和自己所投的节点是一样的,如果超过半数,那么则认为当前自己所投的节点是leader
7.集群中每个节点都会经过同样的流程,pk的规则也是一样的,一旦改票就会告诉给其他服务器,所以最终各个节点中的投票箱中的选票也将是一样的,所以各个节点最终选出来的leader也是一样的,这样集群的leader就选举出来了