先拜一拜伟大的 Leslie Lamport 祖师爷。

Leslie Lamport

什么是分布式系统

分布式系统是一组电脑,透过网络相互连接传递消息与通信后并协调它们的行为而形成的系统。 —— wikipedia

当然我觉得这个定义有点狭窄了,我扩展范围后的定义是:

分布式系统是一组抽象的计算和存储单元,通过某种方式相互连接传递消息并协调它们的行为而形成的系统。

讲道理,单机上的一组进程其实也一定程度上具有分布式系统的功能,也存在分布式系统中的问题,只不过部分问题的发生率降低了而已,因此我觉得将分布式系统窄化到多个物理计算机之间是不甚合理的。1

分布式系统的作用

主要是:

  • 满足扩展性(Scalability)需求:一台机器吃不消了,多上几台机器就能顶住
  • 满足高可用性(Availability)需求:某几个机器down了,整个服务不能down

分布式系统的难点

分布式系统涉及到多个计算与存储单元(称为节点),故:

  • 相比单个节点,更容易出现某些节点故障
  • 节点之间的通信可能出现问题,消息可能会丢失、重复、乱序

相对来说,分布式“计算”的门槛是相对较低的,如果某个节点烂了直接换个节点算就行了,而存储问题就比较大了。

常用概念

内部一致性

内部一致性(Consistency in ACID)指数据库内部的数据完整性(由各类约束、触发器,再加上数据库的隔离性保证)。

当我们在说:

我们说的就和内部一致性有关。

外部一致性

指 Read 和 Write 应该遵守怎样的时间线顺序,比如 Linearizability 外部一致性级别就保证了每一个读操作都将返回“(某个标准时钟规定的)最近的写操作”。 CAP 中的 C 指的是外部一致性。 当我们在说:

我们所说的就和外部一致性相关。

1

我记得伟大的羊学长说过,集群是操作系统在网络上scale的结果。

2

有些人称 “XX 共识算法” 为 “XX 一致性算法”,个人觉得可以理解为“用来解决一致性问题的算法”,问题也不大。