`
QING____
  • 浏览: 2232288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Zookeeper-Server端请求处理链

 
阅读更多

Zookeeper Server端对接收到的Client端请求,以及Leader接收到的Follower/Observer请求,都会以"处理链"的方式"分工/逐步"处理,这是一种良好的设计模式..不过事实上Zookeeper源码中,这部分代码写的确实比较"纠结"..

 

一. Folower端:

Follower与Client的通讯入口为ServerCnxn.doIO()方法,Follower与Leader的通讯操作入口Follower.followLeader()方法.下文中提到的请求,即为"Request"对象(将用户操作封装之后的对象)

FollowerZookeeperServer实例就是Follower为Client请求服务的对象.任何一个请求都将会依次经过如下"处理器"或过程:

1)   ZookeeperServer.processPacket(Request)方法开始处理请求,如果请求符合要求,将会被交付给"处理器".

2)   FollowerRequestProcessor(线程):作为Follower的首个"处理器",将Client请求队列化,因为其本身即为线程,则在线程run方法中,则从队列中逐个take出请求,并交付给"下一个处理器"(nextProcessor),对于write操作(create,delete,setData...)同时也将请求转发给Leader一份.

3)   Follower.followLeader()中,如果来自Leader的消息类型为"proposal",则将此消息交付给SyncRequestProcessor处理器.

4)   SyncRequestProcessor(线程):对于2)处理器转发给Leader的请求,Leader会经过处理后给所有的Followers发送"Proposal"(提议),Proposal中将会包含此次请求的zxid,cxid等.SyncRequestProcessor主要做了一件事情:将请求写入txnLog中.如果事务日志写入成功,则将请求转发给5)处理器

5)   SendAckRequestProcessor:因为在3)中,Follower已经接收到"提议",则在此处理器中,直接回馈Leader一个ACK包,按照惯例,此包仍然会包括zxid(此zxid来自proposal).

6)   Follower.followLeader()中,如果来自Leader的消息类型为"commit",则将此消息交付给CommitProcessor处理器.此处进行了严格的请求次序控制,如果发现乱序情况,则直接导致系统退出(乱序的特征:pendingTxns.element().zxid,其中pendingTxns是个队列,表示proposal队列,即commit的顺序必须和proposal的顺序一致)

7)   CommitProcessor(线程): 对于来自Leader的commit请求,会被队列化,那么在CommitProcessor线程的run方法中,则会逐个处理"commit"请求.此处理器很简单,它的特点就是让请求处理"逐个进行"传递给下一个处理器.

8)   FinalRequestProcessor:将数据变更操作持久化,操作ZKDatabase,如果有必要,则触发相应的watches.

 

二.Observer端: 和Follower很像,但是它没有SendAckRequestProcessor,当接收到commit类型的请求时,直接提交就行.它不参与proposal和ack.

 

二.Leader端:

Leader端和Follower端在交互上形成对应.Leader与Follower通讯入口为LearnerHandler.run();

1)   对于Follower转发给Leader的write操作,请求类型为Leader.REQUEST,则触发此请求添加到请求队列中,此后将有"处理器链"依次处理.

2)   PreRequestProcessor(线程):将请求队列化,是请求的预处理阶段,因为Leader可以断言所有的write操作必将带来额外的影响,比如节点的创建会影响其父节点的version变更,比如Sequential节点创建需要计算序列号码等.此处理器并没有做实际的工作,主要作用就是生成一个zxid,并交付给请求....继续下一个处理器.

3)   ProposalRequestProcessor:将请求封装成一个"Proposal"依次发送给所有的Follower,发送操作也是有LearnerHandler来做...此后,将有将请求交付给SyncRequestProcessor.

4)   SyncRequestProcessor(线程):和Follower一样,记录txnLog.

5)   AckRequestProcessor:是Leader对请求的补充操作,Leader对请求直接做"ACK"操作,意味着任何一个Proposal,Leader都会立即提交ACK.

6)   Leader此时将会获得Follower交付的ACK请求,将会直接使用leader.processAck(serverId,zxid..)处理,此方法的主要作用就是,对请求队列中亟待"commit"的请求进行确认,直到"大多数"Follower都对某个请求进行了ACK,此请求才会被commit;如果对一个已经commited的请求进行确认(即当前ack请求的zxid小于先已提交的zxid),将会忽略(下一个处理器,将会告知其立即提交)...

7)   CommitProcessor(线程):如果LearnerHandler接收到ACK请求时,都会执行Leader.commit()方法,此方法的最要作用就是针对"多数派"的请求,则向Follower/Observer发送Commit请求;此后,把此请求交付给下一个处理器ToBeAppliedRequestProcessor.

8)   ToBeAppliedRequestProcessor:根据命名,我们也能知道,此处理器就是在"即将实施变更"之前,做一些额外的工作,在向所有的Follower发送Commit之前,Leader特意把此请求添加一个队列中(为了防止,在最后时机发送乱序情况,比如发送commit时遇到异常),如果"请求"到达ToBeAppliedRequestProcessor,说明当前commit请求被如期发送给了所有的所有的Follower(事实上有可能正在发送),那么ToBeAppliedRequestProcessor所做的就是把队列头部的Commit移除,并继续传递给下一个处理器.

9)   FinalRequestProcessor:和Follower一样,在本地ZKDatabase中持久化此变更请求.

 

这就是Follower和Leader进行的"二阶段"提交和事务控制的全过程,不过因为IO操作本身就存在很多"异常可能";那么Follower和Leader所做的,就是控制好请求被执行的顺序,也就是确保事务性和全局数据一致性;如果Follower发现乱序或者IO异常,唯一能做的,就是重新和Leader同步;Leader能做的就是阻塞后续请求或者发起选举.

分享到:
评论

相关推荐

    zookeeper-3.3.6.tar.gz

    clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。 initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 ...

    zookeeper安装包 支持window

    解压zookeeper-3.5.3-beta.rar,安装完成后,进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个java进程: (注:需要先启动zookeeper后,后续dubbo demo代码运行才能使用zookeeper注册中心的功能)

    KafkaRequestReplyPOC:带Kafka和Spring-Boot的Request-Reply-POC

    Kafka请求-答复POC如何运行(Windows): (从Kafka目录中)启动ZooKeeper: bin\windows\zookeeper-server-start.bat config\zookeeper.properties 启动Kafka: bin\windows\kafka-server-start.bat config\server....

    finagle-serverset-example

    Finagle ServerSet 示例 这是一个快速示例,说明如何将 finagles “新”服务器设置与 zookeeper 解析器一起使用。 通过 new 我指的是在不引用ClientBuilder或ServerBuilder api 的情况下进行设置。 这个项目是用 sbt...

    电线模拟

    .\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties .\bin\windows\kafka-server-start.bat .\config\server.properties 坚持进行测试 一次运行 Create a person objects and persist in the ...

    分布式协调工具-ZooKeeper实现动态负载均衡

    利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很轻易的在分布式...

    开课吧-04分布式协调服务器Zookeeper.pdf

    所有事务请求的结果在集群中所有 Server 上的应用情况是一致的。要么全部应用成功, 要么都没有成功,不会出现部分成功,部分失败的情况。 1.2.3 单一视图 无论客户端连接的是集群中的哪台 Server,其读取到的数据...

    ZooKeeper实际应用案例-开发实战

    这些server之外,还有数台给前端提供接口的搜索server,这些机器属一个集群,我们称之为检索服务器。当搜索请求过来时,他们负责把搜索请求转发到那100台机器,待所有机器返回结果后进行合并,最终返回给前端页面。...

    Zookeeper介绍

    3、全局数据一致:每个 Server 保存一份相同的数据副本,Client 无论连接到哪个 Server,数据都是一致的。 4、更新请求顺序进行,来自同一个 Client 的更新请求按其发送顺序依次执行。 5、数据更新原子性,一次数据...

    分布式专题-04分布式协调服务之Zookeeper实践及与原理分析

    事务的实现原理深入分析Watcher机制的实现原理ClientCnxn 初始化客户端通过 exists 注册监听cnxn.submitRequestSendThread 的发送过程client 和 server 的网络交互服务端接收请求处理流程处理客户端传送过来的数据包...

    zipkin-demo:关于如何使用Spring Cloud Sleuth + Kafka + Zipkin + ElasticSearch的演示

    zipkin的server端,从kafka中接收slueth发送的trace数据,并存储到ES中。 还提供web ui。 系统框架图 启动 1、启动zookeeper和kafka 2、启动ElasticSearch 3、启动logstash bin/logstash -f config/logback-test....

    Redis 集群解决方案 Codis.zip

    Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的...

    rpc:净额+ Zookeeper的RPC

    使用Netty启动通信服务器,接收调用端发起的请求。 ServiceRegistry 注册服务地址到zookeeper。 ServerHandler 解析调用端请求,反射执行调用的服务,并返回结果至调用方。 3.编解码器 RpcCodec类,整合了编码器和...

    最新企业级SpringCloud架构指导-视频教程网盘链接提取码下载 .txt

    课程结合企业架构目前应用的最新SpringCloud架构技术...课程内容涉及了Dubbo,Eureka,zookeeper,EurekaServer,OpenFeign,Ribbon,服务熔断,服务降级,令牌桶限流,多维请求限流等企业级开发技术。 视频大小:2.9G

    eagle:Eagle分布式rpc调用,借助Zookeeper实现服务注册和发现,基于AQS实现高性能连接池,支持分布式追踪、监控、过载保护等配置。提供Spring和SpringBoot插件,方便与Spring和SpringBoot集成

    提供接口方法请求时间、tps等监控信息。 提供和自定义服务端过载保护策略。 jmh基准测试结果 运行基准测试步骤: cd eagle-benchmark mvn clean install cd eagle-benchmark-server/target tar -zxvf eagle-...

    毕业设计: 分布式多媒体共享平台,采用分布式系统构架,保证服务的稳定性

    其中Server-API主要包含一些基本工具类和服务接口等,Server主要是业务逻辑和数据持久化,Client主要是WEB服务,处理web请求。 系统构架 系统构架采用目前中小型公司常用的构架方式。 系统采用的技术 系统采用的...

    Codis分布式Redis解决方案-其他

    Codis是一个分布式Redis解决方案,对于上层的应用来说,连接到CodisProxy和连接原生的RedisServer没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Redis一样使用,Codis底层会处理请求的转发,不停机的...

    使用JMeter对ZK性能测试时需要安装的插件

    Version: Applicable to JMeter 2.8+(适用JMeter版本) 以下为官方说明: Prepare a simple IdGenerator For security reasons, ZK generates ID randomly. However to perform a ...7.Start the ZK HTTP Proxy Server

    dubbo-trace:基于Dubbo的分布式系统调用跟踪Demo

    基于dubbo的分布式系统调用跟踪demo 快速开始: 确保已经正常启动; 确保已经正常启动: 分别运行以下命令: 克隆项目: ...编辑trace-demo各项目对应配置: app.properties: ... dubbo.registry=...在浏览器请求:

Global site tag (gtag.js) - Google Analytics