当前位置: 首页 > news >正文

【zookeeper 第七篇章】集群搭建 本文章不具体展示搭建过程 后期会单独出一篇文章编写集群搭建

一、概述

1、集群中的角色

  • Leader
    Zookeeper集群工作的核心,事务请求(写操作)唯一调度和处理者,保证集群事务处理的顺序性;集群内部各个服务的调度者。对于 create、setData、delete等有些操作的请求,则需要统一转发给Leader处理,Leader需要决定编号、执行操作,这个过程称为一个事务。

  • Follower
    处理客户端非事务(读操作)请求,转发事务请求给Leader, 参与Leader选取投票。

  • Observer
    观察者角色,观察zookeeper集群的最新状态变化并将状态同步过来,其对于非事务的请求可以进行独立处理,对于事务请求,则会转发给Leader服务器处理,不会参数任何形式的投票只提供服务,其实就是增加非事务的并发量。

2、集群为什么要搭建奇数个节点

  • 如果部署单个节点,当节点宕机时,集群就会失效,就会出现单点故障。
  • 如果部署两个节点,2的半数为1,半数以上最少为2,不允许有一台机器故障,不然投票机制不成立。
  • 如果部署三个节点,3的半数为1.5,半数以上最少为2,允许有一台机器故障,投票机制可以成立。
  • 如果部署四个节点,4的半数为2,半数以上最少为3,允许有一台机器机器故障,投票机制可以成立。
  • 如果部署五个节点,5的半数为2.5,半数以上最少为3,允许有两台机器故障,投票机制可以成立。
  • 所以部署zookeeper集群的时候一般部署的节点数量为2n+1台节点。

二、集群选取机制

1、节点状态

名称描述
Looking这个是在选举的过程中的状态,正在选举。
Leading领导者状态,说明当前节点角色已经是Leader。
Following跟随者状态,表示选举已经完成,当前角色已经是Following。
Oberver观察者状态,表示当前节点角色是observer。

2、事务ID

Zookeeper状态每次变化都接收一个ZXID(zookeeper事务id)形式的标记,由Leader统一分配,全局唯一,不断递增。

3、初始化选取过程

由三个节点举例:当第一个节点启动的时候,因为单节点无法进行选举,所以当第二个节点启动之后,两台机器之间可以互相通信了,开始选举过程:

  • 1、两个节点都当自己是 Leader 角色来投票,每次投票都包含服务器配置的 myid(下文中能找到myid)中的值和 ZXID。使用(myid, zxid) 表示,此时第一个节点为 (1, 0),第二个节点为 (2, 0),然后将自己的值发给其他节点。
  • 2、当其他服务收到投票后,先判断是否是本轮投票,投票的机器的状态是否为 Looking
  • 3、针对每次的投票,服务器都需要将自己的票数和其他服务器对比。先检查 ZXID,这个时候 ZXID 都为0,如果 ZXID 谁的大谁就是Leader,如果 ZXID 相同就对比 myid,第二个节点的 myid 为2,所以第二个节点就是Leader。
  • 4、每次投票之后,服务器会统计是否有过半的机器接收到相同的投票信息,如果已经过半,就确认第二个节点为 Leader。
  • 5、一旦确认了 Leader,每台服务器都会更新自己的状态。如果是 Follower 角色,就改变状态为 Following,如果是 Leader 角色,就改变状态为 Leading。当 第三个节点 进来的发现已经有了 Leader, 状态直接变成 Following

4、运行状态下选举

以下当第二个节点故障,第一个节点和第三个节点是良好的节点。

  • 1、当 Leader 挂掉之后,集群会拒绝所有的服务,余下非 Observer 服务器都会将自己的服务器的状态变更为 Looking。然后开始选举。
  • 2、每个节点会发出投票。运行期间,节点上的 ZXID 可能不同,假设:第一个节点的 ZXID 为100,第三个节点的 ZXID 为120,这个时候第一个节点和第三个节点都会投票自己,第一个节点为 (1, 100),第三个节点为 (3, 120),由于第三个节点的 ZXID 为120,直接选举为 Leader。
  • 3、其他步骤和初始化启动的时候一样。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于Springboot的个人博客系统
  • Stable-Diffusion1.5
  • GitHub Revert Merge Commit的现象观察和对PR的思考
  • 传输层_计算机网络
  • Spring源码-ClassPathXmlApplicationContext的refresh()都做了什么?
  • 无缝编码体验:在PyCharm中高效使用远程文件编辑功能
  • 竞赛报名管理系统asp.net+sqlserver
  • python链接harbor,查询项目,镜像,版本
  • 虚拟机如何使用pxe服务实现自动安装系统
  • 【深度学习实战(52)】混淆矩阵计算
  • HCIE-Datacom题库__填空题
  • 基于Orangepi全志H616学习Python3
  • ValueListenableBuilder 和 addListener 在 ChangeNotifier的区别
  • 基于LoRA和AdaLoRA微调Qwen1.5-0.5B-Chat
  • 每日一练 | Day 4
  • 【Leetcode】104. 二叉树的最大深度
  • Docker入门(二) - Dockerfile
  • fetch 从初识到应用
  • HTTP中GET与POST的区别 99%的错误认识
  • java8-模拟hadoop
  • JavaScript服务器推送技术之 WebSocket
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • laravel with 查询列表限制条数
  • leetcode讲解--894. All Possible Full Binary Trees
  • node 版本过低
  • Octave 入门
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SpringBoot 实战 (三) | 配置文件详解
  • vue-cli在webpack的配置文件探究
  • Yeoman_Bower_Grunt
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 批量截取pdf文件
  • 前端攻城师
  • 区块链共识机制优缺点对比都是什么
  • 入门级的git使用指北
  • 微信小程序实战练习(仿五洲到家微信版)
  • 小程序button引导用户授权
  • 在Mac OS X上安装 Ruby运行环境
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • !!java web学习笔记(一到五)
  • #APPINVENTOR学习记录
  • #if 1...#endif
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (TOJ2804)Even? Odd?
  • (八十八)VFL语言初步 - 实现布局
  • (苍穹外卖)day03菜品管理
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (回溯) LeetCode 77. 组合
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)