码迷,mamicode.com
首页 > 其他好文 > 详细

第九章:zookeeper内部原理

时间:2019-03-14 09:18:50      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:span   转发   集群   一个   要求   line   hit   node节点   结果   

zookeeper集群中的服务器分为三种角色:群首leader、跟随者follower、观察者observer。
群首作为中心点处理所有对zookeeper系统变更的请求,包括create、setData、delete;
追随者角色接收群首所发出的更新操作请求,并对这些请求进行处理,以此来保障状态更新操作不会发生碰撞。
观察者角色的设计只是为了系统的可扩展性。
群首与跟随者角色会参与集群群首的选举。
其中群首与跟随者服务器组成了保障状态变化有序的核心实体。
 
请求、事务、标识符
1、zookeeper服务器会在本地处理只读请求,包括exist、getData、getChildren操作。例如一个服务器接收到客户端的getData请求,服务器读取状态信息,并将这些信息返回给客户端。
因此服务器在处理只读请求时性能很高,同时可以通过扩张更多的服务器的方式,处理更多的只读请求,提升整体的处理性能。
2、zookeeper对那些可以更改状态的请求,包括create、setData、delete操作,会被转发给群首leader,群首执行相应的请求,并形成状态更新,可以把这个过程称为事务。
其中请求表示客户端发起的操作 ,而事务则包含了对应请求处理而改变zookeeper状态所需要执行的步骤。
注意:一个客户端提交了一个对/z节点的setData请求,setData将会改变node节点的数据信息, 并增加该节点的版本号,因此对这个请求的事务包含了两个重要字段:节点中新的数据字段和该节点新的版本号。当处理该事务时,服务端将会用事务中的数据信息替换/z节点的数据,同时使用事务中的版本号替换/z节点的版本号,而不是增加版本号的值。
zookeeper集群以事务方式运行,并保证所有变更操作以原子方式被执行,同时不会被其他事务所干扰。
zookeeper使用多线程的方式,以便提高事务处理的速度。
zookeeper的事务具有幂等性,我们可以对一个事务执行两次。得到的结果还是一样的。还可以对多个事务执行多次,只要保证多个事务执行的顺讯都是一样的。
事务的幂等性可以让我们进行恢复处理时更简单。
群首对产生的每个事务都会分配一个标识符,可以成为zxid,zxid由两部分组成:时间戳和计数器,这两个字段都是32位的。
 
群首选举
群首为zookeeper集群中选举出的一个服务器,群首可以保证对zookeeper集群的变更操作请求进行排序。
群首必须被法定数据量的服务器所认可,法定数量必须在集群数量是能够交叉的,以避免出现脑裂问题。
使用仲裁来表示属于一个进程的子集(包括群首与跟随者服务器),仲裁模式要求服务器之间两两相交。
每个服务器在启动后都会进入looking状态,开始选举一个新的群首或者查找已经存在的群首。
如果已经存在群首,其他服务器就会通知这个新启动的服务器,告知哪个服务器时群首,同时新的服务器需要与群首建立连接,以确保自己的状态与群首一致。
如果集群中的所有服务器都处于looking状态,这些服务器之间就行通讯来选举一个群首。

第九章:zookeeper内部原理

标签:span   转发   集群   一个   要求   line   hit   node节点   结果   

原文地址:https://www.cnblogs.com/use-D/p/10527722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!