Windows Azure Storage Made Simple
加机器就是一把梭
没有什么问题是加一千台机器解决不了的,如果有,就再加一千台。
—— 《21天精通分布式系统》
分布式系统在设计之初,是为了解决单机系统的可用性和可扩展性问题的。
举个例子,单机系统就是雇一个小弟替你干活,但是这个小弟不太靠谱,偶尔泡个病号不上班,偶尔工作太多一个人干不过来。
分布式系统就是雇一群小弟帮你干活,偶尔有一两个小弟泡病号,我们会有富裕的人力顶上,工作太多我们可以继续拉新的小弟入伙,美滋滋。
这个比喻很好的描述了单机系统和分布式系统之间的关系。所以一种可能的分布式系统就是这个样子的:
我们将相同功能的服务器组成一个整体,通过一个load balancer对外提供服务。
这样的系统初步解决了我们的问题,在面对可扩展性和可用性的问题时,我们会:
- 容量不足就加机器
- 单机挂掉了就把流量调度到其它的节点上
不过单纯的加机器并不能完全满足我们的需要。对于CPU密集型的服务,增加副本数可以有效的均摊计算压力,但是对于存储密集型的服务,我们需要增加分库逻辑才能有效的增加系统的计算能力。
例如我们有100G的数据,但是数据库的容量最多只支持50G。这样无论怎么样增加副本都不能解决问题。如果我们将100G的数据均分,存储在两个50G的分库上,我们就可以支持单机系统容纳不了的数据了。
我们还可以把多个这样的分布式子系统组合起来,就可以组成一个小有规模的分布式系统了。现在我们在使用的一些服务,仍在使用这种模型。
上面分布式模型虽然有效,但是引入了一个严重的问题:因为节点之间是隔离的,并且只能通过消息传递进行通信与协调,所以基本无法完全保证副本之间保持一致的内部状态。
这就是所谓的一致性问题。