首页 > 编程语言 >raft算法和etcd代码解析-3.网络分区问题及其它

raft算法和etcd代码解析-3.网络分区问题及其它

时间:2024-03-24 13:12:45浏览次数:19  
标签:请求 node05 分区 任期 节点 etcd raft 日志 leader

网络分区问题

网络分区导致选举永远无法达成共识,选举不断超时,任期号将不断增加
为避免这个问题,candidate会探测网络环境以免发起无意义的竞选

集群变更

leader收到配置变更要求,会广播配置变更日志,日志包括新结点和老节点,在收到老节点的多数派认可后,leader后提交该请求
在处理配置变更时同时处理写请求和竞选时,不考虑新节点的响应,只需要老节点的多数派赞同

其他问题

竞选中为什么只有一个leader?
每个follower只有一票,leader需要超过半数选票,如果没有共识,则任期被跳过

怎么保证人任期号和索引号只对应一笔预写日志?
日志值追加,不存在更新,覆盖,删除操作。同时,在同步日志时发现前一笔不相同,不同的日志会被清除

如果多数选票总是不超过半数怎么办?
一种情况,集群中只有两个节点,将永远不会达成多数公式,为此,raft保证发起竞选总是不同时的,这种情况就不会出现两个candidate,而是先发起竞选的candidate得到选票

怎么保证新的leader能拥有下线的leader的日志?
在选举时,拥有最新日志索引号的得到多数票数,因此可以保证这一点

怎么保证日志同步的幂等性
防止重复和乱序问题:同步日志时会校验上一笔日志
防止缺失问题:follower确认收到日志会发出ack响应,如果leader未收到ack响应为持续发送日志

怎么保证客户端发送的请求不丢失不重复
防止丢失问题:客户端发送请求后需要收到ack响应
防止重复问题:每一个请求都有唯一的序列号,序列号相等的请求不执行

最后一个问题

考虑这种情况
集群中有5个节点,需要3个节点可以达成共识

  1. T1任期,leader节点node01将日志发给node02后就下线了
  2. node05发现leader无响应,发起竞选并且成为新的leader(注意此时假设只有node02不给node05投票,因为node02拥有更新的日志),进入T2任期,node05当选后接收到了写请求,但是马上下线了
  3. node01又上线了,成为leader进入T3任期,此时node01继续未完成的同步动作,该日志变成已提交,后又下线
  4. node05成为新leader,进入T4任期,node05的继续将写请求同步,那么此时之前node01的数据就变成需要清除的日志了,于是违反了提交日志不能被清除的原则。
    上面这种情况,node01和node05交替重复着成为leader并下线的行为

怎么规避这个问题?
第三步时T3任期,leader不应该直接提交之前T1的日志
raft规定新上任的leader需要完成现在任期的写请求后之后才能提交
在这个例子中,leader在提交之前T1的日志前需要完成T3任期的写请求
如果有了这个限制,之后node05就不会成为新的leader,应为它的日志将不会是最新的

标签:请求,node05,分区,任期,节点,etcd,raft,日志,leader
From: https://www.cnblogs.com/ling-2945/p/18092293

相关文章

  • 虚拟机 Centos 7 磁盘空间不足扩容 (默认分区-vgdisplay无回显)
    前提centos7系统新建系统时选择的默认分区vgs等查看卷组命令无回显根目录磁盘空间不足大致流程及注意事项处理方法:删除再重建不会导致其中的数据丢失防止出现意外,请备份或者快照1.率先在VMware中对虚拟机进行磁盘容量扩容此处进行20g-->40g的扩容2.再在虚拟机......
  • 【RedHat9.0】磁盘fdisk命令分区的增、删、改、查
    使用fdisk进入交互模式,通过输入fdisk程序所提供的子命令可以对磁盘的分区进行有效管理。根分区、swap分区、引导分区的详细教程在这个博客的基础上我们详细介绍fdisk命令。fdisk命令分区的增、删、改、查(一)fdisk交互子命令介绍(二)fdisk增命令1、输入n新增MBR磁盘分区......
  • 1、postgres通过partition做表分区
    目录postgres通过partition做范围表分区1、安装pg_partman扩展2、创建需要分区表,按学生的入学时间分区3、创建分区4、插入数据5、查询分区表6、不需要子分区时7、直接插入子分区表时。8、navicat可以查看到分区的表与分区的维度postgres通过partition做范围表分区表分区是将一个......
  • <sa8650>sa8650 partition-之-新增分区加img
    <sa8650>sa8650partition-之-新增分区加img一、前言二、新增分区2.1新增用户分区2.2生成新分区文件2.3确认新分区文件2.4rawprogram文件参数解析2.5新增分区验证三、镜像文件3.1新增water.img编译脚本3.2新增water.img编译脚本运行3.3新增water......
  • 适用于 Windows 2024 的 7 个最佳免费分区恢复软件分享
    无法确定2024年Windows上最好的免费分区恢复软件是什么?那么,我们可以提供帮助!我们测试了目前市场上可用的几种硬盘分区恢复软件-包括免费和付费版本。您现在所需要的只是-只需浏览列表并选择适合您要求的一项即可。继续阅读!错误地按错按钮或面临断电可能会导致一些严重......
  • kafka-按键分区
    配置#自定义分区#partitioner:#class:com.dfree.data.config.PartitionerByKey代码//publicclassPartitionerByKeyimplementsPartitioner{//@Override//publicintpartition(Stringtopic,Objectkey,byte[]keyBytes,Objectvalu......
  • liunx磁盘分区扩容实操
    一、现状,假设虚拟机其中有一个磁盘分区使用率已经达到96%,根据需求在不影响这个磁盘分区的资料进行扩容。1、查看磁盘sdb1起始柱面,sdb1分区Start开始___2048  end结束___10485759 记录好Start初始值fdisk-l2、先在虚拟机上扩容,从5G扩容到10G 3、在liunx卸载这个......
  • 07 - Debian如何分区、格式化与挂载磁盘
    作者:网络傅老师特别提示:未经作者允许,不得转载任何内容。违者必究!Debian如何分区、格式化与挂载磁盘《傅老师Debian小知识库系列之07》——原创==前言==傅老师Debian小知识库特点:1、最小化拆解Debian实用技能;2、所有操作在VM虚拟机实测完成;3、致力于最终形成Debian小......
  • raft算法和etcd代码解析-1.raft基本概念
    笔记导言该系列笔记用于GO语言和RAFT算法学习前部分介绍raft算法后部分介绍etcd代码etcd源码来自github,版本主要为ectd-3.1.5本文主要根据视频:<<raft算法工程案例之etcd源码导读>><<解析分布式共识算法之Raft算法>>以上视频作者主页:https://space.bilibili.com/317473362......
  • 常用命令-swap分区三剑客--swapon-swapoff-mkswap
    常用命令-swap分区三剑客--swapon-swapoff-mkswapswaponswapon命令用于激活Linux系统中交换空间,Linux系统的内存管理必须使用交换区来建立虚拟内存。语法swapon(选项)(参数)选项-a:将/etc/fstab文件中所有设置为swap的设备,启动为交换区;-h:显示帮助;-p<优先顺序>:指定交换区的......