立即前往

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 智算采购季 热销S6云服务器2核4G限时88元/年起,部分主机可加赠对象存储组合包!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 产品能力
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
    • 关系数据库SQL Server版
    • 企业主机安全
    • 云防火墙
    • CDN加速
    • 物理机
    • GPU云主机
    • 天翼云电脑(政企版)
    • 天翼云电脑(公众版)
    • 云主机备份
    • 弹性云主机
      搜索发现
      关系数据库SQL Server版企业主机安全云防火墙CDN加速物理机GPU云主机天翼云电脑(政企版)天翼云电脑(公众版)云主机备份弹性云主机
    • 文档
    • 控制中心
    • 备案
    • 管理中心
    • 登录
    • 免费注册

    Zookeeper-技术专区-运作流程分析介绍

    首页 知识中心 其他 文章详情页

    Zookeeper-技术专区-运作流程分析介绍

    2023-05-18 09:19:22 阅读次数:112

    Zookeeper

    Zookeeper的启动流程

    Zookeeper的主类是QuorumPeerMain,启动时读取zoo.cfg配置文件,如果没有配置server列表,则单机模式启动,否则按集群模式启动,这里只分析集群模式。

    根据配置初始化quorumPeer对象,并启动quorumPeer线程,这里主要做了几件事情:

    1.   读取保存在磁盘上的数据,包括db的snapshot和txnlog,zookeeper的存储结构另外专门讲述。
    2.   启动cnxnFactory,这里主要是启动一个server,用来接收来自client的请求,绑定在配置文件中的clientPort端口。
    3.   在QuorumAddress上绑定一个server,用来和其他zookeeper server做交互。
    4.   启动leader选举过程,因为server刚启动时是存在LOOKING状态,需要发一起一次选举过程来获取leader。
    5.   启动quorumPeer的主线程run,根据当前节点的状态来启动不同的流程。

    如果是Looking状态,则调用FastLeaderElection::lookForLeader来发起选举流程

    如果是OBSERVING状态,则开始Observer流程

    如果是FOLLOWING状态,则开始Follower流程

    如果是LEADING状态,则开始Leader流程

    Zookeeper的选举流程 

    发起选举流程有两种情况:

    1)server刚启动的时候,server的状态初始化为LOOKING状态

    2)server发生异常,切换到LOOKING状态

     server有4中状态:

    LOOKING:初始状态,表示在选举leader

    FOLLOWING:跟随leader的角色,参与投票

    LEADING:集群的leader

    OBSERVING:不参与投票,只是同步状态

      按刚启动来讲述选举流程,QuorumPeer::start() -> QuorumPeer::startLeaderElection() -> QuorumPeer::createElectionAlgorithm,默认使用FastLeaderElection算法,初始化的流程如下:

      初始化QuorumCnxManager,管理选举中和其他server的交互,选举时监听在专门的electionAddr上。

      QuorumCnxManager是实际发生网络交互的地方,它的主要数据结构包括:

    • queueSendMap:sid -> buffer queue,为每个参与投票的server都保留一个队列
    • recvQueue:message queue,所有收到的消息都放到recvQueue
    • listener:server主线程,收发消息时和上面两个队列交互

      QuorumCnxManager可以保证每对peer之间只有一个链接,如果有server发起新的链接,则比较sid,sid大的保留链接,小的放弃链接

     

    初始化FastLeaderElection,这是选举逻辑所在的地方,它主要包括3个线程:

    Messenger::WorkerReceiver:从QuorumCnxManager::recvQueue中获取网络包,并将其发到FastLeaderElection::recvqueue中。

    Messenger::WorkerSender:从FastLeaderElection::sendqueue中获取网络包,并将其放到QuorumCnxManager::queueSendMap中,并发送到网络上lookForLeader:QuorumPeer。

    主线程会调用lookForLeader函数,它从recvqueue中获取别人发给server的选举数据,并将发给其他server的投票放到sendqueue中。

     

    FastLeaderElection::lookForLeader中实现了选举算法,具体的流程如下:

      首先更新选举周期logicalclock,并把自己作为leader作为投票发给所有其他的server。

      然后进入本轮投票的循环。

    从recvqueue获取一个网络包,如果没有收到包则检查是否要重连和重发自己的投票。

      收到投票后判断投票的状态。

    LOOKING:

           如果对方投票的周期大于自己的周期,那就清空自己的已经收到的投票集合recvset,并将自己作为候选和对方投票的leader做比较,选出大的作为新的投票,然后再发送给所有人。

     

           这里比较大小是通过比较(zxid,sid)这个二元组来的,zxid大的就大,否则sid大的就大。

     

    • 如果对方的投票周期小于自己,则忽略对方的投票
    • 如果周期相等,则比较对方的投票和自己认为的候选,选出大的作为新的候选,然后再发送给所有人
    • 然后判断当前收到的投票是否可以得出谁是leader的结论,这里主要是通过判断当前的候选leader在收到的投票中是否占了多数
    • 如果候选leader在收到的投票中占了多数,则再等待finalizeWait时钟,看是否有人修改leader的候选,如果修改了则把投票放到recvqueue中再从新循环

     

    OBSERVING:

      如果对方是一个观察者,由于它没有投票权,则无视它

     

    FOLLOWING或LEADING:

    • 如果对方和自己再一个时钟周期,说明对方已经完成选举,如果对方说它是leader,那我们就把它作为leader,否则就要比较下对方选举的leader在自己这里是否占有多数,并且选举的leader确认了愿意当leader,如果都通过了,就把这个候选作为自己的leader
    • 如果对方和自己不再一个时钟周期,说明自己挂掉后又恢复起来,这个时候把别人的投票收集到一个单独的集合outofelection(从名字可以看出这个集合不是用在选举判断),如果对方的投票在outofelection中占有大多数,并且leader也确认了自己愿意做leader,这个时候更新自己的选举周期logicalclock,并修改自己的状态为FOLLOWING或LEADING
    Leader执行流程

    QuromPeer线程

    Leader选举完成之后,Peer确认了自己是Leader的身份,在QuromPeer的主线程中执行Leader的逻辑创建Leader对象,并创建Server绑定在QuorumAddress上,用于和其他Follower之间相互通信调用Leader::lead函数,执行Leader的真正的逻辑。

      调用ZooKeeperServer::loadData,从磁盘中恢复数据和session列表

      启用新的epoch,zookeeper中的zxid是64位,用于唯一标示一个操作,zxid的高32位是epoch,每次Leader切换加1,低32位为序列号,每次操作加1

      启动绑定在QuorumAddress上的Server,为每个Follower的连接建立一个LearnerHandler,用于和Follower做交互,这里的逻辑另外单独论述

      向所有的Follower发送一个NEWLEADER包,宣告自己额Leader身份,并在initLimit时间内等待大多数的Follower完成和Leader的同步,并发送ACK包,表示Follower已经和Leader完成同步并可以对外提供服务.

      这时Leader和Client之间的交互在cnxnFactory的Server中,Leader和Follower之间的交互在LearnerHandler所属的线程中。 

      然后调用Leader::lead函数的QuromPeer线程在每个tickTime中都会发送2个ping消息给其他的follower,follower在接收到ping消息后会回复一个ping消息,并附带上follower的session tracker里的所有session信息,leader收到follower的ping消息后,根据传回的session信息更新自己的session信息

    LearnerHandler线程

            LearnerHandler主要是处理Leader和Follower之间的交互,和每个Follower连接会维持一个长连接,并有一个单独的LearnerHandler线程和一个Follower进行交互当Follower和Leader建立连接后,会先发一个FOLLOWERINFO包,包含了follower的server id和最近的一个zxid,即peerLastZxid,根据peerLastZxid来判断如何与Follower进行同步。

    如果peerLastZxid大于leader的最新的zxid,则给follower发送trunc包,让follower删掉多出来的事务,一般来说这种情况比较少

    如果peerLastZxid小于leader的最新的zxid,则给follower发送diff包,让follower补齐和leader之间的差距

    同步时发送包的顺序如下:

     

    NEWLEADER(同步发送)

    DIFF(同步发送)

     

    以下包的发送在一个线程中异步发送

     

    循环发送写入磁盘的txn和commit包

    循环发送已经commit但还未写入磁盘的toBeApplied数组的txn和commit包

    循环发送已经提出proposal但还未commit的outstandingProposals数组中的txn,注意这里没有发送commit包

     

           为了和follower做快速的同步,leader会在内存中缓存一部分最近的事务,即minCommittedLog和maxCommittedLog之间的事务,如果peerLastZxid比minCommittedLog还小的话,leader就给follower发送一个snap包,把当前leader的镜像发给follower。

     

           同步等待第一个回复的ACK包,然后计算同步超时tickTime*syncLimit,同步的后续的ACK包在下面的循环中处理,循环处理和follower之间交互的包

    ACK包:调用leader.processAck方法,processAck函数的执行逻辑如下:

    1. 如果Ack包的zxid小于Leader的lastCommitted,则忽略
    2. 根据ack包的zxid,在outstandingProposals中找出对应的proposal
    3. 将ack包对应的follower的sid加入proposal的ackset,如果ackset中超过大多数,则表示这个proposal可以commit
    4. 从outstandingProposals中删除这个proposal,并把这个proposal加入到已经可以commit的toBeApplied数组中
    5. 向follower发送commit包,通知follower将proposal提交
    6. PING包:用于和follower同步session信息
    7. REQUEST包:follower转发过来的修改状态的请求,调用ZooKeeperServer::submitRequest方法,这个方法后面单独论述

     

    NIOServerCnxn::Factory线程

     

    • 该线程主要负责server和client的交互

     

    • 该server是基于select的,当有客户端连接server时,会调用doIO逻辑,把socket上的数据读取出来解析并处理(readPayload函数),并把需要写出的outgoingBuffers写入socket

     

    • 如果是刚连接上,则调用readConnectRequest,这里会调用submitRequest(cnxn,sessionId, OpCode.createSession, 0, to, null);实际是发起一个创建session的请求

     

    • 如果不是第一次连接,则调用readRequest函数,这里会从socket上读出Request数据,然后调用submitRequest

     

    • 我们可以看到来自client的请求和来自其他server的请求都会调用submitRequest函数,这个函数会调用server上的RequestProcessor链,server实现的是责任链模式,每个请求都会经过责任链里所有RequestProcessor的处理

     

              对于Leader来说,LeaderZooKeeperServer::setupRequestProcessors设置了Leader用到的责任链,按从前到后的顺序如下:

     

    Zookeeper-技术专区-运作流程分析介绍

     

    PrepRequestProcessor:创建和修改状态的Request关联的header和txn

     

    ProposalRequestProcessor:将写请求发送proposal到所有的follower

     

    SyncRequestProcessor:将发出去的proposal批量写入磁盘

     

    AckRequestProcessor:当proposal真正写入了磁盘后,向本机发送ack包

     

    CommitProcessor:匹配本地submitted的请求和收到的committed的请求

    ToBeAppliedRequestProcessor:把写入到磁盘的proposal从toBeApplied中删除

     

    finalProcessor:把commit的proposal写入到本机的内存状态中

     
    版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/alex4dream/2740587,作者:洛神灬殇,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

    上一篇:codeforces 344B - Simple Molecules

    下一篇:摆脱技术思维,转向产品思维——寻找“万能”IDC的苦恼

    相关文章

    2025-04-15 09:24:56

    深入Kafka:如何保证数据一致性与可靠性?

    幂等性是一个非常重要的概念,特别是在分布式系统中。简单来说,幂等性就是保证在消息重发时,消费者不会重复处理,即使在消费者收到重复消息时,重复处理也要保证最终结果的一致性。

    2025-04-15 09:24:56
    Kafka , Leader , Zookeeper , 控制器 , 消息
    2024-11-27 03:28:07

    Java后端分布式锁实现:Redisson与Zookeeper

    在分布式系统中,确保多个节点对共享资源的同步访问是一个挑战。分布式锁提供了一种解决方案,以保证在同一时间只有一个节点可以执行特定的操作。Redisson和Zookeeper是两种流行的实现分布式锁的技术。本文将探讨这两种技术的特点、实现方式以及在Java后端中的应用。

    2024-11-27 03:28:07
    Redisson , Zookeeper , 分布式
    2024-11-13 09:03:59

    使用Spring Boot和Zookeeper实现服务协调

    Zookeeper是一个分布式协调服务,主要用于分布式应用中的命名服务、配置管理、分布式锁和组服务。通过与Spring Boot集成,我们可以实现更强大的服务协调和管理功能。

    2024-11-13 09:03:59
    Boot , Zookeeper , 服务
    2024-11-05 09:03:26

    Exhibitor(zookeeper监控工具)

    Exhibitor(zookeeper监控工具)

    2024-11-05 09:03:26
    jar , Zookeeper
    2024-10-25 07:15:55

    Java服务端数据一致性:分布式锁的实现与应用

    在分布式系统中,数据一致性是一个核心问题。为了保证在多个节点上操作共享资源时的数据一致性,分布式锁是一个常用的解决方案。本文将探讨分布式锁的概念、实现方式以及在 Java 服务端的应用。

    2024-10-25 07:15:55
    Zookeeper , 一致性 , 分布式
    2024-10-25 07:15:44

    Java服务端分布式锁:Redis与Zookeeper的实现

    在分布式系统中,分布式锁是一种重要的同步机制,用于协调多个节点对共享资源的访问。Redis和Zookeeper是两种常用的分布式协调服务,它们都提供了实现分布式锁的功能。本文将探讨如何在Java服务端使用Redis和Zookeeper实现分布式锁。

    2024-10-25 07:15:44
    Redis , Zookeeper , 分布式
    2023-06-07 07:36:28

    Zookeeper 监听服务器节点动态上下线(代码复制即可用)

    Zookeeper 监听服务器节点动态上下线(代码复制即可用)

    2023-06-07 07:36:28
    Zookeeper , 服务器
    2023-05-19 02:19:52

    Zookeeper(4) - 会话管理和事务处理

    本章围绕两个主题展开,会话管理和事务的处理(数据处理)流程,目的是了解下zk的CS模式是如何运转的。一、服务端启动详细的启动过程,那么服务端启

    2023-05-19 02:19:52
    Zookeeper , 事务
    2023-05-18 09:34:43

    Zookeeper 安装配置

    1. 解压  2. 复制配置文件3. 新建zookeeper数据存储目录4. 集群编号5.运行zookeeper图形化客户端6. 配置zookeeper启动全局变量

    2023-05-18 09:34:43
    Zookeeper
    查看更多
    推荐标签

    作者介绍

    天翼云小翼
    天翼云用户

    文章

    32777

    阅读量

    4838730

    查看更多

    最新文章

    Zookeeper(4) - 会话管理和事务处理

    2023-05-19 02:19:52

    查看更多

    热门文章

    Zookeeper(4) - 会话管理和事务处理

    2023-05-19 02:19:52

    查看更多

    热门标签

    linux java python javascript 数组 前端 docker Linux vue 函数 shell git 容器 spring 节点
    查看更多

    相关产品

    弹性云主机

    随时自助获取、弹性伸缩的云服务器资源

    天翼云电脑(公众版)

    便捷、安全、高效的云电脑服务

    对象存储

    高品质、低成本的云上存储服务

    云硬盘

    为云上计算资源提供持久性块存储

    查看更多

    随机文章

    Zookeeper(4) - 会话管理和事务处理

    • 7*24小时售后
    • 无忧退款
    • 免费备案
    • 专家服务
    售前咨询热线
    400-810-9889转1
    关注天翼云
    • 权益商城
    • 天翼云APP
    • 天翼云微信公众号
    服务与支持
    • 备案中心
    • 售前咨询
    • 智能客服
    • 自助服务
    • 工单管理
    • 客户公告
    • 涉诈举报
    账户管理
    • 管理中心
    • 订单管理
    • 余额管理
    • 发票管理
    • 充值汇款
    • 续费管理
    快速入口
    • 权益商城
    • 文档中心
    • 最新活动
    • 免费试用
    • 信任中心
    • 天翼云学堂
    云网生态
    • 甄选商城
    • 渠道合作
    • 云市场合作
    了解天翼云
    • 关于天翼云
    • 天翼云APP
    • 服务案例
    • 新闻资讯
    • 联系我们
    热门产品
    • 云电脑
    • 弹性云主机
    • 云电脑政企版
    • 天翼云手机
    • 云数据库
    • 对象存储
    • 云硬盘
    • Web应用防火墙
    • 服务器安全卫士
    • CDN加速
    热门推荐
    • 云服务备份
    • 边缘安全加速平台
    • 全站加速
    • 安全加速
    • 云服务器
    • 云主机
    • 智能边缘云
    • 应用编排服务
    • 微服务引擎
    • 共享流量包
    更多推荐
    • web应用防火墙
    • 密钥管理
    • 等保咨询
    • 安全专区
    • 应用运维管理
    • 云日志服务
    • 文档数据库服务
    • 云搜索服务
    • 数据湖探索
    • 数据仓库服务
    友情链接
    • 中国电信集团
    • 189邮箱
    • 天翼企业云盘
    • 天翼云盘
    ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
    公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
    • 用户协议
    • 隐私政策
    • 个人信息保护
    • 法律声明
    备案 京公网安备11010802043424号 京ICP备 2021034386号