0. 前言

“Distributed Systems for Fun and Profit” 是 mixu 2013 年在 网络上 免费发布的一本介绍分布式系统的小册子。

分布式的两种结果:

  • 信息以光速传播
  • 独立节点独自失败

分布式系统处理距离和多个节点的问题

1. 从高层次角度看分布式系统

计算机的基本任务

  • 存储

  • 计算

分布式编程就是用多机解决在单机上的相同问题,通常此问题单机已经不能满足要求。

小规模时,单个节点上升级硬件可以解决问题,但随着问题规模增大,单节点升级硬件无法解决或者成本过高时就需要分布式系统。当前最值得的是中档的商业硬件,通过容错软件降低成本。

增加新机器不会像理想情况一样线性增加性能和容量。

本文重点是讨论数据中心上的分布式编程。

实现目标:可扩展性等优点

可扩展性

可扩展性(Scalability):系统、网络或进程有能力处理不断增长的工作量的能力,或者为了适应这种增长而进行扩展的能力

  • 大小可扩展
  • 地理可扩展
  • 管理可扩展

性能与延迟

性能(Performance):参照资源和时间,系统完成的有效工作量

延迟(Latency):重要是的新数据在系统中出现的时间,分布式系统中受制于光速和硬盘速度等

可用性(容错)

可用性(Availability):系统处于正常运行状态的时间比例, Availability = uptime / (uptime + downtime)

分布式系统可以通过冗余实现容忍部分故障

容错(Fault tolerance):故障发生后系统以明确定义的方式运行的能力

制约

分布式系统受两个物理因素的约束:

  • 节点数(随所需的存储和计算能力而增加)
  • 节点之间的距离(信息最多以光速传播)

性能和可用性由外部定义,通常表述为SLA(服务级别协议)

抽象和模型

抽象使事情变得更易于管理,模型精确描述分布式系统的关键特性。

如:

  • 系统模型(异步/同步)

  • 失败模型(崩溃失败,分区,拜占庭)

  • 一致性模型(强一致,最终一致)

设计技巧:分区和复制

分区(Partition)

将大数据集划分为小的独立集

  • 分区通过限制要检查的数据量并在同一分区中定位相关数据来提高性能
  • 分区通过允许分区独立发生故障来提高可用性
复制(Replication)

在多机上复制相同的数据,是对抗延迟的主要办法

  • 通过增加新数据副本上的计算能力和带宽来提高性能
  • 通过创建数据的其他副本来提高可用性

复制需要遵循一致性模型