0-Hello
可扩展性 Scalability¶
随着互联网的发展,单机系统的性能已经无法满足需求,要么通过 提高单机性能(例如增加内存容量、磁盘容量、CPU核心数等),要么通过 增加机器的数量 来提高系统的性能。
但是提高单机性能的方式有限,且由于边际递减效应,提高单机性能的成本会越来越高。而且单机系统的性能是有物理上限的,无法无限提高。而通过增加机器的方式,可以无限提高系统的性能,只要你有钱,只要你有机器,就可以无限提高系统的性能。
Note
- 通过提高单机性能的方式,叫做 纵向扩展、垂直扩展、Vertical Scaling。
-
通过增加机器的方式,叫做 横向扩展、水平扩展、Horizontal Scaling。
-
Scale Up: 垂直扩展,提高单机性能,例如增加内存、磁盘、CPU 等。
- Scale Down: 垂直缩减,降低单机性能,例如减少内存、磁盘、CPU 等。
- Scale Out: 水平扩展,增加机器数量,例如增加服务器数量。
- Scale In: 水平缩减,减少机器数量,例如减少服务器数量。
增加机器的数量,使得系统变成了一个分布式系统,对于分布式系统,天然地就存在 可扩展性 这样的评价指标。可扩展性是指系统能够通过增加机器的数量,来提高系统的性能,而不会对系统的架构和设计产生影响。
扩展性的目标是使系统中的每一个节点都在一个较为稳定的负载下工作,即负载均衡(Load Balancing)。当动态增加节点的时候,需要进行任务的迁移,任务可能是计算、也可能是存储,以达到动态均衡。
那么首先要考虑的问题是:怎么拆分任务?怎么分配任务?怎么迁移任务?这就是 分片(Partition) 的问题。
Note
分片方式有很多种,常见的算法包括:哈希分片、范围分片、一致性哈希等。每种算法都有各自的优缺点和适用场景。
可用性 Availability¶
在大型的分布式系统中,由于规模的增大,会使得在单机系统下几乎不需要考虑的问题(例如风扇故障导致过热不工作、网络波动等)变成频繁出现的问题,因为随着数量的增加,故障的概率也随之增加。
所以在分布式系统中,可用性是一个非常重要的指标,它是指系统能够在一定时间内正常运行的能力。
可用性
可用性,说的是系统经过精心设计,在特定的错误类型下,系统仍然能够正常运行,仍然可以向没有出现错误一样,为你提供完整的服务。
除了可用性,还有一个容错特性是自我可恢复性(recoverability),系统在出现错误后,能够自我修复,恢复到正常状态,并且完全正确的重新运行。
可用性的百分比
Level of Avaliability | Percent of Uptime | Downtime per Year | Downtime per Month | Downtime per Week |
---|---|---|---|---|
1 Nine | 90% | 36.5 days | 72 hours | 16.8 hours |
2 Nines | 99% | 3.65 days | 7.2 hours | 1.68 hours |
3 Nines | 99.9% | 8.76 hours | 43.2 minutes | 10.1 minutes |
4 Nines | 99.99% | 52.6 minutes | 4.32 minutes | 1.01 minutes |
5 Nines | 99.999% | 5.25 minutes | 25.9 seconds | 6.05 seconds |
6 Nines | 99.9999% | 31.5 seconds | 2.59 seconds | 605 milliseconds |
可用性通常用百分比来表示,例如 99.999% 的可用性意味着系统每年最多只能停机 5 分钟。
而随着机器数量的上涨,故障是常态,那么分布式系统的其中一个设计目标就是 容错。
冗余是提高可用性、可靠性的法宝。
冗余就是说多个节点负责相同的任务。在分布式存储中,数据的冗余是通过数据的复制来实现的。在分布式计算中,任务的冗余是通过任务的备份来实现的。
冗余
例如在 MapReduce 中,当一个 worker 运行异常缓慢时,master 会将这个 worker 上的任务重新分配给其他 worker,这就是任务的冗余。
而存储的冗余会比计算的冗余更复杂,因为数据的冗余需要考虑数据的一致性问题。
维护同一份数据的多个副本,可以提高数据的可靠性,即使有节点宕机,数据也不会丢失。但是这样会带来一个问题,就是数据的一致性问题。 当想副本写入数据的时候,怎么保证并发情况下数据的一致性,因为有可能数据还没复制完,就又有新的数据进来了,这就会导致数据的不一致。 在这个过程中是一个节点决定更新的顺序,还是多个节点同时更新,是同步复制还是异步复制,这些都是 一致性 的问题。
中心化和去中心化
-
中心化:即有一个主节点(Primary master)负责调度数据的更新,其他节点(Secondary master)只负责读取数据。这样可以保证数据的一致性。 但是主节点成为了系统的瓶颈,一旦主节点宕机整个系统就不可用了,即单点故障。但是协议简单,将并发放操作转变为顺序操作。
-
去中心化: 即所有节点都可以读写数据。这样可以提高系统的性能,但是要保证一致性比较困难,协议比较复杂。但是高可用。
一般来说,中心化的系统一般用于读多写少的场景,而去中心化的系统一般用于读写都很多的场景。
同步、异步和半同步复制
- 同步复制:即主节点写入数据后,必须等待所有副本写入成功后才返回成功。这样可以保证数据的一致性,但是性能比较差。
- 异步复制:即主节点写入数据后,不等待副本写入成功就返回成功。这样可以提高性能,但是可能会丢失数据。
- 半同步复制:即主节点写入数据后,等待部分副本写入成功后就返回成功。这样可以保证数据的一致性,同时也提高了性能。
一致性 Consistency¶
一致性是指分布式系统中的所有节点在同一时间的数据是一致的。在分布式系统中,由于网络的延迟、分区等问题,会导致数据的不一致。
为了提高可用性引入了冗余(多副本)机制,而冗余则带来一致性问题。
当然如果没有冗余机制,或者不是数据的冗余、状态的冗余,而是任务的冗余,那么就不会有一致性问题。 因为任务的冗余是通过任务的备份来实现的,只要备份的任务执行结果是一样的,那么就不会有一致性问题,例如 MapReduce 中的任务冗余。
在分布式系统中,一致性从系统的角度,通常分为 强一致性、弱一致性、最终一致性 三种。
Note
- 强一致性:即所有节点在同一时间的数据是一致的。强一致性是最理想的一致性,但是性能比较差。
- 弱一致性:即所有节点在同一时间的数据不一定是一致的。弱一致性是一种折中的一致性,性能比较好。
- 最终一致性:即所有节点在同一时间的数据不一定是一致的,但是最终会达到一致。最终一致性是一种折中的一致性,性能比较好。
一般来说,强一致性用于读写都很多的场景,而弱一致性和最终一致性用于读多写少的场景。
一致性和可用性是矛盾的,强一致性会影响系统的性能,而弱一致性和最终一致性会提高系统的性能。这一点在 CAP 理论中有所体现。
分区容错性 Partition Tolerance¶
分布式系统中每个节点之间通过网络连接,使得多台机器之间组成一个整体,但是网络是不可靠的,网络会出现延迟、丢包、拥塞等问题, 这就会导致分布式系统中的节点之间通信出现问题,导致一个整体的分布式系统被分割成多个部分,这就是分区的情况。
这里的分区指的是网络分区。一个分布式系统中的节点之间通过网络连接,如果网络出现问题,导致节点之间无法通信,那么就会出现分区的情况。
分区容错性强调的事分布式系统对于网络故障的应对策略,即分布式系统在网络分区的情况下,仍然能够正常运行,这是分布式系统最基本的要求,否则就不是分布式系统。
Note
分布式系统的设计目标是在网络分区的情况下,仍然能够正常运行,这就是分区容错性。
分区容错性是分布式系统的基本要求,所以通常是在 一致性 和 可用性 之间进行权衡。
在 CAP 理论中,一致性 C、可用性 A、分区容错性 P 三者不可能同时满足,只能满足其中的两个。 而分区容错性 P 是分布式网络系统的基本要求,所以通常是在 CP 和 AP 之间进行权衡。
一般来说,强一致性用于读写都很多的场景,而弱一致性和最终一致性用于读多写少的场景。
总结¶
随着互联网的发展,单机系统的性能已经无法满足需求,要么通过提高单机性能,要么通过增加机器的数量来提高系统的性能,即垂直扩展和水平扩展。
水平扩展对应着 可扩展性 Scalability,要求增加机器的数量来提高系统的性能,而不会对系统的架构和设计产生影响。
由于机器数量的增加,发生故障的概率随之增加,所以 可用性 Availability 是分布式系统的重要指标,即系统能够在一定时间内正常运行的能力。
为了提高可用性引入了冗余机制,而冗余则带来了 一致性 Consistency 问题,即分布式系统中的所有节点在同一时间的数据是一致的。
分布式系统中的节点之间通过网络连接,使得多台机器之间组成一个整体,但是网络是不可靠的,这就会导致分区的情况。 要求即使在网络分区的情况下,分布式系统仍然能够正常运行,这就是 分区容错性 Partition Tolerance。
Note
-> 互联网发展带来单机性能不足、不可扩展问题 -> 选择水平增加机器满足可扩展性
-> 增加机器带来可用性下降问题 -> 引入冗余(多副本)机制满足可用性
-> 冗余(多副本)机制带来一致性问题 -> 引入一致性(强一致性、弱一致性、最终一致性)来根据情况权衡
在 CAP 理论中,一致性 C、可用性 A、分区容错性 P 三者不可能同时满足,只能满足其中的两个。 而分区容错性 P 是分布式网络系统的基本要求,所以通常是在 CP 和 AP 之间进行权衡。