对于分布式系统,现阶段有着许多的定义,对于本书而言,我们把它定义为有多个软件组件构成的系统,它们独立的并发的行的,并且跨越多个物理机。有很多理由以分布式的方式去设计一个系统。一个分布式系统有能力通过运行多个组件来发掘多个处理器的能力,也许是并发复制。因为某种策略的原因,一个系统可能是分布在不同的地方,比如在多个地方的服务器参与到单个应用中。

分离协同组件有个很多重要的优势。第一,它允许组件被独立的设计和实现。比如一个独立的组件能多个应用共享。第二,它使得一个系统架构师在协同部分的论证更加简单,当然这不是重点(至少在本书不是)。最后,它能使得一个系统能够将允许和管理协同组件分开。分开运行一个这样的组件能够简化产品中解决问题的任务。

软件组件运行在操作系统的进程中,大部分情况下是以多线程执行的。因此,Zookeeper服务器和客户端都是经常。通常,单个物理服务器(无论是单个机器还是在虚拟环境中的操作系统)运行着单个应用进程,虽然进程可能执行多线程来发掘现代处理器的多核能力。

分布式系统中进程有两大类通信方式:他们能直接通过网络交换消息,或者读写某个共享存储。Zookeeper使用共享存储的方式让应用实现协同和同步原语。但是共享存储自身需要进程间的网络通信和存储。强调网络通信是非常重要的,因为它是设计分布式系统诸多问题的其中一个源头。

在现实的系统中,需要十分注意一下几个问题:

消息延迟

消息随时都会发生延迟;比如,由于网络拥塞的原因。这样随时都会发生延迟的情况会导致不可预期的结果。比如,根据时钟来说,进程P可能在另外一进程Q发送消息请发送一条消息,但是进程Q的消息可能会先传递。

处理器速度

操作系统调度和超负荷运行可能导致消息处理随时会出现延迟。当一个进程发送一条消息给另外一个时,这条消息的总体延迟粗略的等于发送者处理时间加上传输的时间,再加上接受者处理的时间。如果发送和接受者需要被调度来进行处理,那么消息的延迟会更高。

时钟漂移

系统中使用时间的概念并不少见,比如决定什么时间在系统中发生什么事件。处理时时钟是不可靠的,和其他的处理器相比它们能随意的发生漂移。自然而然的,依赖于处理器时钟可能导致不正确的决定。

这些问题中一个重要推论的就是非常难判断一个进程实际上是否已经奔溃还是其中任意一个因素引入了延迟。没有从一个进程中接受到信息可能因为这它已经奔溃了,可能是网络任意的延迟了最后一条消息,可能是其他的什么事情引起了延迟,或者处理时钟发什么漂移。这样无法区分原因的系统被称之为异步的。

数据中心通常由大批量的且大部分是统一的硬件组成。但是即使在数据中心,我们还是观察到这样问题对应用的影响,是因为在同一个应用中使用 多代硬件,还有即使在同一批硬件中也有轻微区别,它们对性能造成了很大影响。所有的这些事情使得分布式系统设计者的生活更加复杂了。

Zookeeper被精巧的设计成能更加简单的处理这些问题。Zookeeper不会使得问题消失或者把它们完全对应用屏蔽,但是它能使得问题变得更加的易于处理。Zookeeper实现了对分布式计算问题的解决方案,并把这些实现以一种更加直观的方式打包起来开放给开发者,至少,这是我们一直希望的。