Leader直连

所有的客户端最终都只会链接到Leader。客户端开始时随机挑选一个节点,如果这个节点不是Leader,就通过响应告诉客户端Leader的地址,然后客户端再去连Leader。

Follower转发

客户端可以链接任意节点,客户端的指令会被Follower转发到Leader来执行。

只读操作也必须经过majority确认

只读操作一般只需要读取当前节点的状态机就可以了。但是存在网络分区的情况会导致当前的节点数据严重落伍。被分区隔离开来的Leader和Follower全然不知整个集群已经经过了新一轮的选举,自己的数据已经严重落伍了。所以不论客户端连接的是Follower还是Leader,都不能直接读取状态机来处理只读操作。

Raft对只读操作的处理办法是

  1. 只读请求最终也必须依靠Leader来执行,如果是Follower接收请求的,那么必须转发
  2. 记录下当前日志的commitIndex => readIndex
  3. 执行读操作前要向集群广播一次心跳,并得到majority的反馈
  4. 等待状态机的applyIndex移动过readIndex
  5. 通过查询状态机来执行读操作并返回客户端最终结果。

在步骤1到步骤2之间,如果Leader刚刚当选,还必须等待no-op操作同步完成。

上面的步骤看起来很复杂,其中最重要的就是心跳广播,这是为了确认当前集群没有被网络分区。

只读操作没那么快

因为只读操作也要经过一次RPC,所以它并没有我们想想的那么快,它可能和写操作性能差不多。所以并不能通过扩展节点数量来得到整体集群读性能的提升,甚至不升反降。

折中的方案就是单独提供一个特殊的只读指令,在一致性要求不高的场合使用这个特殊指令。这样就可以通过扩展集群数量来提升读性能。但是在遇到网络分区时会导致数据陈旧的问题,要看业务场景是否可以容忍。

只读操作的进一步优化

标准的强一致只读操作是完全是在Leader端进行的。这里可以做一步改进让只读操作主要在Follower端进行。

  1. Follower接收到只读指令后,向leader索要当前的readIndex值。
  2. Follower端等待自身的状态机的applyIndex移动过readIndex。
  3. Follower端通过查询自身的状态机来执行读操作并返回客户端最终结果。

leader向follower返回readIndex也不是简单的直接返回,而是需要重复前面的标准步骤1~步骤3,来确认网络没有分区。这还是一次RPC操作,无法省略。但是毫无疑问,它分担了leader的压力,可以让leader有更多的资源来处理自身的读写操作。

只读操作的终极优化

前面提到的方法无法避免额外的RPC操作来确认网络没有被分区,所以性能没有非常明显的得到优化。 Raft的论文中提到了另一种可以大幅提升只读操作性能的优化方案,同时还告诫读者不到万不得已不要使用。

因为这个额外的RPC操作只是为了确认网络没有被分区,当前节点有无被孤立,新的leader是否有产生。而新leader的产生是需要经历一次完整的选举过程的,这个选举过程有一定的时间才能完成。所以这个分区的状态是可以被缓存一小段时间的。这段时间内不可能出现leader的变更。

leader收到majority的心跳响应后,在接下来的一小段时间里不必去广播心跳来确认分区情况,而可以直接查询当前节点的状态机返回客户端结果。

之所以作者不推荐折中方案是考虑到时钟漂移。比如一个定时任务在系统非常繁忙的时候是不能得到准时执行的,会产生偏差,偏差的时间取决于系统的繁忙程度、Full GC是否正在进行、虚拟机是否正在迁移等特殊情况。

关注公众号「码洞」,加入我们一起进阶Raft协议算法

