Raft协议:etcd如何实现高可用、数据强一致的?Leader 选举/日志复制/安全性

如何避免单点故障


在介绍 Raft 算法之前,我们首先了解下它的诞生背景,Raft 解决了分布式系统什么痛点呢?

首先我们回想下,早期我们使用的数据存储服务,它们往往是部署在单节点上的。但是单节点存在单点故障,一宕机就整个服务不可用,对业务影响非常大。

随后,为了解决单点问题,软件系统工程师引入了数据复制技术,实现多副本。通过数据复制方案,一方面我们可以提高服务可用性,避免单点故障。另一方面,多副本可以提升读吞吐量、甚至就近部署在业务所在的地理位置,降低访问延迟。 

多副本复制是如何实现的呢?


多副本常用的技术方案主要有主从复制和去中心化复制。主从复制,又分为全同步复制、异步复制、半同步复制,比如 MySQL/Redis 单机主备版就基于主从复制实现的。 

全同步复制是指主收到一个写请求后,必须等待全部从节点确认返回后,才能返回给客户端成功。因此如果一个从节点故障,整个系统就会不可用。这种方案为了保证多副本的一致性,而牺牲了可用性,一般使用不多。

异步复制是指主收到一个写请求后,可及时返回给 client,异步将请求转发给各个副本,若还未将请求转发到副本前就故障了,则可能导致数据丢失,但是可用性是最高的。

跟主从复制相反的就是去中心化复制,它是指在一个 n 副本节点集群中,任意节点都可接受写请求,但一个成功的写入需要 w 个节点确认,读取也必须查询至少 r 个节点。

你可以根据实际业务场景对数据一致性的敏感度,设置合适 w/r 参数。比如你希望每次写入后,任意 client 都能读取到新值,如果 n 是 3 个副本,你可以将 w 和 r 设置为 2,这样当你读两个节点时候,必有一个节点含有最近写入的新值,这种读我们称之为法定票数读(quorum read)。

AWS 的 Dynamo 系统就是基于去中心化的复制算法实现的。它的优点是节点角色都是平等的,降低运维复杂度,可用性更高。但是缺陷是去中心化复制,势必会导致各种写入冲突,业务需要关注冲突处理。

从以上分析中,为了解决单点故障,从而引入了多副本。但基于复制算法实现的数据库,为了保证服务可用性,大多数提供的是最终一致性,总而言之,不管是主从复制还是异步复制,都存在一定的缺陷。

如何解决以上复制算法的困境呢?


答案就是共识算法,它最早是基于复制状态机背景下提出来的。 下图是复制状态机的结构(引用自 Raft paper), 它由共识模块、日志模块、状态机组成。通过共识模块保证各个节点日志的一致性,然后各个节点基于同样的日志、顺序执行指令,最终各个复制状态机的结果实现一致。 

共识算法的祖师爷是 Paxos, 但是由于它过于复杂,难于理解,工程实践上也较难落地,导致在工程界落地较慢。standford 大学的 Diego 提出的 Raft 算法正是为了可理解性、易实现而诞生的,它通过问题分解,将复杂的共识问题拆分成三个子问题,分别是:

  • Leader 选举,Leader 故障后集群能快速选出新 Leader。
  • 日志复制, 集群只有 Leader 能写入日志, Leader 负责复制日志到 Follower 节点,并强制 Follower 节点与自己保持相同。
  • 安全性,一个任期内集群只能产生一个 Leader、已提交的日志条目在发生 Leader 选举时,一定会存在更高任期的新 Leader 日志中、各个节点的状态机应用的任意位置的日志条目内容应一样等。 

下面我以实际场景为案例,分别和你深入讨论这三个子问题,看看 Raft 是如何解决这三个问题,以及在 etcd 中的应用实现。

 

 

Leader 选举


当 etcd server 收到 client 发起的 put hello 写请求后,KV 模块会向 Raft 模块提交一个 put 提案,我们知道只有集群 Leader 才能处理写提案,如果此时集群中无 Leader, 整个请求就会超时。 

那么 Leader 是怎么诞生的呢?Leader crash 之后其他节点如何竞选呢?

首先在 Raft 协议中它定义了集群中的如下节点状态,任何时刻,每个节点肯定处于其中一个状态:

  • Follower,跟随者, 同步从 Leader 收到的日志,etcd 启动的时候默认为此状态
  • Candidate,竞选者,可以发起 Leader 选举
  • Leader,集群领导者, 唯一性,拥有同步日志的特权,需定时广播心跳给 Follower 节点,以维持领导者身份。 

上图是节点状态变化关系图,当 Follower 节点接收 Leader 节点心跳消息超时后,它会转变成 Candidate 节点,并可发起竞选 Leader 投票,若获得集群多数节点的支持后,它就可转变成 Leader 节点。

下面我以 Leader crash 场景为案例,给你详细介绍一下 etcd Leader 选举原理。

假设集群总共 3 个节点,A 节点为 Leader,B、C 节点为 Follower。

如上 Leader 选举图左边部分所示, 正常情况下,Leader 节点会按照心跳间隔时间,定时广播心跳消息(MsgHeartbeat 消息)给 Follower 节点,以维持 Leader 身份。 Follower 收到后回复心跳应答包消息(MsgHeartbeatResp 消息)给 Leader。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
云原生分布式存储基石:etcd深入解析是一本专门探讨etcd的书籍,对于想要深入了解etcd的人来说是一本非常重要和有价值的资料。 etcd是一个高可用、持久化的键值存储系统,它主要用于分布式系统中的数据共享和配置同步。云计算和容器技术的发展使得分布式系统的数量和复杂度越来越高,etcd作为一个高性能的一致性分布式存储系统,在这样的环境中扮演着非常重要的角色。 通过深入解析etcd,读者可以了解到etcd的基本原理、架构设计和实现细节。它涵盖了etcd的核心概念,包括分布式一致性算法、raft协议数据复制数据恢复等。此外,它还介绍了etcd在具体场景下的应用,比如服务发现、分布式配置管理等。 通过阅读《云原生分布式存储基石:etcd深入解析》,读者可以学习到以下内容: 1. etcd的特点和优势:了解etcd相对于其他分布式存储系统的优势,以及为什么它在云原生应用开发中被广泛采用。 2. etcd的架构和原理:深入了解etcd的工作原理,比如如何实现数据一致性、如何管理节点、如何处理故障等。 3. etcd的应用场景:了解etcd在实际场景中的应用,比如容器编排、微服务架构、分布式事务等。 4. etcd的最佳实践和性能优化:学习如何正确配置和使用etcd,在实际应用中获取最佳性能和稳定性。 《云原生分布式存储基石:etcd深入解析》对于开发人员、系统架构师和运维人员来说都是一本非常有价值的参考书。它提供了详细的技术细节和实践经验,帮助读者更好地理解和使用etcd,从而构建更大、高性能的分布式系统。为了获取该书的PDF版本,你可以尝试在相关的网站或者电子书店进行搜索和购买。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值