热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Raft一致性协议简说

数据一致性是在一个需要容错的分布式系统中提出的概念。这里的一致性我们要特别搞清楚,主要有以下两层含义:Raft系统中所有节点的数据状态最终一致Raft系统中大部分节点的日志状态实时

数据一致性是在一个需要容错的分布式系统中提出的概念。这里的一致性我们要特别搞清楚,主要有以下两层含义:



  • Raft系统中所有节点的数据状态最终一致

  • Raft系统中大部分节点的日志状态实时一致

一直以来一致性算法都是一个高深莫测的领域,特别是一致性算法的鼻祖Paxos,以复杂难懂而著称! 然而在耐心研读了raft的Paper 14以后,发现这一领域也并不是那么神秘。首先我想说raft的Paper质量非常好好!它不仅阐述了复杂的一致性算法,而且展示了一种解释复杂问题的方法。它深刻吸取Paxo抽象难懂的教训,在Paper中特别强调了Understandable! 嗯,Understandable, 作者是认真的。 为了证实Raft更容易理解和掌握,作者专门组织了一帮大学学生,分为两组,分别学习Raft和Paxos, 然后对学员的掌握情况进行测试,测试结果也以论文形式发出。真是下了不少功夫啊!

这里简单梳理一下Raft Paper中的框架内容,若要全面了解raft协议,强烈建议读原Paper.


一、Raft协议中规定了两种存储



  1. Log
    为保证读写效率,raft采用了先写日志的原则。一个日志条目包含了对状态机中数据的操作。日志的写入是顺序的,效率较高。 Raft的Leader收到一个操作请求,首先将其append到自己的日志,然后将其广播到集群,大多数节点收到这个日志并Append, 这个日志就是确定可以Commit了。 Leader将这个日志操作在状态机中执行,这样就完成了。



  2. Replicated state machine
    复制状态机中保存的是实际的客户数据,数据的读取都需要从状态机中读。因此Leader在返回给Client成功时,数据一定要写入状态机,不然会造成Client读取不到最新数据。




二、Raft规定一个节点的三种角色



  1. Leader
    Leader是服务客户端的唯一server。 Leader要不断地向Follower发送心跳包还确保自己的Leader地位。



  2. Candidate
    Candidate是一个临时角色,一般来讲,任何一个节点都不会长时间处于这样一种角色。它是由Follower节点转换来的。即当一个Follower节点在一定时间(Election timeout)没有收到Leader的心跳包,这个Follower就会转换为Candidate,发起投票选举自己为Leader, 如果它能获取到多数投票,它就会成为下一个任期(term)的Leader. 若不能,则有两种情况: 继续投票或转换角色为Follower.



  3. Follower
    Follower角色接受Leader的日志复制,负责高可用。当Leader挂掉时,其中最先Election timeout 的follower会变为Candidate, 发起投票选举自己为leader. 这里的Election timeout是一个时间范围内的随机值(Raft Paper建议150ms - 300ms.),这样确保不会一直有两个Candidate同时选举。 在TiKV中Election timeout是10s(如果处于无主状态,大约经过 raft-base-tick-interval default 1s * raft-election-timeout-ticks default 10 时间以后发起选举)




三、Raft协议使用三种RPC来广播信息



  1. AppendEntries RPC
    Leader使用AppendEntries RPC来复制日志记录给其它Followers, 当然心跳包就是一个没有日志记录的 AppendEntries RPC。



  2. RequestVote RPC
    Candidate发送RequestVote RPC来发起选举。



  3. InstallSnapshot RPC
    当一个Follower角色落后Leader太多时,会使用InstallSnapshot RPC 来使其快速补充数据。任何一个节点都会做日志定期快照。可以参照Redis的Log Rewrite来理解这里的snapshot.




四、Raft协议四大主要活动



  1. Leader election
    集群中的Server从Follower角色开始,在经历Election Timeout周期没有收到Leader的心跳时,该Server会转换角色为Candidate, 将自己的任期加1, 投自己一票,并发送RequestVote RPC向集群中的其它Server发起投票。如果它能够获得大多数投票,它就会当选为Leader。当然这里面涉及到许多细节,这里不详细阐述。 Leader election活动在Raft系统中发生的并不频繁。

    raft-role.png710×439 70.1 KB

     



  2. Log replication/heartbeat
    Leader响应客户端请求,Client的每一个请求都是对状态机数据的修改。Leader收到请求后,首先将该命令Append到自己的日志中,然后发送AppendEntry RPC (Heartbeat也是AppendEntry RPC包,只是里面没有日志) 向集群中的其它节点广播这一操作,当大多数节点收到这一日志时,Leader就将该日志在状态机中应用(commit), 成功应用后才返回给Client成功。如果某个节点没有反馈成功收到这一日志,Leader会持续不断地向其广播,即使该日志已经成功Commit也不会停止,直到其收到为止。当然Raft采取了许多措施来保证日志的完整性和一致性。 Log Replication是Raft系统中最频繁的活动,它开始于Raft系统启动,终止与整个系统停止。



  3. Membership change
    理解Raft成员变更可以参考MySQL MGR中的View & ViewChanges 4. 当集群中某个节点宕机或者添加新的节点到集群时,会触发Membership change. Raft采用Joint Consensus机制来保证平滑过渡,并且不影响对Client请求的处理。这一活动在Raft系统中也不常见。



  4. Log compaction
    Log不能无限增长。Raft会定期对日志做快照(snapshot),这一操作与Redis中的Log Rewrite类似(如下图)。在实际的实现中,庞大的数据集可能会使日志占有巨大空间,即使经过压缩后,日志量还是很大,还应实现定时清理机制。TiKV中通过一些参数(如:raft-log-gc-size-limit)设定来控制Raft Log的残余量,超过这一设置会被清理以节省空间。

    log-compaction.png712×560 66.9 KB

     




五、总结

简单来看,上述几个部分包含了Raft协议的主要内容。希望对了解Raft概貌有些帮助。对细节的阐述往往使问题变得复杂,学习新鲜事物时,我们可以先从全局来看其全貌,将其拆解为几大模块,然后再分别详细研究各个模块的细节,等了解了细节,再从全局来看各各模块之间的关系,直到彻底了解整个系统。



推荐阅读
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
中国脐橙在线
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有