zookeeper内部原理

一、请求,事务和标识符

zookeeper在本地处理只读请求(exists、getData和getChildren)因为服务器会在本地处理请求,那么此时zookeeper处理只读请求,那么它的性能就会很高。而那些会改变zookeeper状态的请求,将会被转发给群首,群首执行响应的请求,并形成状态的更新,我们称之为事务。

当群首产生了一个事务,就会为该事务分配一个标识符,我们称之为zookeeper会话ID(zxid),通过对zxid对事务进行标识吗,就可以按照群首所指定的顺序在各个服务器中按序执行。服务器在选举时也会交换zxid信息,这样就可以知道哪个无障碍服务器接受了更多的事务,并且可以同步它们之间的信息。

zxid为一个long型整数,分为两部分:时间戳部分和计数器部分。每个部分为32位。

二、群首选举

群首是集群中服务器选择出来的一个服务器,并一直会被集群所认可。设置群首的目的是为了对客户端所发起的zookeeper状态变更请求进行排序,包括create,setData和delete操作。群首将每个请求转化为一个事务。

当每个服务器启动后会进入LOOKING状态,并开始选举一个新的群首或查找已经存在的群首,如果群首已经存在,其它服务器会通知这个新启动的服务器。

当所有服务器均处于LOOKING状态时,这些服务器就会进行通信来选举一个群首。通过信息交换来对群首选举达成公式的选择。在本次选举过程中成功的服务器将会进入leading状态,其它的服务器进入FOLLOWINGF状态

对于群首选举的消息,我们称之为群首选举通知消息。当一个服务器进入LOOKING状态时,就会发送集群每个服务发送一个通知消息,该消息中包含该服务器的投票信息,投票中包含服务器标识符和最近执行的事务的zxid信息。

当一个服务器接收到一个投票信息后,该服务器会根据以下规则修改自己的投票信息。
1.将接受的voteId和votezxid作为一个标识符,并获取接收方当前的投票中的zxid,用myzxid和mysid表示接受方自己的值
2.如果votezxid>myzxid或者votezxid = myzxid且voteid>mysid保留当前的投票信息。
3.否则修改自己的投票信息,将votezxid赋值给myzxid,将voteid赋给mysid
简而言之,只有最新的服务器才会赢得选举。当一个服务器接收到仲裁数量的服务器发来的投票都一样时,就表示群首选举成功,如果被选举的群首为某个服务器自己,那么这个服务器就会行使群首角色。

三、Zab:状态更新的广播协议

为了确认一个事务是否提交,由此引入了我们所采用的协议,Zab:zookeeper atomic broadcast
假设现在我们有一个活动的群首服务器,并拥有仲裁数量的追随者支持该群首的管理权,该协议提交一个事务非常简单
1.群首向所有追随者发送一个PROPOSAL消息p
2.当一个追随者接收到消息P后,会响应一个ACK消息,通知群首其一接受该提案。
3.当收到的仲裁数量的服务器发送的确认消息后,群首就会通知追随者进行提交操作。

Zab保障了以下几个重要的属性

  • 如果群首按顺序广播了事务T和事务T’那么每个服务器在提交T’事务前保证事务T已经提交完成。
  • 如果某个服务器按照事务T 和事务T’的顺序提交事务,所有其它的服务器也会这样。

为了解决群首并发的情况,Zab提供了如下保障:

  • 一个被选举的群首确保在提交完所有之前的时间戳内需要提交的事务,之后才开始新的广播事务。
  • 任何时间都不会有两个被仲裁支持的群首。

为了实现第一个需求,群首并不会马上处于活动状态,直到确保仲裁数量的服务器认可这个群首的恶心的时间戳。

当时间戳发生转换时,zookeeper使用两种不同的方式来更新追随者来优化这个过程。如果追随者滞后于群首不多,群首只需要发送缺失的事务即可,这种方法称之为DIFF,如果追随者滞后很久,zookeeper将发送在代码中被称为SNAP的完整快照。

四、观察者

观察者与追随者类似,他们都接受来自群首的建议,不同于观察者的是,观察者不参与之前介绍的选举过程。他们仅仅学习经过INFORM消息提交的建议。
引入观察者的一个主要原因是提高读请求的可扩展性。因为要是加入更多参与投票的服务器,我们需要更大的仲裁数量,这样将减少写操作的吞吐率。
采用观察者的另一个好处是进行跨多个数据中心的部署。

五、本地存储

服务器通过事务日志来持久化事务,在接受一个提议时,一个服务器就会将提议的事务持久化到事务日志了。该事务日志保存在服务器的本地磁盘中,而事务会按照顺序追加其后。
组提交和补白会使使zookeeper更快。组提交是指在一次磁盘写入时追加多个事务。补白是指在文件中预分配磁盘存储块。这样对于涉及存储块分配的文件系统元数据的更新,就不会影响文件的写入速度。

六、快照

快照是zookeeper数据树的拷贝副本,每一个服务器会经常以序列化整个数据树的方式来提取快照,并将这个提取的快照保存到文件中。服务器在进行快照时不需要进行协作,也不需要暂停处理请求。因为服务器在进行快照时还会继续处理请求。所以当快照快完成时,数据树可能发生了变化,我们称这样的快照是模糊的,因为当快照快完成时,数据树可能又发生了变化,我们称这样的快照是模糊的,因为它们不能反应出在任何给定的时间点数据树的准确状态。

七、服务器与会话

zookeeper服务器的一个重要任务是跟踪并维护这些会话。在独立模式单个服务器跟踪所有的会话,而在仲裁模式下则由群首服务器来跟踪和维护。群首服务器和独立模式的服务器实际上运行相同的会话跟踪器。而追踪者服务器仅仅是简单地把客户端连接的会话信息转发给群首服务器。

为了保证会话的存活,服务器需要接收会话的心跳信息。心跳可以是一个新的请求也可或显式的ping消息。

对于管理会话的过期,有两个重要的要点。一个称为过期队列的数据结构,用于维护会话的过期。这个数据结构使用bucket来维护会话,每一个bucket对应某一个时间范围内过期的对话。群首服务器每次会让一个bucket过期。为了维护这些bucket,群首服务器会把时间分成一些片段,以expirationInterval为单位进行分割,并把每个会话分配到它对应的bucket里。以下面的式子计算

bucket = (expirationTime / expirationInterval + 1) * expirationInterval
使用bucket模式是为了减少让会话过期这项工作的系统开销。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值