之前的文章《五分钟了解一致性哈希算法》受到了不少朋友的喜欢,今天分享分布式一致性算法之 -- Raft算法,同样用分钟的方式,不过这次估计五分钟看不完!
没事多两站地铁而已,不过别入迷,坐过站了哦!😆😆
在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性。
比较常见的一致性算法包括Paxos算法,Raft算法,ZAB算法等
一般用做两种场景: 元数据管理:比如etcd,特点是数据规模小,主要保证数据一致性和集群的高可用(raft选主),所以一套raft集群就够了。 分布式数据库:这种会用partition group,每个group有一个raft集群,当数据变大的时候会做扩展。
🚩 Raft只是个共识算法来保证数据的一致性,与数据库、客户端、事务没有关系
Raft把算法流程分为三个子问题:领导选举(Leader election)、日志复制(Log replication)、安全性(Safety)。
Raft算法中在任意时刻最多只有一个Leader,正常工作期间只有Leader和Followers。
状态切换流程:
任期:可以理解为是节点担任Leader职务的时间期限。
Raft 将时间划分为一个一个的任期(term),每个任期由单调递增的数字(任期编号)标识,工作期可长可短也可能不存在
🚩 任期时间 = 选举时间 + 正常运行时间
Raft 中服务器节点之间通信通过两个 RPC 调用:
初始状态时,每个节点的角色都是 Follower(跟随者),Term任期编号为 1(假设任期编号从1开始)
不过这两种情况会触发选举:
既然有两种情况下会触发选举,一个是初次启动,一个是Leader故障未发送心跳给Follower,那么我们假设有五个节点,然后分别用图来看下是如何选举的!
🚩为了画图是不会显得很占空间,暂时用三个节点表示, 并且用 ‘...’表示剩余节点
初次启动时:
初次启动节点都是正常流程如下:
Leader故障时:
Node2此时是Leader 节点,结果故障了,剩下四个节点参与选举。
在一个任期(Term)内只可以投票给一个结点,得到超过半数的投票才可成为 Leader,从而保证了一个任期内只会有一个 Leader 产生。
概括成一句话就是:保证Leader上日志能完全相同地复制到多台Follower服务器上。
OK!我们看下是如何进行同步的
Raft算法中,每个节点维护着一份日志,其中包含了系统中所有状态变更的记录,每一次状态变更被称为一个日志条目。
我们先看日志结构和右侧说明:
图中每个节点存储自己的日志副本(log[]),每条日志记录包含:
了解完日志结构后,我们来看日志是如何发起同步的。
日志持久化存储的条件
Follower节点必须先将记录安全写到磁盘,才能向Leader节点返回写入成功响应。
如果一条日志记录被存储在超过半数的节点上,我们认为该记录已提交(committed)——这是 Raft 非常重要的特性!如果一条记录已提交,意味着状态机可以安全地执行该记录
流程如下图:
🚩 注:Leader 不必等待每个 Follower 做出响应,只需要超过半数的成功响应(确保日志记录已经存储在超过半数的节点上),一个很慢的节点不会使系统变慢,因为 Leader 不必等待
Raft 通过 AppendEntries RPC 消息来检测。
Raft算法的目的是保证所有节点的一致性,即一个日志条目在某个节点被提交,那么这个日志条目也必须在所有节点上被提交。
🚩 通过【一致性检查】就保证了日志一致性的这两点内容。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。