《zk:分布式过程协同技术详解》读书笔记2-内部原理篇
简介:
《zk:分布式过程协同技术详解》读书笔记2-内部原理篇
9.1 请求、事务和标识符zxid
- zk服务器会在本地处理只读请求(如,getData,getChildren,exists).
- 那些会改变zk状态的客户端请求(create, delete和setData)将会被转发给Leader,由Leader执行响应的请求并形成状态的更新,且每次更新都会形成一个事务。以setData为例,变更节点的数据但是不变更节点的版本号将导致错误发生,因此,zk集群以事务的方式运行,确保所有的变更操作以事务的方式被执行,同时不会被其他事务所干扰。
- 当Leader产生了一个事务,就会为这个事务分配一个标识符,称之为zk的会话id(zxid),通过zxid对事务进行标识,这样就可以实现按照Leader所指定的顺序在各个服务器中顺序执行。
- 服务器之间在进行Leader选举的时候也会交换zxid,从而判断哪个无故障的服务器接收了更多的事务,并可以同步服务器之间的状态信息。
- zxid为一个long(64位)的整数,分为两部分,时间戳epoch和计数器counter部分,每个部分为32位。
9.2 群首Leader选举
- 先比较zxid(事物ID)再比较sid(myid)
9.3 Zab:状态更新的⼴播协议
- Zab协议: Zookeeper原子广播协议 Zookeeper Atomic Broadcase protocol
- 该协议提交一个事务的过程类似于两阶段提交
- 群首在接收到写请求后,会向所有的Follower发送一个PROPOSAL(提议)消息P
- FOLLOWER接收到消息p后,会响应群首一个ACK消息,通知群首已接收该提案PROPOSAL
- 当收到仲裁数量(超过集群数量的一半)的服务器的ACK(包括群首自己)后,群首就会发送消息通知FOLLOWER进行提交COMMIT操作。