raft算法学习(一):角色概念以及选举过程

Raft算法是强领导模型,集群中只能有一个领导。
下面是raft的视频讲解:
raft

raft的三种角色及其概念

服务器节点状态一共有三种:领导者(Leader)、跟随着(Follower)、候选人(Candidate)
跟随者:接受和处理来自领导者的消息,当等待领导者心跳信息超时时,推荐自己当候选人
候选人:向其他节点发送请求投票的RPC消息,通知其他节点来投票,如果赢得了大多数选票,就晋升当领导者
领导者:处理写请求、管理日志复制、不断发送心跳信息,表示自己还活着,不要发起新的选举

选举领导者的过程

初始状态:所有节点都是跟随者
Raft算法特性时随机超时时间,每个节点等待领导者节点心跳信息的超时时间间隔是随机的。
集群中没有领导者时,等待超时时间最小的节点会因为没有等到领导者心跳信息,发生超时。
超时自荐
此时该节点就会增加自己的任期编号,并推举自己为候选人,先给自己投一张选票,然后向其他节点发送请求投票RPC消息,请它们选举自己为领导者。
选举投票
其他节点接受到候选人的RPC消息时,并且在编号为1的任期内,没有投过票,那么就把选票投给该候选人,然后增加自己的任期编号。

图1 初始状态
图2 超时自荐
图3 选举投票

新领导产生
候选人在选举超时时间内赢得了大多数的选票,那么它就会成为本届任期内新的领导者。

新领导威慑维权
领导者将周期性地发送心跳消息,通知其他服务器我是领导者,阻止跟随者发起新的选举,篡权。

图1 初始状态
图2 超时自荐

选举细节

1、节点间通讯方式

Raft里,服务器节点间沟通联络采用的是远程过程调用(RPC),在领导选举中,需要用到两类RPC:
1、请求投票(RequestVote)RPC,由候选人在选举期间发起,通知各个节点进行投票
2、日志复制(AppendEntries)RPC,由领导者发起,用来复制日志和提供心跳信息

2、关于任期的rules

Raft算法中的领导者是有任期的,每个任期由单调递增的数字(任期编号)标识。任期编号会随着选举的进行而变化。
Raft 算法中的任期不只是时间段,而且任期编号的大小,会影响领导者选举和请求的处理
1、跟随者在等待领导者心跳信息超时后,推举自己为候选人,会增加自己的任期号。(在推举自己的时候就会++了)
2、一个服务器节点若检测到自己任期编号比其他节点小,更新自己的编号到较大的编号值
3、若一个候选人或者领导者检测到自己任期编号比其他节点小,会将自己恢复成跟随着状态。所以,raft 不兼容作恶节点。 只要有一个作恶节点发送“任期编号更大“的心跳消息,立马就能让这个集群变成无 leader 的,进而无法工作
4、如果一个节点接收到一个包含较小的任期编号值的请求,那么它会直接拒绝这个请求。

3、关于选举的rules

1、领导者周期性向所有跟随者发送心跳信息(不包含日志复制RPC消息)
2、如果在指定时间内,跟随者没有结收到领导者的消息,那么就自荐,发起领导者选举
3、在一次选举中,赢得大多数选票的候选人,将晋升为领导者
4、一个任期内,领导者会一直是领导者,直到它自身出现宕机等问题。当然如果出现网络延迟,也会出现重新选举的情况‘
5、在一次选举中,每一个服务器节点最多会对一个任期编号投出一张选票,并且按照“先来先服务”的原则进行投票。
如下图:
在这里插入图片描述
6、日志完整性高的跟随者拒绝投票给日志完整性低的候选人,即如果日志不完整的请求当主节点,如果当前的节点日志比他完整,那么就会拒绝给他投票
在这里插入图片描述

4、随即超时解决选票瓜分现象

• 跟随者等待领导者心跳信息超时的时间间隔,是随机的
• 当没有候选人赢得过半票数,选举无效了,这时需要等待一个随机时间间隔,也就是说,等待选举超时的时间间隔,是随机的

