eBay支付账务系统之从“容”不迫——一种简化的Raft集群扩容策略

文摘   2023-07-28 11:08   上海  


导  读


eBay支付账务系统FAS[1](Financial Accounting System)后台架构中,多个模块使用Raft共识算法[2],如负责账务数据写入的核心系统 - Processing Unit(《超越“双十一”—— ebay百万TPS支付账务系统的设计与实现》),和提供近实时账户余额查询的数据存储产品 - Goblin。


Raft集群的节点个数(即数据复制份数)与其容错能力息息相关。如何在不断流前提下,对Raft集群进行扩容以提高集群容错性及数据可靠性是eBay FAS Infra团队长期以来致力于解决的课题之一。


eBay FAS Infra团队将在本文中以Goblin集群为例,集中探讨不同扩容策略下集群的可用性、稳定性和脑裂问题,并最终提出一种简化的Raft集群扩容策略该策略在不影响集群的服务可用性前提下完成了Raft集群扩容,同时规避脑裂风险。最后,笔者归纳出在更一般化的扩容需求上,使用该策略进行操作时的通用步骤,以及集群中间状态的节点个数选取应当遵循的数学条件,从而同时保障可用性和规避脑裂风险。




1



背  景


Raft算法中多个节点管理一份复制的日志。该日志记录来自客户端的请求。图1展示了Goblin集群不同规模的构建情况。

图1:3节点和5节点Goblin集群结构及其quorum


正常状态下,其中一个节点承担leader角色,而其他节点则作为follower工作:请求发送到leader节点,然后leader将不断增长的日志复制给follower。如遇leader故障,follower将转变为candidate角色,启动新一轮leader选举。值得强调的是,日志复制和leader选举都依赖于集群中选举法定成员(quorum)的存活,否则无法成功执行。随着quorum的增加,集群对节点故障的容错能力也增强。例如,一个3节点的Raft集群(quorum=2)最多可以容忍1个节点故障,而一个5节点的Raft集群(quorum=3)可以容忍2个节点故障。扩容策略的主要目标是在确保可用性和安全性的同时,寻找可行的解决方案来将Goblin的3节点集群扩容到5节点。


Raft算法为分布式计算集群中的状态机提供了一种易于理解的共识方法,确保所有节点在相同的状态转换序列上达成一致性。在集群成员变更的情况下,Raft论文中提出了Joint Consensus[3]策略(RJCS),来确保集群组成成员重新配置时的安全性,并防止在单个任期中出现多个leader(脑裂)的风险。RJCS无需任何节点的重启,通过向集群leader发送配置命令,然后leader向follower复制日志的方式来进行集群成员配置的状态转移。然而,Goblin节点目前的实现需要重启完成配置更新。在Goblin中实现RJCS会引入了额外的复杂性。


为了降低系统复杂性并保障Goblin集群节点个数扩容的平稳迅速落地,我们需要设计一种更简单直接的Raft集群扩容策略。该策略必须保证在单个节点逐一重启以进行配置变更的期间,集群也能保持不间断的可用性,并且在扩容过程中规避集群脑裂风险。




2



初始策略及其缺陷 



优先添加新节点


在扩容Goblin集群时,一种将一个3节点的Raft集群扩容为5节点的初步策略是优先添加两个具有5节点配置的新节点,然后更新原始3节点的配置。


然而按照这种方法,一旦添加了新节点,集群将无法保持可用性。在新添加的follower节点后,原始节点对集群成员变化不知情,原始集群中的leader不会将日志复制给新节点。同时,由于新添加的节点无法接收来自现有leader的日志追加请求,它们将持续不断地发送选举请求以启动新一轮的选举。Raft算法为解决非拜占庭问题的一致性而设计,它假设网络中不存在冲突或故意误导性的消息,所以这种持续的选举请求将导致原始集群中的leader被反复下台。由于集群在leader下台后的选举期间无法提供服务,集群变得不可用和不稳定,如图2所示:

图2: Leader节点被新增节点反复罢免的场景



优先配置原节点


为了解决上述问题,另一种初始策略是优先重新配置原始节点(S1、S2、S3),然后将两个新节点(S4、S5)添加到集群中,如图3中所示。然而该策略下,集群的可用性无法保障。在重新配置过程中,每个Goblin节点都需要重启以加载新配置。当S3停机时,集群中仅剩下S1、S2存活,并且它们已经是5节点集群中的成员,而选出leader至少需要3票(quorum),所以无法选出leader,导致集群完全不可用,如图3中第3步所示。


图3: 集群扩容中的不可用场景


