为什么要做分布式系统

用大量节点“伪装”成一个单一节点对外服务

规模

  超大规模的存储量,要求系统必须具备较强的 横向扩展能力。 (为什么不是纵向扩展?)

可靠性
数据持久化存储之后,要保证数据不丢失,不损坏

可用性
整个分布式系统,要保证较高的可用性,几乎不间断的提供大规模服务

分布式系统面临的挑战

规模
分布式系统中大部分问题都可以认为是规模问题。

节点故障
单节点稳定性假如是99.99%,那么在 1 万个节点的分布式集群中,至少 1 个节点发生故障的概率是多少?
当集群中的节点发生故障时,对集群内数据的可靠性,对集群整体的可用性会带来哪些影响?

一致性

在节点故障率如此之高,数据多副本存储的多于 1 个的情况下,我们如何保证多个副本数据是一致的?如何保证数据不会丢失或损坏?

网络可靠性

分布式系统谬误之一:网络是可靠的(维基百科:分布式系统的谬误)
网络不可靠是因为网络是复杂的
网络之所以复杂,是因为通信是复杂的
其中分布式系统最值得关注的网络问题是 网络分区

CAP

拜占庭将军问题
若集群中的节点是不可信的,则需要考虑恶意节点对集群造成的影响;本文仅讨论可信节点组成的集群,即无需考虑拜占庭将军问题。

怎么构建一个分布式系统

分布式系统的最终目标
使用若干计算机组成一个系统,使得这个系统从外界看上去就像是一台计算机一样。该“计算机”拥有无限扩展能力,可靠性,可用性。

分布式系统模型

  • 最简单的分布式系统:无状态分布式系统;
  • 更复杂的分布式系统:有状态分布式系统,一般简称分布式系统;

有状态分布式系统模型

  • 节点
    每个节点运行一套各自的程序,所以节点和节点之间是 并行运行 的。

  • 网络
    节点之间通过网络进行通信,由于网络的不可靠性,所以任何其他节点发来的数据都是过期的。

  • 失败
    任意一个节点可能在任何时间发生任意类型的失败,也可能恢复。

  • 时钟
    整个集群没有全局时钟,也就是说,外部请求到达集群的顺序是偏序的。

分布式系统的主要构建策略

  • 多副本

  • 一致性协议

  • 故障切换策略

其中最重要的一个策略,就是“多副本”。而多副本场景下,要面临的最突出的问题就是副本的“数据一致性”。