关于raft的领导者选举限制和局限

1.读写请求和数据转发压力落在领导者节点,导致领导者压力。
2.大规模跟随者的集群,领导者需要承担大量元数据维护和心跳通知的成本。
3.领导者单点问题,故障后直到新领导者选举出来期间集群不可用。
4.随着候选人规模增长,收集半数以上投票的成本更大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git日常使用教程

目录git日常使用git 基础用法(本地)git branchgit checkoutgit mergegit rebaseHEAD ,在提交树上移动相对引用强制修改分支位置撤销变更整理提交记录提交技巧Git TagsGit Describegit 基础用法(远程)git fetchgit pullgit push偏离的提交历史,十分重要!&…

android一键分享功能不使用任何第三方sdk

在android中有自带的一键分享功能,不过它会把所有带分享的应用都找出来,如果我们只需要一些常见的分享应用,该如何做呢? 下面看我的效果图(横屏和竖屏自动适配): 接下来看我的调用(支…

CMake学习使用(基于vscode)

目录语法一些重要指令CMake常用变量CMake编译工程编译流程两种构建方式实例展示参考: 基于VSCode和CMake实现C/C开发 | Linux篇 语法 基本语法格式:指令(arg1 arg2 …) 参数使用括弧括起来参数之间使用空格或者分号分开 指令是大小写无关的&#xff0…

DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录

相关学习资料 http://baike.baidu.com/link?url77B3BYIuVsB3MpK1nOQXI-JbS-AP5MvREzSnnedU7F9_G8l_Kvbkt_O2gKqFw7vm http://www.rfc-editor.org/rfc/rfc1035.txt http://www.rfc-editor.org/rfc/rfc3596.txt http://www.rfc-editor.org/rfc/rfc2782.txt http://www.rfc-edito…

【blade利刃出鞘】一起进入移动端webapp开发吧

前言 在移动浪潮袭来的时候,小钗有幸进入框架组做webapp框架开发,过程中遇到了移动端的各种坑,也产生了各种激情,就我们公司的发展历程来说 第一阶段:使用传统方式开发移动站点,少量引入HTML5元素 第二阶段…

Android静态图片人脸识别的完整demo(附完整源码)

Demo功能&#xff1a;利用android自带的人脸识别进行识别&#xff0c;标记出眼睛和人脸位置。点击按键后进行人脸识别&#xff0c;完毕后显示到imageview上。 第一部分&#xff1a;布局文件activity_main.xml [html] view plaincopyprint?<RelativeLayout xmlns:android&qu…

图论:最短路径搜索--Dijkstra算法(c代码实现)

最近因为辞职&#xff0c;有不少闲功夫&#xff0c;重温下数据结构&#xff0c;顺便练练手。今天说说最短路径搜索算法中的Dijkstra原理和实现。 一&#xff1a;简介 这个算法用于解决图中单源最短路径问题。所谓单源节点是指给定源节点&#xff0c;求图中其它节点到此源节点的…

C++多线程快速入门(五)简单线程池设计

目录设计思路主线程运行逻辑task以及taskpool设计详细流程讲解完整代码打印结果往期回顾设计思路 线程池实际上就是一组线程&#xff0c;当我们需要异步执行一些任务时&#xff0c;经常要通过OS频繁创建和销毁线程&#xff0c;不如直接创建一组在程序生命周期内不会退出的线程…

C++网络编程快速入门(一):TCP网络通信基本流程以及基础函数使用

目录流程概述服务器端代码实现客户端代码实现函数和结构讲解sockaddr_in和sockaddrsocket &#xff1a; 创建一个socket连接bind &#xff1a;绑定地址以及端口号问题流程概述 客户端与服务器之间的网络通信基本原理如下所示&#xff0c;复杂一点的架构可能会添加消息中间件。…

使用前端框架Foundation 4来帮助简化响应式设计开发

日期&#xff1a;2013-3-12 来源&#xff1a;GBin1.com Foundation是一套使用广泛的前端开发套件&#xff0c;可以帮助你快速的网站。最近ZURB发布了一个新版本的Foundation 4前端框架&#xff0c;能够有效的帮助你快速的开发响应式的网站。 和另外一个套知名的前端框架BootSt…

C++网络编程快速入门(二):Linux下使用select演示简单服务端程序

目录select参数解释select使用规范select使用缺点基本流程实例代码通信效果演示往期文章select参数解释 extern int select (int __nfds, fd_set *__restrict __readfds,fd_set *__restrict __writefds,fd_set *__restrict __exceptfds,struct timeval *__restrict __timeout)…

Android转载一:Android文件命名规范

REF&#xff1a;http://blog.csdn.net/gulianchao/article/details/23391651 (一) Layout命名 1&#xff0e;contentview命名&#xff1a;activity_功能模块.xml 例如&#xff1a;activity_main.xml、activity_more.xml 2&#xff0e;Dialog命名&#xff1a;dialog_描述.xml …

C++网络编程快速入门(三):阻塞与非阻塞式调用网络通信函数

目录阻塞与非阻塞定义send与recvconnect一些问题为什么要将监听socket设置为非阻塞阻塞与非阻塞定义 阻塞模式指的是当前某个函数执行效果未达预期&#xff0c;该函数会阻塞当前的执行线程&#xff0c;程序执行流在超时时间到达或者执行成功后恢复原有流程。非阻塞模式相反&am…

socket 端口和地址复用

https://blog.csdn.net/weibo1230123/article/details/79978745 https://blog.csdn.net/weixin_42157432/article/details/115560824 在linux socket网络编程中&#xff0c;大规模并发TCP或UDP连接时&#xff0c;经常会用到端口复用&#xff1a; int opt 1; if (setsockopt…

MyEclipse老是弹出problem occurred窗口

有的时候是因为jsp页面中的java脚本有误&#xff0c;比如说<% String name"";>就会出现错误&#xff0c;因为结束标签少了一个百分号&#xff05;。转载于:https://www.cnblogs.com/passer1991/archive/2013/03/15/2961624.html

Mysql中代替like模糊查询的一种方法

使用Mysql的函数instr,可代替传统的like方式查询,并且速度更快。 instr函数&#xff0c;第一个参数是字段&#xff0c;第二个参数是要查询的串&#xff0c;返回串的位置&#xff0c;第一个是1&#xff0c;如果没找到就是0. 例如&#xff1a; select username from prefix_user …

Linux网络故障排查命令(ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump)

目录ifconfig-s&#xff0c;显示网卡信息的精简列表-a、up、down将IP地址绑定到某个网卡&#xff0c;以及解绑操作pingtelnetnetstatlsofnc模拟一个服务器程序和客户端程序进行通信发送文件curltcpdump参数连接一个正常的监听端口ifconfig 该命令用来查看当前系统的网卡和IP地…

My Oracle Support Metalink站点最近将放弃flash界面转而使用ADF HTML

根据oracle官方博客的报道《The New My Oracle Support User Interface (HTML-based) 》&#xff0c; MY ORACLE SUPPORT开发team会在最近将support.oracle.com站点从原来的flash界面迁移到基于ADF HTML的用户界面上。 实际上在2012年的 January 27&#xff0c; MOS开发team就…

心跳检测以及应用层心跳包机制设计

博主联系方式&#xff1a; QQ:1540984562 微信&#xff1a;wxid_nz49532kbh9u22 QQ交流群&#xff1a;750313950&#xff08;嵌入式方向&#xff09; QQ交流群&#xff1a;856398158&#xff08;后端方向&#xff09; 目录心跳检测应用场景死连接情况保活传递有效业务数据心跳包…

一个DBA的工作写照

一个DBA的工作写照&#xff0c; 一个DBA的内心 Know the DBA Mind! DBA也是 IT民工啊&#xff0c; 民工何苦为难民工&#xff01; 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968227.html