Zookeeper Processor
processors
PrepRequestProcessor通常是请求处理链的第一个处理器.识别客户端请求是否是事务请求.对于事务请求,做预处理,诸如 创建请求事务头,事务体,会话检查,ACL检查 和 版本检查 等.
ProposalRequestProcessorleader 服务器的事务投票处理器,也是 leader 服务器事务处理流程的发起者.对于 非事务请求,它会直接将请求流转到 CommitProcessor 处理器,不再做其他处理.对于 事务请求,除了将请求交给CommitProcessor处理器外,还会根据请求类型创建对应的 Proposal 提议,并 发给所有 Follower 来发起一次集群内的事务投票.它还会将事务请求交给 SyncRequestProcessor 进行事务日志的记录.
SyncRequestProcessor事务日志记录处理器,将事务请求记录到事务日志文件中,同时还会触发zk进行数据快照.发送Sync请求的处理器.将请求记录到磁盘.它批量处理有效执行io的请求.在将日志同步到磁盘之前,请求不会传递到下一个 Processor.维护了一个处理请 ...
Zookeeper选举流程
leader选举相关线程QuorumCnxManager : 管理者,包含发送 和 接收 队列.持有 listener.
QuorumCnxManager.Listener : 监听 并 建立 server 之间的连接.
FastLeaderElection.Messenger.SendWorker消息生产者.循环 从发送队列 queueSendMap 中取消息(出队)并发送出去.并将该消息存入 lastMessageSent 中.
FastLeaderElection.Messenger.RecvWorker消息消费者.循环 接收线程从底层 Socket 收到报文后放到 recvQueue 队列中,等待 Messenger 调用 pollRecvQueue 方法获取消息.
leader选举流程启动时选举选举算法的创建之前先创建 QuorumCnxManager,它通过 TCP 协议来进行 leader 选举.每一对server之间都会保持一个TCP链接.zookeeper服务之间都是配置myid大的作为客户端连接,myid小的作为服务器端.创建server端的发送线程和接收线程.
投 ...
Zookeeper启动流程
zk启动流程
启动类为 QuorumPeerMain
解析 zoo.cfg 配置
创建并启动 DatadirCleanupManager 用于清理过期 snapshot 和 txnlog.
创建 QuorumPeer 实例并启动该线程,用于完成选举.
根据 snapshot 和 txnlog 恢复 内存数据库 ZKDatabase.
12345678910111213141516171819202122232425262728293031323334353637383940- QuorumPeerMain.main()- 1.创建QuorumPeerMain对象- 2.初始化 运行 main.initializeAndRun(args) - 0.创建QuorumPeerConfig对象 - 1.通过QuorumPeerConfig.parse(),解析配置文件 - 读取zoo.cfg配置到Properties中 - parseProperties()解析Properties配置到QuorumPeerConfig对象中 - 2.启动定时清 ...
Zookeeper环境搭建
zk idea 代码阅读环境搭建采用最新的 zookeeper release 版本 3.4.13zk发行版下载地址
从 github 上 clone 该版本的代码.
1. ant 构建 zkbuild.xml 搜索 ant-eclipse-1.0.bin.tar.bz2, 1290行修改
12<get src="http://ufpr.dl.sourceforge.net/project/ant-eclipse/ant-eclipse/1.0/ant-eclipse-1.0.bin.tar.bz2"dest="${src.dir}/java/ant-eclipse-1.0.bin.tar.bz2" usetimestamp="false" />
执行 ant eclipse
2. idea 导入这个 eclipse 项目即可File -> New -> import project from exist source -> 选eclipse
将 src/java 设 ...
Zookeeper数据同步流程
zk选举完后数据同步流程Leader为每个Follower/observer都建立一个TCP长连接.
LearnerHandler,即learner服务器的管理者,负责follower/observer服务器和leader服务器之间的一系列网络通信.包括数据同步,请求转发和Proposal提议的投票等.
leader.lead();->leader 从磁盘中恢复数据和session列表Leader zk.loadData();->Leader 启动监听线程 LearnerCnxAcceptor, 等待新的followers的连接请求->follower 连接leaderFollower follower.followLeader();->LearnerCnxAcceptor 监听到follower的socket请求,为每个 follower 创建单独的 LearnerHandler 线程用于交互.->follower 发送 FOLLOWERINFO 包 给leader,包括新的zxid和 sidFollower registerWit ...
Java 线程池实现原理
Java 线程池实现原理提交任务流程提交任务 submit() 流程。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748491.newTaskFor() 将任务包装成 FutureTask2.execute(task)交给executor执行任务 执行任务 1.若当前线程数少于核心线程数,则直接创建并添加一个 worker 来执行任务. 创建成功直接返回,否则往下走 addWorker()方法 创建一个新的线程,并把当前任务 command 作为这个线程的第一个任务 addWorker() 一.循环CAS操作,将线程池中的线程数+1 0.外层循环 1.获取当前线程状态 2.若当线程池处于 SHUTDOWN 的时候,不允许提交任务,但是已有的任务继续执行.返回false ...