初识分布式系统
为什么要做分布式系统
用大量节点“伪装”成一个单一节点对外服务
规模
超大规模的存储量,要求系统必须具备较强的 横向扩展能力。 (为什么不是纵向扩展?)
可靠性
数据持久化存储之后,要保证数据不丢失,不损坏
可用性
整个分布式系统,要保证较高的可用性,几乎不间断的提供大规模服务
分布式系统面临的挑战
规模
分布式系统中大部分问题都可以认为是规模问题。
节点故障
单节点稳定性假如是99.99%,那么在 1 万个节点的分布式集群中,至少 1 个节点发生故障的概率是多少?
当集群中的节点发生故障时,对集群内数据的可靠性,对集群整体的可用性会带来哪些影响?
一致性
在节点故障率如此之高,数据多副本存储的多于 1 个的情况下,我们如何保证多个副本数据是一致的?如何保证数据不会丢失或损坏?
网络可靠性
分布式系统谬误之一:网络是可靠的(维基百科:分布式系统的谬误)
网络不可靠是因为网络是复杂的
网络之所以复杂,是因为通信是复杂的
其中分布式系统最值得关注的网络问题是 网络分区
CAP
拜占庭将军问题
若集群中的节点是不可信的,则需要考虑恶意节点对集群造成的影响;本文仅讨论可信节点组成的集群,即无需考虑拜占庭将军问题。
怎么构建一个分布式系统
分布式系统的最终目标
使用若干计算机组成一个系统,使得这个系统从外界看上去就像是一台计算机一样。该“计算机”拥有无限扩展能力,可靠性,可用性。
分布式系统模型
- 最简单的分布式系统:无状态分布式系统;
- 更复杂的分布式系统:有状态分布式系统,一般简称分布式系统;
有状态分布式系统模型
节点
每个节点运行一套各自的程序,所以节点和节点之间是 并行运行 的。网络
节点之间通过网络进行通信,由于网络的不可靠性,所以任何其他节点发来的数据都是过期的。失败
任意一个节点可能在任何时间发生任意类型的失败,也可能恢复。时钟
整个集群没有全局时钟,也就是说,外部请求到达集群的顺序是偏序的。
分布式系统的主要构建策略
多副本
一致性协议
故障切换策略
其中最重要的一个策略,就是“多副本”。而多副本场景下,要面临的最突出的问题就是副本的“数据一致性”。