rinetd 以太坊 方法 Redis map遍历 计算机网络 path seo vue异步加载组件 河南普通话 ab软启动器 xcode打包 maven配置eclipse python高级 java初级入门教程 莫愁脚本 内存修改器 unix操作系统下载 props 轮播图js代码 微信小程序提示框 maxtoc4d bbm注册 语音分析软件 jarsigner 批量插入数据 头条视频解析 服务器文件共享软件 编程电子书 android应用开发入门 脚本文件 mysql关联查询 什么是内存条 打开mysql python贪吃蛇 wps脚注 android模拟器下载 迅雷被封 视频采集软件 ps工具栏
当前位置: 首页 > 学习教程  > 编程语言

共识算法的实践基石:Raft(下)

2021/1/13 20:35:51 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

在上一篇 共识算法的实践基石:Raft(中)-- 利用模拟器进行实践 中,我们提到了 raft 先后提出的两种成员变更方案:联合共识、单节点变更。 虽然单节点变更是后提出的,并且一度可以替代联合共识。但是有意思的…

在上一篇 共识算法的实践基石:Raft(中)-- 利用模拟器进行实践 中,我们提到了 raft 先后提出的两种成员变更方案:联合共识、单节点变更。

虽然单节点变更是后提出的,并且一度可以替代联合共识。但是有意思的是,单节点变更爆出了Bug,然后又采用一种方案来修正Bug。更有意思的是,修正后的单节点变更,几乎就是联合共识。万转千回,所以我们还是来看原始的联合共识方案。关于单节点变更及Bug处理,可以参见 TiDB 在 Raft 成员变更上踩的坑。

理解联合共识之前,要注意以下几点,前面两篇文章已经提及:

  • 日志项的提交是二阶段,上一项日志提交是在收到下一个心跳或者 AE 请求时处理的。
  • 选举时候,只有候选人的日志序列 [最新] ,追随者才会投票。

成员变更的问题起点是:

变更过程中可能会产生两个领导者。

会造成两个领导者的原因在于:

节点上的配置会从旧配置转换为新配置。而从旧配置转到新配置的过程中,集群肯定被划分成了使用旧配置的集群、使用新配置的集群。那么就有可能在某个时间点,新旧集群分别出现了领导者,且两个领导者任期相同

raft 引入了一种特殊的日志:包含 Configuration 的日志项。 Cold 、Cold,new 、Cnew 分别对应旧配置的日志项、联合共识的新旧配置共存的日志项以及新配置的日志项。

那么联合共识的第一阶段,就是复制 Cold,new ;第二阶段,就是复制 Cnew ,使集群应用新配置。raft 支持在成员变更的同时,客户端写入数据。

接下来,我们再仔细看看联合共识二阶段细节。

如上图,在初始阶段,集群中只有ABC三个节点,C节点为领导者。

此时,开启成员变更,要新增 DE两个节点。那么C 收到变更配置后,生成 Cold,new 日志项并复制。假设此时只有 DE收到了请求:

  • 对于领导者来说,Cold,new 日志项还不能提交,因为 旧配置 中还没有复制到大多数节点(即AB)。所以领导者需要不断重试。
  • 假设领导者此时收到了客户端请求,则领导者必须保证该 AE 请求同时分别写入到了新旧集群的大多数,才算写入成功。
  • 假如此时领导者宕机,那么ABDE都有可能成为领导者。假如 AB 中的一个成为领导者,则本次成员变更失败,系统还是旧配置。如果 DE 成为领导者,则就相当于 先前的领导者 C 没有宕机。

那么,我们还是以 C 为领导者来看 Cold,new 的提交。当 Cold,new 日志项复制在新旧配置的大多数中都存在时,领导者就可以提交 Cold,new

  • 假如领导者在发出提交请求前崩溃。那么只有 ADE 中的一个可能当选。他们当选之后发现未提交的日志项,还是会进行复制,并走完提交过程。
  • 此时 ACD 都提交了 Cold,new ,假设领导者宕机,那么一样,只有 AD 能当选。当选之后再走提交过程。

当 Cold,new 提交后,领导者就可以复制 Cnew 日志项。最终 Cnew 配置会被全部节点应用。


上面是添加追随者的过程。除此之外,还会有一些情况:

  • 比如新节点上没有往期日志项,那么由于它会持续与领导者同步日志而无法提交最新日志。也就是这个节点在集群中,占用了一个投票名额,但是却无法提交新日志。
  • 比如是想换一批机器,包括替换掉领导者所在的机器。那么由领导者发起的成员变更执行后,领导者却要被排除在外。
  • 被替换的其他机器,由于收不到领导者心跳而发起领导者选举。

上述这些点,处理思路也比较简单,可以结合这三篇文章,去看看 raft 的小论文,加深印象。多读几遍,其义自见。

到这里,raft 算法我们就告一段落,下面接着来看看分布式系统的gossip等协议,然后就进入分布式系统中十分重要的一环:消息队列。在消息队列中,你会发现,前面学到的 innodb引擎原理、分布式协议原理,通过消息队列这个中间件,逐步融合在一起。


本文链接: http://www.dtmao.cc/news_show_600377.shtml

附件下载

上一篇:vim快速查找

下一篇:计网笔记

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?