谈谈对分布式系统的理解

写这篇已经是00.20了,本来打算10点开始写的,但是空洞骑士太好玩了。研一上这学期吃饱了撑的选了一门课《分布式系统》,结果每周两节课都是早上第一节,搞得我几乎一节课没去,但是没办法试还得考,所以花了一点时间拜读了《分布式系统概念和设计》的部分内容,下面的内容全是有感而发,不会设计相关的算法细节。

概述

​ 自从互联网被发明以来,这个世界就进入了信息时代。随之而来的就是海量的数据需要维护和存储,量级更大的计算任务需要处理,这些都给传统的计算机带来的全新的挑战:单个计算机已经无法胜任海量的任务了。于是分布式系统这个领域就应运而生了。

​ 在我的理解中,分布式系统就是让多个独立的主机(或者说进程)共同协作,完成传统的单个计算机无法完成的任务。“完成”

一词看似轻巧,但是认真想想会产生一大堆传统单机器不会出现的问题,如:

  1. 如何保证效率
  2. 如何保证多机的可靠性
  3. 如何方便这个多机系统的伸缩阔扩展

这些都是一个成熟的分布式系统需要考虑的问题,下面我将慢慢叙述从这些性质发散和得出的一些问题、知识和算法等等。

通信,资源,事务

​ 人与人协作需要交流,计算当然也需要,计算机的这种”交流“被称之为通信。我们很自然地就能想到,计算机通信需要因特网的参与,但是这并不是我们关注的重点,我们的重点是更上层的东西。举一个例子,A计算机有一条很重要的信息要通告给这个系统的其它所有信息,并且需要这些信息作出回应,这里的问题是如何保证A发出的消息能准确地到达其它所有信息。再比如一个系统需要产生一个代表计算机A做整个系统的日志收集并发送给管理员,这种机制在分布式系统中被称为“选举”,也是需要解决的问题。

​ 资源访问是多机系统协作不能避免的问题。从”资源“这个词我们很容易就能想到的是分布式互斥问题:如何正确地分配一份(或者多份)临界资源给分布式系统?如何避免计算机在争夺资源的过程中发生死锁?如何才能让每个计算机都能公平地对独占资源进行访问而不被饿死?

​ ”并发“是多机器系统的不可避免的问题,在涉及到数据读写的问题时就更是如此。假设两个系统A和B”并发地“向计算机C提交一个事务,如何保证这两个并发事务的ACID特性?加锁?还有更好的方法吗?事务调度也是分布式系统(所有的存在并发的系统)中很重要的问题,除了简单加锁外,还有乐观并发控制,时间戳事务控制法等等,每种方法都有自己的优缺点和使用场景。

可靠性

​ 一个成熟的分布式系统仅仅是”能运行“肯定是不够的(当然在任何软件中都是如此)。我们应当假设一个分布式系统中每台计算机都不是绝对可靠的,每一台都有故障的可能性(这在现实中是完全合理的)。如果有一天某台计算机突然故障导致数据无法被访问,通信也是永远的timeout,如何保证这个系统还能正常工作呢;再比如说在一个选举过程中,有部分系计算故障产生了错误的值,如何保证这个分布式系统的其它正常的计算机能够”纠正“这个错误呢。对于前者,冗余的计算机是一个很好的方案,但是这也会带来新的问题,如何保证这两台计算机的数据能够始终保持同步呢,对于后者也有一个很著名的”拜占庭将军问题“可供读者参考。

小节

​ 这里列举的问题只占一小部分,现实中还会出现诸如网络分块、RPC、时钟同步、一致性等各种各样的问题,可以说设计一个高效可靠的分布式系统绝对不是简单的事情,《分布式系统概念和设计》这本书也只能起到一个抛砖引玉的作用。