请求。事务和标志符
请求
- 客户端的只读请求 exixt getData getChildren zk服务器本地处理后返回客户端
- 客户端会改变服务器状态的请求 create delete setData 转发给群首执行(事务)
假如⼀个客户端提交了⼀个对/z节点的setData请求,setData将会改变该znode节点数据信息,并会增加该节点的版本号,因此,对于这个请求的事务包括了两个重要字段:节点中新
的数据字段值和该节点新的版本号。当处理该事务时,服务端将会⽤事务中的数据信息来替换/z节点中原来的数据信息,并会⽤事务中的版本号更新该节点,⽽不是增加版本号的值。
当群⾸产⽣了⼀个事务,就会为该事务分配⼀个标识符,我们称之为ZooKeeper会话ID(zxid),通过Zxid对事务进⾏标识,就可以按照群⾸所指定的顺序在各个服务器中按序执⾏。服务器之间在进⾏新的群⾸选举时也会交换zxid信息,这样就可以知道哪个⽆故障服务器接收了更多的事务,并可以同步他们之间的状态信息。
群首选举
设置群⾸的⽬的是为了对客户端所发起的ZooKeeper状态变更请求进⾏排序,包括:create、setData和delete操作。群⾸将每⼀个请求转换为⼀个事务,如前⼀节中所介绍,将这些事务发送给追随者,确保集群按照群⾸确定的顺序接受并处理这些事务。
-
每个服务器启动后进入looking状态
1.如果已经存在群首,告知其他服务器
2.不存在,服务器之间通讯,交换信息选举,选举出来群首服务器进入leading,其他进入following -
一个服务器进入looking状态,给所有服务器发送投票信息(sid 服务器标识符,zxid 最近执行的事务zxid信息)
-
当服务器接收到一个投票信息
- 如果zxid比自己大或者zxid相同,sid比自己大就修改自己的投票信息
- 否则保留自己的投票信息
zab:状态更新的广播协议
follwer收到写请求后将请求转发给群首,群首执行后以事务的方式广播更新,当事务提交时,服务器就将变更反馈到数据树上-zk保存状态信息的数据结构
观察者
不同于追随者的是,观察者不参与我们之前介绍过的选举过程。他们仅仅学习经由INFORM消息提交的提议。由于群⾸将状态变化发送给追随者和观察者,这两种服务器也都被称为学习者。
服务器构成
独立服务器
1.PrepRequestProcessor接受客户端的请求并执⾏这个请求,处理结果则
是⽣成⼀个事务。我们知道事务是执⾏⼀个操作的结果,该操作会反映到
ZooKeeper的数据树上
2.下⼀个请求处理器为SyncRequestProcessor。SyncRequestProcessor负责
将事务持久化到磁盘上
3.为FinalRequestProcessor。如果Request对象包含事务数据,该处理器将会接受对ZooKeeper数据树的修改,否则,该处理器会从数据树中读取数据并返回给客户端。
群首服务器
1.PrepRequestProcessor
2.ProposalRequestProcessor 该处理器会准备⼀个提议,并将该提议发送给
跟随者。ProposalRequestProcessor将会把所有请求都转CommitRequestProcessor,⽽且,对于写操作请求,还会将请求转发给SyncRequestProcessor处理器。
3.SyncRequestProcessor,持久化事务到磁盘
4. 3执行完,执⾏完之后会触发AckRequestProcessor处理器,将执行结果返回给自己
5.CommitRequestProcessor 将收到⾜够多的确认消息的提议进⾏提交
6. FinalRequestProcessor
追随者和观察者服务器
1.FollowerRequestProcessor 服务器接收到客户端请求后转CommitRequestProcessor以及群首
2.CommitRequestProcessor 会直接转发读取请求到FinalRequestProcessor处理器,⽽且对于写请求,CommitRequestProcessor在转发给FinalRequestProcessor处理器之前会等待提交事务。
3. 当群⾸接收到⼀个新的写请求操作时,直接地或通过其他追随者服务
器来⽣成⼀个提议,之后转发到追随者服务器。当收到⼀个提议,追随者
服务器会发送这个提议到SyncRequestProcessor处理器,SendRequestProcessor会向群⾸发送确认消息。当群⾸服务器接收到⾜够确认消息来提交这个提议时,群⾸就会发送提交事务消息给追随者(同时也会发送INFORM消息给观察者服务器)。当接收到提交事务消息时,追随者就通过CommitRequestProcessor处理器进⾏处理。