Raft只读操作实现要点相关推荐

  1. 程序迭代时测试操作的要点(后端前端)

    今晚直播课内容简介,视频可点击链接免费听 <程序迭代时测试操作的要点(后端&前端)> ===== 1:迭代时后台涉及的操作有哪些?如何进行 a.更新war包:用于访问web\app ...

  2. 使用了未经检查或不安全的操作_木工镂铣刀具的使用操作安全要点

    铣削是最常用的木材切削加工方法之一.铣刀是刀齿分布在旋转表面上或端面上的多刃刀具,由于参加切削的齿数多.刀刃长,并能采用较高的切削速度,故生产率较高.其加工范围也很广泛,可以加工平面.沟槽.螺旋表面. ...

  3. 计算机考试操作题要点,江苏省计算机一级考试操作题注意要点

    一级考试题型 一.基础知识题(共50题) (一)是非题 (二)单项选择题 (三)填空题 二.编辑文稿操作 (一)Word文本编辑 1.设置字体格式:"格式"-"字体&qu ...

  4. 28377D中CPU2操作EMIF1要点

    默认情况下,EMIF1的写操作权限属于CPU1,如果想CPU2操作EMIF1,需要将权限交给CPU2: 1. EMIF1MSEL寄存器的KEY位域写0x93A5CE7:这是为了允许对MSEL_EMIF ...

  5. js控制input只读操作,jQuery控制input只读操作

    1.js为<input>设置readOnly属性 <textarea name="content" id="content" cols=&qu ...

  6. 如何让某些用户对Marketing Cloud的contact数据只能实施只读操作

    打开maintain business role这个应用: 创建一个新的business role,然后添加下列这几个catalogs: SAP_CEC_BC_MKT_ADM_PC Marketing ...

  7. css3 操作动画要点

    CSS3 有3种和动画相关的属性:transform, transition, animation. 不同点: 1.  触发条件不同.transition通常和hover等事件配合使用,由事件触发.a ...

  8. 分布式系统技术难题--异地多活

    什么是异地多活? 为了保证系统能够对机房级别的故障进行容错,不会使系统不可用,这就需要在机房级别对系统进行冗余处理.而这就需要在架构上进行良好的设计.来面对多机房场景下的技术挑战.事实上,异地多活最大 ...

  9. 码洞原创深度技术文章大全 —— 高端面试必备

    <快学 Go 语言>第 11 课 -- 协程 <快学 Go 语言>第 10 课 -- 错误与异常 <快学 Go 语言>第 9 课 -- 接口 <快学 Go 语 ...

最新文章

  1. pta 哈利·波特的考试
  2. 如何用zendstudio新建一个PHP工程
  3. 解决Clover在win 10下的兼容问题
  4. “我太喜欢你了”——友情的表达方式?
  5. P1739表达式括号匹配
  6. java考题_Java考题知识点
  7. Spring核心系列之Spring中的事务
  8. 好几天没写Blog了。
  9. SDK 操作 list-view control 实例 -- 遍历进程
  10. mybatis3 添加ehcache支持
  11. html支持的脚本语言,能不能让日志内容在支持html语言的同时支持一下脚本语言,拜托!拜托!...
  12. 动态引用外部的Javascript脚本文件
  13. jenkins配置节点为windows代理
  14. mysql 恢复同步_常见MySQL同步错误恢复方法
  15. 计算机硬件维修的步骤和方法,计算机硬件维护的具体方法
  16. 交大网络教育计算机自测选择题,交大网络计算机组成与系统结构单元自测题.doc...
  17. 《SRE:Google运维解密》读后有感
  18. linux hostid 12位,linux下修改hostid
  19. Halcon中关于角度计算和测量拟合的算子详解
  20. Python-数据处理

热门文章

  1. Makefile中关于shell 语句使用的注意事项
  2. 关于对锐捷光交换机的使用
  3. 非线性调频 matlab,非线性调频信号
  4. Xilinx® 7 series FPGAs CLBs专题介绍(一)
  5. EOJ Monthly 2018.11 D. 猜价格
  6. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法
  7. SpringBoot整合Freemarker+Mybatis
  8. 在maven中引用github上的资源
  9. jQuery 插件开发实例(二)
  10. Java中JDK,JRE和JVM之间的关系