实际上,在完成集群扩容后,该策略还存在另一个缺陷。即使在原始的3节点集群中添加了两个节点,形成了一个5节点的集群,集群仍然在相当长的一段时间内容易出现不可用的情况,如图3中第4步所示。具体来说,新添加的S4和S5节点加入集群时没有任何现有的日志,这些节点需要时间从leader同步日志。在追赶的过程中,假如(S1、S2、S3)中的任何一个节点发生故障或停机,集群将无法提交新的日志。这是因为只有(S1、S2、S3)中的剩余两个节点可以接受新的日志,但它们在5节点集群中不构成选举法定成员个数(quorum),导致日志无法提交,写入请求无法完成。




3



 使用 learner 节点


Raft learner节点


Learner角色在Raft集群中充当非选举成员。它的工作责任是只接受来自leader的日志,不参与竞选leader,也不进行投票,因此learner不计入集群的quorum,添加它们不会影响集群的可用性,如图4所示。

图4:带有learner节点的Goblin集群及其quorum


learner可以用于提高集群的读并发能力,在将状态复制到大量learner节点后,这些节点可以处理具有松散一致性要求的只读请求。此外,learner在集群成员配置变更方面发挥着关键作用。正如前面提到的,新添加的成员可能需要大量时间来追赶集群中现有的日志。为了解决这个问题,可以将这些新节点添加到集群中作为learner角色。一旦新节点成功追赶了集群中其余节点的日志,配置变更过程就可以继续进行。


结合learner的方案


基于上述learner节点的特性,我们在Goblin的底层Raft代码(名称Gringofts[4],已由FAS团队开源)中开发了learner有关逻辑并将其应用于Goblin集群扩容。基于learner的优化策略如图5所示:


图5: 带有learner节点的优化策略的扩容步骤


首先添加两个新的learner节点(S4、S5),并使得原始节点(S1、S2、S3)知晓learner的加入,由于learner对原始集群的quorum毫无影响,也不会发送选举请求,因此添加learner过程和Goblin的版本升级并无差别。添加learner后,给予它们足够的时间来追赶日志。一旦learner的日志已经同步到最新,它们可以通过重新配置变更为follower节点。这种策略通过引入learner角色,防止前述的集群在完成配置之后出现不可用性缺陷。


在将(S4、S5)变更为follower之后,它们已经被配置为5节点集群中的成员,接下来只需要如图5的第四步所示,逐个重新配置原始节点(S1、S2、S3)。由于该过程中,集群中存活可用的节点个数始终大于quorum,确保集群可以选出leader,也可以进行日志提交,不会变为不可用状态。这解决了前述的在S3节点重启未就绪期间集群不可用的缺陷,通过精心管理重新配置步骤,保持了集群的可用性,实现了无缝的扩容过程。


此外,如图5中第三步所示,此操作还确保了将新添加的节点从learner变更为follower后不会导致leader反复下台问题(如图2所示)。即使此时新加入的follower节点能够发送选举请求,在原始节点(S1、S2、S3)的视角中,(S4、S5)仍然是learner角色。因此,原始节点(S1、S2、S3)中的leader角色仍然会将日志发送到(S4、S5),因此它们不会转换为candidate进而发送选举请求。极端情况下,可能由于网络故障,(S4、S5)在规定期限内未收到leader的日志追加请求从而转换为candidate开始发出选举请求,但来自被视为learner的节点发送的选举请求会被忽略,也就不会使得leader下台。这种方法保持了集群的稳定性和可用性,避免了前述的由于引入新节点导致的集群不稳定性缺陷。


脑裂风险


必须指出的是,上述基于learner的优化策略虽然解决了可用性问题,但仍然有自己的缺陷,那就是无法避免脑裂风险。


如果出现网络分区,脑裂的发生源于集群中存在总共5个有效的选举成员,即3节点集群成员和5节点集群成员同时存在,如图5的第4步所示。在这种情况下,来自3节点集群的leader只需要2票,而来自5节点集群的leader则需要3票,这5个节点可以形成两个quorum:一个3节点集群和一个5节点集群。例如,在图6中,S1重新配置后,S1、S4和S5可以构成5节点集群的主体,而S2和S3同时可以形成3节点集群的主体。这使得集群中有可能同时存在两个leader,导致在网络分区下出现脑裂情况。为了防止这种情况发生,需要仔细管理节点的变更,并找到一种方式,确保在任何情况下只有一组节点形成选举法定成员个数(quorum)。


Figure 6: 网络分区下的集群脑裂场景之一




4



最终推荐策略



规避脑裂风险


