apachezookeeper(apachezookeeperreleases)
本篇文章给大家谈谈apachezookeeper,以及apachezookeeperreleases对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、zookeeper高可用集群部署
- 2、Zookeeper之领导者选举算法源码分析
- 3、状态机中间件有哪些
- 4、Zookeeper之两阶段提交源码分析
- 5、apache zookeeper是干什么的
zookeeper高可用集群部署
一、Zookeeper 的搭建方式春顷吵
Zookeeper 安装方式有三种,单机模式和集群扒侍模式以及伪集群模式。
Zookeeper 通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够保证服务继续。
为什么一定要超过半数呢? 这跟 Zookeeper 的复制策略有关:Zookeeper 确保对 znode 树的每一个修改都会被复制到集合体中超过半数的机器上。
二、配置JDK环境
三、Zookeeper 单机模式搭建
1、下载 ZooKeeper :
2、解压
3、配置环境变量
非必须操作
4、修改 Zookeeper 的配置文件 conf/zoo.cfg
5、启动 ZooKeeper
四、Zookeeper 集群模式搭建
Zookeeper 集群模式搭建方案:
1、解压
2、配置环境变量
非必须操作
3、修改 Zookeeper 的配置文件
zookeeper参数说明
A :其中 A 是一个数字,表示这个是服务器的编号;乎坦B :是这个服务器的 ip 地址;C :Leader 选举的端口;D :Zookeeper 服务器之间的通信端口。
4、添加服务器标识配置 dataDir/myid
5、将修改后的zookeeper分发到其他节点
6、启动
分别在3个节点启动zookeeper
查看状态
五、 Zookeeper 伪集群模式搭建
只需将zookeper复制3份到不同的位置,配置如下
zookeeper服务脚本
Zookeeper之领导者选举算法源码分析
QuorumPeer继承了ZooKeeperThread线程类
org.apache.zookeeper.server.quorum.QuorumPeer#run
本地或远程注册
在循环内根据不同的状态运行
1、readonlymode
首先判断只读模式是否打开readonlymode.enabled默认是false
2、进行领导者选举
表示:zk1、zk2、zk3三台zk服务端(myid1=1、epoch1当前届改没数、zxid1是当前zk1服务的状态信息)。图中连线0表示把投给自己的选票并此肢放入sendqueue队列中,图中连线1表示发送给其他参与者(即是调用sendNotifications方法),2表示从recvqueue接收队列获取的选票与当前服务器持有选票进行比较。
org.apache.zookeeper.server.quorum.FastLeaderElection#lookForLeader
1、第一次启动,默认投自己,并更新当前服务协议的领导者信息的值proposedLeader、proposedZxid、proposedEpoch
4、从recvqueue不断获取收到的投票信息
其他服森歼世务器的投票或投给自己的都放到这里
②、connectAll建立连接
org.apache.zookeeper.server.quorum.QuorumCnxManager#connectAll
org.apache.zookeeper.server.quorum.SyncedLearnerTracker#hasAllQuorums
是否过半判断
领导者角色已经确立,其他服务器启动角色处理
recvqueue数据是从Messenger.WorkerReceiver线程不断获取的
1、WorkerReceiver#run
org.apache.zookeeper.server.quorum.FastLeaderElection.Messenger.WorkerReceiver#run
2、不是有效的投票者
!validVoter(response.sid)表示是观察者
这里也进行了处理,把当前current的投票放入到sendqueue并返回给当前启动的那台服务器(通过response.sid)
把当前服务得到的currentVote放入到sendqueue队列,并返回发送给这台服务器
1、FOLLOWING节点挂了一半
org.apache.zookeeper.server.quorum.Leader#lead
不断向learners节点ping,如果挂了一半则会跳出循环leader.lead();阻塞被解除
org.apache.zookeeper.server.quorum.QuorumPeer#updateServerState
领导者选举算法核心就是把选票封装并放入到sendqueue集合发送,通过recvqueue得到其他服务节点的选票。并不断比较PK,更改选票并不断发送,并验证是否过半。如果过半则选举出来领导者。
领导者选举触发情况:刚启动、FOLLOWING节点挂了一半、LEADING节点挂掉
状态机中间件有哪些
状态机中间件有ApacheZooKeeper、etcd、Consul。
1、ApacheZooKeeper:ZooKeeper是一个分布式的、开源的协调服务,在分布式系统中广泛应用于状态管理、分布式锁、配置管理等场景。ZooKeeper提败枣供了完备的状态管理能力,可以用于构建复杂的分布式状态机系统。
2、etcd:etcd是一个分布式的键值存储系统,可用于服务发现、配置管理、分布式锁等场景。etcd支持基于Raft协议的一致性复制,可以保证状态机在分布式环境下的正确性。
3、备迟Consul:Consul是一个分布式的服务发现和配置管理系统,提供了分布式锁、分布式状态察滚拆机等功能。Consul支持Raft算法,可以保证状态机在分布式环境下的安全性。
[img]Zookeeper之两阶段提交源码分析
zookeeper集群为了保证数据一致性,使用了两阶段提交。
在zookeeper集群的角色有:leader、follower、observer。
在这几个角色中处理读写请求是不同的:
读请求:从当前节点直接读取数据
写请求:在leader直接进行两阶段提交、在非leader则是把竖谈陵请求转交给leader处理
所以,分析两阶段提交就是分析集群模式下的请求处理。在单机模式在请求处理是经过RequestProcessor请求处理链处理。
单个zookeeprt请求余戚处理主要有以下几步:
1、对当前请求生成日志txn
2、持久化日侍中志txn
3、根据日志txn更新Database
两阶段提交(2PC)步骤:
其中标绿色的PrepRequestProcessor、SyncRequestProcessor、CommitProcessor都继承了ZooKeeperCriticalThread是一个线程。
org.apache.zookeeper.server.quorum.LeaderZooKeeperServer#setupRequestProcessors
org.apache.zookeeper.server.quorum.ProposalRequestProcessor#ProposalRequestProcessor
org.apache.zookeeper.server.quorum.LeaderRequestProcessor#processRequest
①、检查是不是local session本地session,创建临时节点会升级session
org.apache.zookeeper.server.quorum.QuorumZooKeeperServer#checkUpgradeSession
②、交给下一个请求处理器处理
作用与单机模式相同,给请求Request的Hdr和Txn赋值,然后交给下一个请求处理器处理
如果是写请求(request.getHdr() != null),则会把当前请求封装为协议并发送给follower。发送之后交给SyncRequestProcessor持久化处理
org.apache.zookeeper.server.quorum.Leader#propose
org.apache.zookeeper.server.quorum.Leader#sendPacket
发送到所有其他Followe节点forwardingFollowers
把请求放入到queuedRequests阻塞队列
①、对请求进行持久化与单机相同
org.apache.zookeeper.server.SyncRequestProcessor#run
向lead发送自己的ack(2PC发送ACK)
org.apache.zookeeper.server.quorum.Leader#processAck
org.apache.zookeeper.server.quorum.Leader#tryToCommit
org.apache.zookeeper.server.quorum.CommitProcessor#commit
提交当前请求,放入到committedRequests,最终会更新database
CommitProcessor类参数:
queuedRequests:表示接收到的请求,没有进行两阶段的提交
queuedWriteRequests:表示接收到的写请求,没有进行两阶段的提交
committedRequests:表示可以提交的请求,在两阶段验证过半之后进行会在本地进行committe操作,便添加到这个队列
commitIsWaiting:表示存在可以提交的请求(committedRequests是否有值,有true)
pendingRequests:是一个map集合,表示每个客户端sessionId的请求
Leader类参数:
outstandingProposals:表示记录提议的请求的队列,符合过半机制之后会移除
toBeApplied:表示记录待生效的请求,在FinalRequestProcessor移除
①、processRequest
org.apache.zookeeper.server.quorum.CommitProcessor#processRequest
首先判断是否需要两阶段提交。如果需要则会添加到queuedWriteRequests队列
org.apache.zookeeper.server.quorum.CommitProcessor#needCommit
如果是更改操作则返回true
d、然后,再看一下这个while的退出条件。
①、从queuedRequests取出的是空
②、如果queuedRequests数据不为空,那么requestsToProcess是大于0的。这时只有maxReadBatchSize 0或readsProcessed = maxReadBatchSize才能退出。
maxReadBatchSize 0表示默认是-1,如果配置了这个参数当连续读了readsProcessed时,也会退出。
③、pendingRequests和committedRequests不为空
e、commitIsWaiting有待提交的
org.apache.zookeeper.server.quorum.Leader.ToBeAppliedRequestProcessor#processRequest
删除toBeApplied
其中标绿色的FollowerRequestProcessor、CommitProcessor、SyncRequestProcessor都继承了ZooKeeperCriticalThread是一个线程。
org.apache.zookeeper.server.quorum.FollowerZooKeeperServer#setupRequestProcessors
开了两条链:
FollowerRequestProcessor(firstProcessor)----CommitProcessor-----FinalRequestProcessor
SyncRequestProcessor----SendAckRequestProcessor
org.apache.zookeeper.server.quorum.FollowerRequestProcessor#processRequest
请求添加到queuedRequests队列
FollowerRequestProcessor是一个线程,会从queuedRequests获取请求
org.apache.zookeeper.server.quorum.FollowerRequestProcessor#run
createSession和closeSession也会转发给lead节点处理
org.apache.zookeeper.server.quorum.SendAckRequestProcessor#processRequest
在用SendAckRequestProcessor处理之前会先调用SyncRequestProcessor进行持久化处理,由于与单机或lead处理相同就不单独列出来了。
向领导者发送确认ack包
org.apache.zookeeper.server.quorum.Learner#writePacket
在经过FollowerRequestProcessor处理后,lead端会得到一个Request的请求
org.apache.zookeeper.server.quorum.LearnerHandler#run
org.apache.zookeeper.server.quorum.Leader#submitLearnerRequest
在连接Follower节点的客户端发送更改命令请求会转发到leader节点的prepRequestProcessor进行处理
1、run
org.apache.zookeeper.server.quorum.QuorumPeer#run
2、followLeader
org.apache.zookeeper.server.quorum.Follower#followLeader
不断读取从lead端的数据包
org.apache.zookeeper.server.quorum.FollowerZooKeeperServer#logRequest
其中标绿色的ObserverRequestProcessor、CommitProcessor、SyncRequestProcessor都继承了ZooKeeperCriticalThread是一个线程。
org.apache.zookeeper.server.quorum.ObserverZooKeeperServer#setupRequestProcessors
也是开了两条链:
ObserverRequestProcessor(firstProcessor)----CommitProcessor-----FinalRequestProcessor
SyncRequestProcessor----null
observer节点不参与两阶段提交,所以同步SyncRequestProcessor之后没有ACK确认提交。这样既提高了读效率,又对写效率没有影响。请求处理链与leader、follower的功能相同不再累述。
zookeeper集群的两阶段提交,是在写操作的情况下发生的。2PC的整体实现逻辑是在RequestProcessor请求处理链处理的。只有在接受到的ACK超过一半才会进行提交,提交的实现逻辑是在CommitProcessor中实现的,CommitProcessor处理器中里面涉及多种集合、队列等参数(需要首先了解这些参数意义,然后再读CommitProcessor源码)。
apache zookeeper是干什么的
简介ZooKeeper是耐坦腔Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护昌衫、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
信隐 Zookeeper是Google的Chubby一个开源的实现.是高有效和可靠的协同工作系统.Zookeeper能够用来leader选举,配置信息维护等.在一个分布式的环境中,我们需要一个Master实例或存储一些配置信息,确保文件写入的一致性等.[1]
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,包含一个简单的原语集,是Hadoop和Hbase的重要组件。
说白了是hadoop的组件之一,用来管理hadoop。
关于apachezookeeper和apachezookeeperreleases的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。