zookeeper - 多线程分析(10)

概述

    这篇文章目的主要是为了讲解清楚zookeeper启动过程中启动各类服务,说白了就是启动了线程提供服务,希望通过这个文章的梳理能够让大家对整个zookeeper的线程架构有一个清晰的印象。

线程分析

整个zookeeper的线程按照功能进行划分,主要分为下面5类,分别是 选举相关线程Client连接相关线程Peer连接相关线程Peer调用链线程quorumPeer线程

zookeeper线程分析

选举相关线程

    选举相关线程顾名思义,就是在zookeeper集群发生重新选举的时候用于处理选举相关的线程,核心类在于FastLeaderElection,该类内部包含WorkerReceiverWorkerSender两个核心线程,负责发送和接收选举报文。 

    FastLeaderElection本身其实就在一个单独的线程,也就是后面说的quorumPeer线程中运行的,本身内部具备一个while循环再处理选举相关的逻辑,所以可以认为FastLeaderElection也是一个线程。

选举相关线程


quorumPeer的选举线程


FastLeaderElection


Client连接相关线程

    client连接相关线程顾名思义,就是zookeeper在处理client连接过程中相关的线程,其实zookeeper在实现的server的多线程模型其实就是Nio模型中提到的相关模型,有兴趣可以阅读《netty概念小结》。

    该实现的核心类主要是NIOServerCnxnFactory,该类内部包含expirerThread、acceptThread、selectorThreads,这里我只关注后面两者,其中acceptThread主要负责处理client的连接,selectorThreads主要负责处理每个client具体的数据读写,也就是说我们把accept和io处理进行了分离。


accept线程


selector线程


Peer连接相关线程

    peer之间的连接主要是zookeeper集群间通信的连接,一般是指follower或learner连接server的过程。当我们的一个zookeeper节点作为leader的时候我们会启动一个accept线程LearnerCnxAcceptor用于接受peer的连接,作为server端我们会为每个peer发送过来的连接建立一个线程进行处理,针对每个连接新建线程的核心类是LearnerHandler。

    这部分的accept线程LearnerCnxAcceptor和处理线程LearnerHandler主要用于zookeeper的节点之间的通信,跟client无关,跟client无关,跟client无关

LearnerCnxAcceptor
LearnerHandler



Peer调用链线程


leader调用链


follower调用链

PrepRequestProcessor 

    PrepRequestProcessor线程。该线程消费请求队列submittedRequests,开始实施一致性算法。submittedRequests有两个来源,一是接入的客户端直接提交,提交的请求既包括写请求,也包括一些查询请求;另一个是由Follower转发,转发内容只包括写请求和同步请求。PrepRequestProcessor收到submittedRequest后,将请求转发给CommitProcessor线程和SyncRequestProcessor线程的输入队列;对于其中的写请求,向所有follower发送PROPOSAL消息(异步发送)。

PrepRequestProcessor


CommitProcessor

    该线程主要消费两个队列queuedRequests和committedRequests。queuedRequests保存PrepRequestProcessor线程下发的submittedRequest消息。committedRequests保存Proposal通过后,LearnerHanlder线程(后文会有说明)发来的提交请求。

    CommitProcessor在这里做了如下处理:对于queuedRequests中客户端的查询request,直接返回本地数据;对于客户端提交的或follower转发来的写请求,作为一个pendingRequest等待相应的表决结果返回committedRequest到committedRequests队列。对于队列中到来的每一个committedRequest,如果当前有pendingRequest等待,并且其sessionId,zxid和这个请求匹配,则处理pendingRequest(如果原始请求发自客户端,pendingRequest会携带客户端连接对象,从而能够发送响应给客户端),否则直接处理committedRequest(这种情况对应Follower中的CommitProcessor直接接收到了commit消息)。处理的过程是记录committedLog,变更本地数据。如果请求从客户端来,发送响应给客户端。那么如果一个pendingRequest始终等不到对应的committedRequest到来呢?答案是会一直等待,从而会阻止之后所有queuedRequest请求的处理!开始看到这里以为是个bug,后来想想,如果发生这种情况,已经说明Zookeeper的voter节点超过半数Fault了(不管是消息丢失还是宕机)。这时整个Zookeeper服务只能是不可用了。否则只要过半的voter节点可用,一定会有相应的committedRequest返回。同时这里也保证了写请求按到达顺序生效。

CommitProcessor


SyncRequestProcessor

    该线程负责将submittedRequest记录到Log。ZooKeeper使用一个简单的内存数据库ZKDatabase来处理日志、session信息和datatree(znode树,类似文件系统结构,用来组织存放实际数据。与文件系统不同的是目录也可以有数据)日志采用1000条批量flush到日志文件,满一定条数起单独线程生成snap文件。记录完日志后直接发送ACK消息给Leader对象—作为一个投票者投出自己的一票。

SyncRequestProcessor


FollowerRequestProcessor

    该线程主要是负责follower接收client连接后的报文处理链条,follower接收到client的报文后提交到queuedRequests队列,由FollowerRequestProcessor进行处理并提交到CommitProcessor进行处理。

FollowerRequestProcessor


quorumPeer线程

    quorumPeer的在zookeeper集群模式下每个节点本身就是一个quorumPeer服务,内部启用线程来处理发生重新选举的场景,也就是说白了就是每个zk节点就是quorumPeer节点。

QuorumPeer线程用于选举


参考文章

    ZooKeeper 核心模块代码浅析

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 无论怎样,先开始吧,道路艰难也先走着再说,每天先写起来吧!
    雏菊小珍阅读 195评论 0 0
  • 又一个寒冷的冬天来到了,凛冽的寒风让人们缩紧了脖子,匆匆向家赶去,跑进有暖气的房子再也不想出来,看着一片片落叶在寒...
    梅花映雪阅读 2,188评论 10 24
  • 刚刚,马化腾超越马云成中国首富! 据福布斯实时富豪排行榜,马化腾的个人财富361亿美元,超过了马云的356亿美元。...
    中恩国际连金锋阅读 111评论 0 0
  • 临摹画 第一步画线稿我就戳了一个小时才接近原画 更种改 听大家推荐刚入手一套红辉48色,临摹的时候老感觉和原图颜色...
    小猪熊y阅读 356评论 8 7
  • 七月初七。特别喜欢这个节日。总觉着,我们中国的七夕,更诗意更浪漫,远胜西方的“214”。 今天这个...
    侯玲玉阅读 1,044评论 4 6