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

角色、人气及角色转变

Leader选举

  1. 我要选举

    当follower没有接收到leader的心跳,则认为leader挂了。此时先使其本地term加1.然后完成下面步骤:

    • 此时若接收到其他candidate 的投票请求,就投票给这个candidate
    • 由follower转变为candidate
    • 若之前未投票,就投自己一票
    • 向其他节点发出投票请求,然后等待响应。
  2. 我要投票

    follower 在接收到投票请求后,根据以下情况判断是否投票:

    • 发来投票请求的candidate的term不能小于我的term
    • 在我当前term内,我的选票还没有投出去
    • 若接收到多个candidate的请求,采取first-come-first-served方式投票
  3. 等待响应

    当一个candidate 发出投票后,会等待其他节点的响应结果,这个结果有三种情况:

    • 收到过半选票,成为新的leader,然后通知其他节点。
    • 接收到别的candidate 发来的新leader通知,比较新leader的term 不比自己的term小,将自己变未follower
    • 经过一段时间后,没有收到过半选票,也没有收到新leader通知,则重新开始选举。
  4. 选举时机

    很多时候,当Leader真的挂了,Follower几乎同时感知到,然后几乎同时变为candidate发起选举。此时会出现较多candidate 票数相同情况,就无法选举出Leader。

    为了防止这种情况,Raft算法采用randomized election timeouts 策略解决这个问题。其会为这些Follower随机分配一个选举发起时间 election timeout,这个timeout 在150-300ms范围内。只有到达election timeout 时间的Follower 才能转变为candidate,否则等待。那么 election timeout 较小的Follower 则会转变为candidate 然后发起选举,一般情况下,先获取到过半选票的节点成为新的leader。

数据同步

在Leader 选举出来的情况下,通过日志复制实现集群中各节点数据的同步。

  • 状态机

    Raft算法一致性是基于日志复制状态机来实现的。状态机最大的特征是:不同Server中的状态机若当前状态相同,然后接收了相同的输入,那么输出必然相同。

  • 处理流程

当leader接收到client的写请求后,会经历以下流程:

  • leader会将数据与term封装为一个box,并随着下一次心跳发送给所有followers,征求大家对该box的意见。同时将本地数据封装为日志。

  • follower 接收到来自leader的box后 先比较该box的term比自己的小就接受该box,并向leader回复同意。同时将该box中的数据封装为日志。

  • 当leader接收到过半同意响应后,将日志commit到本地的状态机,状态机输出一个结果,同时日志状态变为了committed

  • 同时leader会通知所有follower 将日志commit到本地的状态机,日志状态变为了committed

  • 在commit 通知发出同时,leader 也会向client发出成功处理的响应。

  • AP支持

    为保证可用性。各个节点中的日志可以不完全相同,但leader会不断给follower发送box,以使各个节点的log达到最终相同。即Raft算法不是强一致性,而是最终一致性。

    脑裂

    在多机房部署中,由于网络问题,很容易形成多个分区,而多分区很容易产生脑裂,从而导致数据不一致。

    以三机房部署为例,可以分为五种情况:

    1. 不确定

B感知不到Leader,所以会发起选举,但是C能感知到Leader,但是由于其接收到了更大term的投票请求,所以C也放弃了A中的Leader,参与了新的选举。

若leader出现在B机房,A是感知不到新Leader的诞生,其不会自动下课,就会形成脑裂。由于A中的Leader处理的写操作无法获取到过半响应,所以无法完成写操作。

但B中的Leader的写操作处理可以获取到过半响应,所以能完成写操作,故A与B、C中出现脑裂,且形成了数据不一致。

若新Leader出现在C机房,A中的Leader会自动下课,所以不会形成脑裂。

  1. 形成脑裂

这种情况一定会形成脑裂

  1. 无脑裂

A、C正常服务,B无法选举出新的Leader。没有形成脑裂。

  1. 无脑裂

ABC均对外服务,无脑裂。

  1. 无脑裂

A无法处理写请求,但可以对外服务。

BC失去了Leader,都会发起选举,但是都无法获取过半支持,都无法选出新Leader。

Leader宕机处理

请求到达前Leader挂了

client发送写请求到Leader之前Leader挂了,因为请求没到达集群,所以对集群数据的一致性没影响。

Leader挂了之后会选举产生新的Leader。

由于Stale Leader 未向client发送响应,所以client会重新发送写请求。

未开始同步数据前Leader挂了

client发送写请求给Leader,请求到达Leader后,Leader还没开始向Followers发送数据就挂了,这时选举产生新Leader。Stale Leader重启作为Follower重新加入集群,并同步新Leader 中的数据以保证数据一致性。

由于stale Leader 未发送响应,所以client会重新发送写请求。

同步完部分后Leader挂了

http://www.jsqmd.com/news/1088263/

相关文章:

  • RA8D2接口时序参数手册解读:从SPI、OSPI到I3C的实战配置指南
  • 跨平台GUI自动化测试:基于元数据驱动的实践与架构设计
  • 问答口碑GEO优化支持代理合作吗
  • [智能体-568]:Win10 22H2 WSL2 官方在线安装全过程(含国内网络超时完整修复)
  • 动态ISAC系统中的多普勒鲁棒涡旋波前设计技术
  • 基于RPA与pytest的Ironic裸金属自动化测试实践
  • RoboBPP:机器人装箱物理仿真基准测试系统解析
  • Hint Learning与知识蒸馏本质区别:教模型‘看哪里’vs‘怎么想’
  • LinkedIn QARK:Android应用安全静态分析与CI/CD集成实战
  • 软考职称评定政策突变预警(2024.06修订版):学历年限、论文要求、项目佐证标准全部收紧,仅剩最后1次缓冲机会
  • AI管理者必懂的27个决策关键词:搜索算法如何驱动业务落地
  • 告别知识焦虑:如何用 dedao-dl 打造永不丢失的个人知识库
  • Codex EACCES 文件权限错误解决方案
  • 从RTL8153-VC-CG看USB3.0千兆网卡芯片:如何为超薄设备重塑有线连接
  • 域策略实战:解锁21H2环境下普通用户一键部署网络打印机的权限链
  • 如何在5分钟内解决Blender与虚幻引擎的3D资产互通难题?
  • 你真的会用Python轻松保存B站大会员4K和充电专属视频吗?
  • N-HiTS:面向工业落地的时间序列分层插值预测模型
  • SPI通信错误处理与中断机制详解:构建稳定嵌入式通信的避坑指南
  • 从零构建Frida自动化逆向工具链:解放双手,专注安全分析
  • 微信消息安全模式全解析:从AES加密到实战避坑指南
  • 从URDF到Gazebo:深度相机集成与可视化调试全流程
  • ADS1274设计实战:从引脚配置到系统级硬件规划
  • openYuanrong agent runtime部署实战:一步步搭建分布式AI Agent环境
  • Solidworks 2018 自定义全局坐标系:从默认Y轴到Z轴朝上的完整方案
  • Metabigor+Rustscan+Nmap组合拳:自动化情报驱动的高效端口扫描实战
  • Layer Zero:大模型架构中的隐式抽象与推理路径压缩
  • 瑞萨RA4E1 FSP示例项目包深度解析与实战上手指南
  • SQL注入攻防全解析:从原理到实战,构建Web应用安全防线
  • Selenium数据驱动测试实战:告别硬编码,用Excel+Pytest构建可维护UI自动化框架