1. Zookeeper Watch Watch 说的是 Zookeeper 的监听机制。一个 Watch 事件是一个一次性的触发 器,当被设置了 Watch 的数据发生了改变的时候,则服务器将这个改变发送给设置了 Watch 的客户端,以便通知它们。 改变有很多种方式,如:节点创建,节点删除,节点改变,子节点改变等。 1.1. Watch 机制特点 一次性触发 数据发生改变时,一个 watcherevent 会被发送到 client,但是 client 只 会收到一次这样的信息。 Watcher event 异步发送 watcher 的通知事件从 server发送到 client 是异步的。 数据监视 Zookeeper有数据监视和子数据监视 getdata()、 exists() 设置数据监视 getchildren()设置了子节点监视 注册watcher getData、exists、getChildren 触发watcher create、delete、setData 1.2. Watch 的事件类型 Zookeeper的 watch 实际上要处理两类事件 1.2.1 连接状态事件(type=None,path=null) 这类事件不需要注册,也不需要我们连续触发,我们只要处理就行了。 None 在客户端与 Zookeeper 集群中的服务器断开连接的时候,客户端会 收到这个事件。 1.2.2节点事件 节点的建立,删除,数据的修改。 NodeCreated Znode 创建事件 NodeDeleted Znode 删除事件 NodeDataChanged Znode 数据内容更新事件。其实本质上该事件只关注 dataVersion版本号,但是只要调用了更新接口 dataVersion 就会有变更。 NodeChildrenChanged Znode 子节点改变事件,只关注子节点的个数变 更,子节点内容有变更是不会通知的。 2. Zookeeper 选举机制 zookeeper默认的算法是 FastLeaderElection,采用投票数大于半数则胜出 的逻辑。 2.1.概念 服务器 ID 比如有三台服务器,编号分别是 1,2,3。 编号越大在选择算法中的权重越大。 选举状态 LOOKING,竞选状态。 FOLLOWING,随从状态,同步leader 状态,参与投票。 OBSERVING,观察状态,同步 leader 状态,不参与投票。 LEADING,领导者状态。 数据 ID 服务器中存放的最新数据 version。 值越大说明数据越新,在选举算法中数据越新权重越大。 逻辑时钟 也叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,然后与接收到的其它服务器返回的投票信息中的数值相比,根据不同的值做出不同的判断。 2.2.全新集群选举 假设目前有 5 台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下: 服务器 1 启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器 1 的状态一直属于 Looking。 服务器 2 启动,给自己投票,同时与之前启动的服务器 1 交换结果,由于服务器 2 的编号大所以服务器 2 胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是 LOOKING。 服务器 3 启动,给自己投票,同时与之前启动的服务器 1,2 交换信息,由于服务器 3 的编号最大所以服务器 3 胜出,此时投票数正好大于半数,所以服务器 3 成为领导者,服务器 1,2 成为小弟。 服务器 4 启动,给自己投票,同时与之前启动的服务器 1,2,3 交换信息,尽管服务器 4 的编号大,但之前服务器 3 已经胜出,所以服务器 4 只能成为小弟。 服务器 5 启动,后面的逻辑同服务器 4 成为小弟。 2.3.非全新集群选举 对于运行正常的 zookeeper 集群,中途有机器 down掉,需要重新选举时,选举过程就需要加入数据 ID、服务器 ID 和逻辑时钟。 数据 ID:数据新的 version就大,数据每次更新都会更新 version。 服务器 ID:就是我们配置的 myid中的值,每个机器一个。 逻辑时钟:这个值从 0 开始递增,每次选举对应一个值。 如果在同一次选举中,这个值是一致的。 这样选举的标准就变成: 1、逻辑时钟小的选举结果被忽略,重新投票; 2、统一逻辑时钟后,数据 id 大的胜出; 3、数据 id 相同的情况下,服务器 id大的胜出; 根据这个规则选出 leader。
|