为了解决脑裂问题并在扩容过程中保持可用性,本文推荐的最终策略如图7所示。该策略和图5相比,在第3步时,只将learner S4变更为follower角色,最后在第5步中,完成对剩余的learner S5节点的变更。通过精心管理节点的变更过程,始终保持有效的可选举节点个数少于5,有效地避免了脑裂的情况。该策略确保没有机会出现两个leader共存,从而维护了变更时的安全性和稳定性。


该推荐策略和图5中的策略一样,通过learner的引入,解决了前述的新增节点导致的一系列缺陷。与此同时,虽然该策略扩容过程中,有效的可选举节点个数相比图5更少,但仍然可以解决可用性问题。如图7所示的第4步,在对S1、S2、S3进行重新配置的过程中,集群中有效可选举成员的最小数量为三个,即在(S1、S2、S3)中存在两个成员,而S4也是一个有效可选举成员。换句话说,它们始终可以构成一个5节点集群的quorum,这意味着可以选出leader,保障了集群的可用性。


图 7: 保障可用性以及规避脑裂风险的推荐策略的扩容步骤



一般化归纳


为了更直观地讨论可用性、多主脑裂问题,前文主要以3节点集群扩容到5节点为例,对该推荐策略进行阐述。实际上,该策略同样可以应用于更一般化的场景,即对任意个数的Raft集群进行扩容。具体地,假设原始集群(CA)具有A = (2m - 1)个节点,其中m表示CA选举quorum。目标是将CA扩容到具有B = (2n - 1)个节点的目标集群(CB),其中n表示CB选举quorum。扩容步骤依然如图7所示,在第三步中,将集群的中间状态(即可选举成员个数)表示为X,则X应满足以下不等式,以防止脑裂并同时保持可用性:

max(m, n) < X < (m + n)


由于我们的目标是将CA扩容到具有比CA更大集群CB(n > m),我们可以简化不等式如下:

n < X < (m + n)


不等式左条件max(m, n) < X的目的是确保高可用的扩容过程。在逐步重新配置重启过程中,最小的可选举成员大小是X-1。如果X-1大于或等于最大的quorum(X-1 >= max(m, n)),则集群始终可以保持quorum的存活,从而实现正常的leader选举和日志复制。由于X是一个自然数,这个条件可以简化为X > max(m, n)。


不等式右条件X < (m+n)的目的是防止脑裂情况的发生。当最大可选举成员大小X小于两个集群的quorum之和(m + n)时,将无法形成两个独立的集群,因为成员只能为同一任期内的单个节点投票。为了避免脑裂并尽可能增强节点的容错能力,最好选择X = m+n-1。


因此,在集群的中间状态选择中,应变更X-A个learner节点为follower成员。对于该一般化问题,我们可以按照以下通用步骤将CA扩容到CB,既保障了在重新配置过程中的可用性,又消除脑裂风险:


  1. 创建(B-A)个新节点并将它们配置为learner。

  2. 逐个变更CA中的节点,使它们获知到learner的存在。等待learner追赶到最新的Raft日志。

  3. 根据n<x<(m+n)确定适当的x。变更(x-a)个learner为follower成员,使用c< span="">B的成员信息。

  4. 使用CB的成员信息重新配置CA中的原始节点,并逐个操作。

  5. 变更剩余的(B-X)个learner为follower成员,使用CB的成员信息。




结 语


eBay FAS Infra团队始终致力于分布式系统的高可用研究与优化,其中,对强一致性的Raft集群进行变更操作最具有挑战性。往期文章《eBay支付核心账务系统之“展”翅高飞》介绍了如何在保障服务可用性前提下,将单个Raft集群向多个集群扩展。而本文则从单个Raft集群的扩容角度,论述了Raft集群增加节点个数的实用策略,总结了在保障集群可用性和规避多主脑裂等方面的一些思考,实现了提高集群数据可靠性和分区容错性的从“容”不迫,希望能为同类型的分布式系统提供一些参考。




参考文献 

[1] eBay支付核心账务系统架构演进之路:https://mp.weixin.qq.com/s/O5_Rde5uUXvmBS2B7w2hOQ

[2] Diego Ongaro; Ousterhout, John (2013). "In Search of an Understandable Consensus Algorithm"

[3] Diego Ongaro. 2014. Consensus: Bridging theory and practice. Stanford University

[4] Opensource.eBay.Inc.(2020).Gringofts.[Source Code]. https://github.com/eBay/Gringofts


eBay技术荟
eBay技术荟,与你分享最卓越的技术,最前沿的讯息,最多元的文化。
 最新文章