我的理解是Zookeeper通常用于解决分布式系统(例如,数据库或MapReduce集群中的主节点)“跟踪哪个节点扮演特定角色”的问题。等)。
为简单起见,假设我们有一个具有一个主数据库和多个副本的数据库,并且数据库中的当前主节点出现故障。在这种情况下,原则上将使副本节点之一成为新的主节点。至此,我的理解是:
应用程序服务器可能不知道我们有一个新的主节点,因此除非我们在应用程序服务器上具有一些自定义逻辑来检测/纠正此问题,否则它们将不不知道将写入内容发送到哪里。
Zookeeper将以某种方式检测此故障,并更新相应主密钥的值。而且,应用程序服务器可以(可选地?)在Zookeeper中注册钩子,因此Zookeeper可以通知它们此失败,以便应用程序服务器可以更新(例如,在内存中)哪个DB节点是新的主节点。
我的问题是:
答案 0 :(得分:4)
1和2的答案都称为leader election process
,并以以下方式简要起作用:
当进程在由ZK管理的集群中启动时,集群进入election
状态。如果存在领导者,则存在已建立的层级,并且仅对现有领导者进行验证。如果没有领导者(例如主服务器已关闭),则ZK强制znodes使用序列标志来寻找新的领导者。每个节点与它的对等方对话,并发送一条消息,其中包含该节点的标识符(sid)和它执行的最新事务(zxid)。这些消息称为votes
。节点收到投票后,可以忽略投票,也可以根据zxid保留投票。如果zxid较新,则保留投票权(如果年龄大于其现有投票权),则放弃投票。如果zxids中有平局,则sid最高的投票获胜!因此,所有节点都将具有相同的投票权,这将通过sid定义新的领导者。这就是ZK选举新领导者节点的方式!