谭浩的博客

Simple is beauty.

分布式系统介绍

分布式编程是一种使用多机解决单机问题的艺术

什么是分布式系统

  • 集群(多机)
  • 通过网络相互连接
  • 共同做一些事情

单机系统为什么不适用

  • 单机故障问题,无法容错
  • 计算存储等资源限制

分布式系统的目标

Note:大部分问题在小规模时是不重要的,但是在规模变大时小问题也不再是小问题。

可扩展性

  • Size Scalability:增加节点应该让系统性能线性提高;数据集的增加不应该增加延迟
  • Geographic scalability: 可以使用多个数据中心减少用户查询的响应时间;同时用合理的方式处理跨数据中心的延迟
  • Administrative scalability: 增加节点不应该增加系统的维护成本

可扩展系统是随着规模增加而不断满足其用户需求的系统。

性能

  • 给定的任务短时间响应和低延迟
  • 高吞吐量
  • 计算资源利用率低

优化这些需要进行一些tradeoff,比如高吞吐量和快速响应就不能两全其美。

可用性

分布式系统解决了单机系统无法容忍错误的问题,分布式系统可以使用一堆不可靠的组件,在其上面构造一个可靠的系统。而故障出现的概率会随着组件的增加而增加,所以分布系统系统需要保障系统不会随着组件的增加而变得不可靠。

可用性计算:avalability = uptime / (uptime + downtime)

可用性(%) 一年的宕机时间
90% (0ne nine) More than one month
99%(two nines) Less than 4 days
99.9%(three nines) Less than 9 hours
99.99%(four nines) Less than one hour
99.999%(five nines) ~ 5 minutes
99.9999%(six nines) ~ 31 seconds

分布式系统遇到的难点

分布式系统会被两个物理因素所限制:

  • 节点的增加
  • 节点之间的距离

独立节点的增加会增加系统故障出现的概率(减少了可用性以及增加了维护成本)

独立节点的增加会增加节点之间通信的需求(减少了性能)

地理位置的增加会增加远亲节点之间的最小延迟(减少了某些操作的性能)

除了物理因素的影响,我们要考虑设计的选择。

抽象和模型

抽象通过移除与所要解决问题不相关的现实世界的某些方面而让事情更加容易管理。

模型则用精确的方式来描述一个系统的关键属性。例如系统模型(同步/异步)、故障模型(崩溃 - 失败,分区,拜占庭)、一致性模型(强,最终)。

设计技巧:分区和复制

分区可以允许更多的并行处理,复制可以减少客户端与服务端之间的距离(将所需数据复制到本地主机)以及提高容错性(备份可以容忍一定程度机器故障)。

分布式系统的一些应用

分布式系统大多从比较小的系统,为了应对不断加强的业务需求衍生而来,比如:

  • 搜索引擎 google
  • 购物 淘宝 亚马逊
  • 文件同步 dropbox
  • 社交网络 facebook

参考资料:

Distributed systems for fun and profit