分布式初探 Distributed 101
什么是分布式系统?
使用多机来处理单机相同问题的系统
多点存储,多点计算
为什么需要分布式系统?
解决日益增长的存储资源和计算资源占用的问题,分散系统压力
分布式需要解决的三大问题
- 存储
- 传输(通信)
- 计算
分布式系统的目标
能够通过购买 N 多硬件来应对 N 数量级增长的问题
分布式系统的性质
扩展性 Scalability
可分为三个维度:
- 数量级扩展:节点的数量增加应该让整个系统线性提速,数据量的增加不应该增加延迟
- 地理扩展:使用异地数据中心降低用户响应时间,合理处理跨数据中心的响应延迟
- 调度扩展:增加更多的节点不应该增加整个系统管理的负担
性能 Performance
- 给定任务能够快速处理完成(低延迟)
- 高吞吐量(任务处理率)
- 占用较少的计算资源
这些因素需要不断地权衡,其中低延迟可以说是最为重要的因素,常与物理上的限制相关,这种问题难以用金钱解决
延迟:指的是某事件发生直到其产生影响或可见时的那一段过程
一个数据完全不发生改变的系统不应该有延迟问题
理想状态下的最低延迟取决于信息所要经过的物理距离
可用性 (容错性) Availability and Fault Tolerance
分布式系统优于单机的一个点在于单机无法容错,要么成功,要么失败
分布式系统可以容纳一群不可靠的组件,在顶层建立起一个可靠的系统
毫无冗余的系统的可用性与其组件相同,含有冗余设计的系统可以容许部分失败因此具有高可用性
可用性 = 在线时间 / (在线时间 + 死时间)
容错:在错误发生时能够按设定好的方式继续工作的能力
简而言之,我们无法容忍那些我们没有预知的错误
分布式系统的限制
物理上:
- 节点的个数
- 节点之间的距离
如果增加节点的个数:会降低系统的可用性,增加管理的开销,节点间通讯的开销会降低性能进而增加等待时间(与物理距离相关)
性能与可用性可以使用系统对外部的保证(可靠性)来界定,这种保证是不同服务之间的协议,例如:在这个点写入的数据,在其他点读取的这个数据能有多快?写完的数据能不能保证被持久化?一个计算请求能在多长时间内返回结果?如果有组件失效,对整个系统会有什么样的影响?
错误是不正确的行为,异常是未知的行为
系统抽象与建模
好的抽象使系统更容易理解
对外隐藏细节的系统更加容易理解,但暴露更多细节的系统能够得到更好的优化
理想的系统既有清晰的表达又满足业务需要
设计精髓:分治和复制 Partition and replicate
对于一份数据集来说,它能够被分成多个小份以便分配到多个节点实现并行处理(分治),也可以被复制或缓存到不同的节点以减少客户端和服务端之间的距离提高容错性。
分治
将数据分成不同且独立的子集,解决数据量的不断增长,提高了处理性能和可用性,分割的依据和访问数据的主要方式相关,要解决独立子集的一些问题(如不同子集间的低效访问)
复制
使新的计算资源应用到新的拷贝数据中,降低等待时间又增强了可用性
复制可增强扩展性,性能和可靠性
复制可以避免单点失败,加速计算,缓存IO提高吞吐
复制带来的问题:
- 集群数据同步(保持数据一致性)
一致性模型的选择至关重要:强一致性的模型允许你的程序能够像对待一份数据那样去编程,而弱一致性的模型能带来更低的延迟和更高的可用性