毫无疑问,计算机改变了人类的工作和生活方式,而计算机系统也正在进行一场变革。无论是手机应用,还是智能终端,都离不开背后那个神秘的巨人——分布式系统。正是那些看不见的分布式系统,每天处理着数以亿计的计算,提供可靠而稳定的服务。
本章就揭开分布式系统的神秘面纱。
《分布式系统原理与范型》一书中是这样定义分布式系统的:
“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个系统。”
这里面包含了两个要点:
硬件独立;
软件统一。
什么是硬件独立?所谓硬件独立,是指机器本身是独立的。一个大型的分布式系统,由若干计算机组成系统的基础设施。而软件统一,是指对于用户来说,用户就像跟单个系统打交道。就好比我们每天上网看视频,视频网站对我们来说就是一个系统软件,它们背后是如何运作的、部署了几台服务器、每台服务器是干什么的,这些对用户来说是不可见的。用户不关心背后的这些服务器,用户所关心的是,今天能看什么样的节目、视频运行是否流畅、清晰度如何等。
软件统一的另外一个方面是指,分布式系统的扩展和升级都比较容易。分布式系统中的某些节点发生故障,不会影响整体系统的可用性。用户和应用程序交互时,不会察觉哪些部分正在替换或维修,也不会感知新加入的部分。
集中式系统主要部署在HP、IBM、Sun等小型机以上档次的服务器中,把所有的功能都集成到主服务器上(这对服务器的要求很高)。它们的主要特色在于年宕机时间只有几小时,所以又统称为z系列(zero,零)。AS/400主要应用在银行和制造业,还用于Domino,主要的技术包括 TIMI(技术独立机器界面)和单级存储。有了 TIMI,可以实现硬件与软件相互独立。RS/6000比较常见,用于科学计算和事务处理等。这类主机的单机性能一般都很强,带多个终端。终端没有数据处理能力,运算全部在主机上进行。现在的银行系统大部分都是集中式系统。此外,这种系统在大型企业、科研单位、军队和政府等也有应用。
集中式系统主要流行于20世纪。现在还在使用集中式系统的很大一部分原因是沿用原来的软件,而这些软件往往很昂贵。集中式系统的优点是便于维护、操作简单。但这样的系统也有缺陷,不出问题还好,一出问题,就会造成单点故障,所有功能就都不能正常工作了,所谓“一荣俱荣,一损俱损”。由于集中式系统的相关技术只被少数厂商所掌握,个人要对这些系统进行扩展和升级往往比较麻烦,一般的企业级应用很少会用到集中式系统。图1-1是一个典型的集中式系统的示意图。
图1-1 集中式系统示意图
分布式系统恰恰相反。分布式系统通过中间件对现有计算机的硬件能力和相应的软件功能进行重新配置和整合。它是一种多处理器的计算机系统,各处理器通过网络构成统一的系统。系统采用分布式计算结构,即把原来系统内中央处理器处理的任务分散交给相应的处理器,实现不同功能的多个处理器,这些处理器的相互协调,共享系统的外设与软件。这样就加快了系统的处理速度,简化了主机的逻辑结构。它甚至不需要很高的配置,一些“退休”的低配置机器也能被重新纳入分布式系统中,这样无疑降低了硬件成本且易于维护。同时,分布式系统往往由多台主机组成,任何一台主机宕机都不影响整个系统的使用,所以分布式系统的可用性比较高。图1-2是一个典型的分布式系统的示意图。
图1-2 分布式系统示意图
正由于分布式系统的这些优点,使得分布式系统的应用越来越广泛。可以说,这也代表了未来应用的发展趋势。
设计分布式系统的本质就是“合理地将一个系统拆分成多个子系统并部署到不同的机器上”,所以首先要考虑的问题是如何合理地将系统进行拆分。由于拆分后的各个子系统不可能孤立地存在,必然要通过网络进行连接交互,它们之间如何通信变得尤为重要。当然,在通信过程中要识别“敌我”,防止信息在传递过程中被拦截和篡改(这就涉及安全问题了)。分布式系统如果要适应不断增长的业务需求,就需要考虑扩展性。分布式系统还必须保证可靠性和数据的一致性。
概括起来,在设计分布式系统时,应考虑以下问题:
如何将系统拆分为子系统?
如何规划子系统间的通信?
如何考虑通信过程中的安全?
如何让子系统可以扩展?
如何保证子系统的可靠性?
如何实现数据的一致性?
本书的大部分内容都将针对分布式系统中常见的问题进行探讨。
分布式系统是难以理解、设计、构建和管理的,它们将比单个机器多数倍的变量引入设计中,使得应用程序的问题根源更难被发现。SLA(Service-Level Agreement,服务水平协议)是衡量停机和/或性能下降的标准。大多数现代应用程序都有一个期望的弹性SLA,通常按“9”的数量增加(如每月99.9%或99.99%可用性)。
设计分布式系统的挑战如下。
异构性: 由于分布式系统基于不同的网络、操作系统、计算机硬件和编程语言构造,必须有一种通用的网络通信协议来屏蔽异构系统之间的差异。一般由中间件来处理这些差异。
缺乏全球时钟: 在程序需要协作时,通过交换消息来协调它们的动作。紧密的协调经常依赖于对程序动作发生时间的共识。但是,实际网络上计算机同步时钟的准确性受到了极大的限制,即没有一个正确时间的全局概念。这是通过网络发送消息作为唯一的通信方式这一事实带来的直接结果。
一致性: 数据被分散或复制到不同的机器上,如何保证各台主机之间的数据的一致性是一个难点。
故障的独立性: 任何计算机都有可能发生故障,且故障不尽相同。故障出现的时间也是相互独立的。一般分布式系统允许出现部分故障而不影响整个系统的正常使用。
并发: 使用分布式系统的目的是更好地共享资源,所以系统中的每个资源都必须被设计成在并发环境中是安全的。
透明性: 分布式系统中任何组件的故障,或者主机的升级、迁移,对于用户来说都是不可见的。
开放性: 分布式系统由不同的程序员来编写不同的组件,组件最终要集成为一个系统,所以组件所发布的接口必须遵守一定的规范且能够被互相理解。
安全性: 加密用于给共享资源提供适当的保护,在网络上传递的所有敏感信息都需要进行加密。拒绝服务攻击仍然是一个有待解决的问题。
可扩展性: 系统要设计成随着业务量的增加而相应地扩展,以提供对应的服务。