Files
MIT6.824/lecture-06-raft1/6.2-guo-ban-piao-jue-majority-vote.md
2022-01-25 02:41:31 +00:00

6.0 KiB
Raw Permalink Blame History

6.2 过半票决Majority Vote

尽管存在脑裂的可能,但是随着技术的发展,人们发现哪怕网络可能出现故障,可能出现分区,实际上是可以正确的实现能够自动完成故障切换的系统。当网络出现故障,将网络分割成两半,网络的两边独自运行,且不能访问对方,这通常被称为网络分区。

在构建能自动恢复同时又避免脑裂的多副本系统时人们发现关键点在于过半票决Majority Vote。这是Raft论文中出现的用来构建Raft的一个基本概念。过半票决系统的第一步在于服务器的数量要是奇数而不是偶数。例如在上图中只有两个服务器中间出现故障那两边就太过对称了。这里被网络故障分隔的两边它们看起来完全是一样的它们运行了同样的软件所以它们也会做相同的事情这样不太好会导致脑裂

但是如果服务器的数量是奇数的那么当出现一个网络分割时两个网络分区将不再对称。假设出现了一个网络分割那么一个分区会有两个服务器另一个分区只会有一个服务器这样就不再是对称的了。这是过半票决吸引人的地方。所以首先你要有奇数个服务器。然后为了完成任何操作例如Raft的Leader选举例如提交一个Log条目在任何时候为了完成任何操作,你必须凑够过半的服务器来批准相应的操作。这里的过半是指超过服务器总数的一半。直观来看如果有3个服务器那么需要2个服务器批准才能完成任何的操作。

这里背后的逻辑是,如果网络存在分区,那么必然不可能有超过一个分区拥有过半数量的服务器。例如,假设总共有三个服务器,如果一个网络分区有一个服务器,那么它不是一个过半的分区。如果一个网络分区有两个服务器,那么另一个分区必然只有一个服务器。因此另一个分区必然不能凑齐过半的服务器,也必然不能完成任何操作。

这里有一点需要明确当我们在说过半的时候我们是在说所有服务器数量的一半而不是当前开机服务器数量的一半。这个点困扰了我Robert教授很长时间。如果你有一个系统有3个服务器其中某些已经故障了如果你要凑齐过半的服务器你总是需要从3个服务器中凑出2个即便你知道1个服务器已经因为故障关机了。过半总是相对于服务器的总数来说。

对于过半票决可以用一个更通用的方程式来描述。在一个过半票决的系统中如果有3台服务器那么需要至少2台服务器来完成任意的操作。换个角度来看这个系统可以接受1个服务器的故障任意2个服务器都足以完成操作。如果你需要构建一个更加可靠的系统那么你可以为系统加入更多的服务器。所以更通用的方程是

如果系统有 2 * F + 1 个服务器那么系统最多可以接受F个服务器出现故障仍然可以正常工作。

通常这也被称为多数投票quorum系统因为3个服务器中的2个就可以完成多数投票。

前面已经提过有关过半票决系统的一个特性就是最多只有一个网络分区会有过半的服务器所以我们不可能有两个分区可以同时完成操作。这里背后更微妙的点在于如果你总是需要过半的服务器才能完成任何操作同时你有一系列的操作需要完成其中的每一个操作都需要过半的服务器来批准例如选举Raft的Leader那么每一个操作对应的过半服务器必然至少包含一个服务器存在于上一个操作的过半服务器中。也就是说任意两组过半服务器至少有一个服务器是重叠的。实际上相比其他特性Raft更依赖这个特性来避免脑裂。例如当一个Raft Leader竞选成功那么这个Leader必然凑够了过半服务器的选票而这组过半服务器中必然与旧Leader的过半服务器有重叠。所以新的Leader必然知道旧Leader使用的任期号term number因为新Leader的过半服务器必然与旧Leader的过半服务器有重叠而旧Leader的过半服务器中的每一个必然都知道旧Leader的任期号。类似的任何旧Leader提交的操作必然存在于过半的Raft服务器中而任何新Leader的过半服务器中必然有至少一个服务器包含了旧Leader的所有操作。这是Raft能正确运行的一个重要因素。

学生提问可以为Raft添加服务器吗

Rober教授Raft的服务器是可以添加或者修改的Raft的论文有介绍可能在Section 6。如果是一个长期运行的系统例如运行5年或者10年你可能需要定期更换或者升级一些服务器因为某些服务器可能会出现永久的故障又或者你可能需要将服务器搬到另一个机房去。所以肯定需要支持修改Raft服务器的集合。虽然这不是每天都发生但是这是一个长期运行系统的重要维护工作。Raft的作者提出了方法来处理这种场景但是比较复杂。

所以在过半票决这种思想的支持下大概1990年的时候有两个系统基本同时被提出。这两个系统指出你可以使用这种过半票决系统从某种程度上来解决之前明显不可能避免的脑裂问题例如通过使用3个服务器而不是2个同时使用过半票决策略。两个系统中的一个叫做PaxosRaft论文对这个系统做了很多的讨论另一个叫做ViewStamped ReplicationVSR。尽管Paxos的知名度高得多Raft从设计上来说与VSR更接近。VSR是由MIT发明的。这两个系统有着数十年的历史但是他们仅仅是在15年前也就是他们发明的15年之后才开始走到最前线被大量的大规模分布式系统所使用。