对称式多处理器(Symmetric Multi-Processor, SMP)架构指的是一台计算机汇集了多个处理器(CPU),各CPU之间共享内存、子系统以及总线结构。在这种结构中,一台服务器有多个处理器运行操作系统的单一副本,并且共享内存以及计算机的其他资源。系统将任务队列对称地分配给多个CPU,从而极大地提高了系统的数据处理能力。如图2.1所示,在对称式多处理器架构中,两个或多个对等的处理器可以直接共享内存,任何处理器都可以完全对等地处理应用程序,每个处理器可以独立进行任务调度。
图2.1 对称式多处理器架构
对称式多处理器中,每个CPU访问主存储的效率均等。与之对应的是NUMA(Non-Uniform Memory Access,非均匀存储器访问) [1] ,指的是CPU访问特定内存的速度远超其他区域的内存。在这种情况下,CPU和特定内存区域绑定或优先访问这部分内存,从而可以大大地提高整体性能。
对于通用的应用程序开发,SMP架构是使用最为频繁的。数据库软件厂商若采用多线程基于SMP架构写代码,需要考虑的内容远远超过单内核服务器的考量范围。现在有各种各样新兴的编程语言,比如Go语言,天生支持SMP架构,对一些特定的数据结构能够并行执行。但对于C++或者Java,使用临界区互斥量对共享变量进行保护,在SMP架构里比单核服务器复杂很多。
并行计算(Parallel Computing)是一种同时进行若干计算任务的计算方法 [2] ,其原理如图2.2所示,大问题通常会分解成可以并行解决的小问题。它将传统串行计算的子任务及一些不需要前后关联的部分并排放到一起,通过一台服务器的多个CPU或多台服务器各自的CPU分别同时进行处理,最后对处理结果用某种方式进行汇总。
那么如何拆分这些子任务,如何将繁多的子任务的前后依赖关系分析清楚,通过什么方式编排和调度这些任务,以及如何将这些任务的结果进行有效汇总呢?这是分布式计算领域最为核心、关键的部分,后续章节将详细讲解。
图2.2 并行计算示意图
并行计算主要包括以下两种方式。
1.集群计算
集群计算(Cluster Computing)指的是一组相关联的计算机协同工作,如图2.3所示,集群计算是最传统的并行计算机制,很多超级计算机都以这种体系进行搭建。集群计算大多以共享内存的方式工作,服务器之间通过高速网络连接和通信。
这种机制将SMP架构扩展到多台服务器中,服务器之间通过RDMA(Remote Direct Memory Access,远程直接存储器访问)从一台服务器直接高速访问另一台服务器的内存,所有的机器看起来完全对等。
图2.3 集群计算
从本质上说,这种架构只能看作SMP架构的升级版,远远达不到本章所讲的分布式架构标准,毕竟RDMA的带宽和服务器扩展数量非常有限,不可能在几十台甚至上百台机器构建的通用服务器集群中运行。
2.网格计算
网格计算(Grid Computing)通过利用大量异构计算机(通常为台式机)的未用资源(CPU周期和磁盘存储),将其作为嵌入在分布式电信基础设施中的一个虚拟的计算机集群,为解决大规模的计算问题提供模型。网格计算的焦点在于支持跨管理域计算的能力,这是它与传统的计算机集群或传统的分布式计算的不同之处 [3] 。
如图2.4所示,与集群计算不同,网格计算强调的是计算资源之间的跨网络域,且服务器之间几乎不可能互相连接。
图2.4 网格计算
举个简单的例子,有一些学术单位会对外征集计算资源,将家用计算机冗余的CPU周期用于帮助学术单位进行科学计算就是一种网格计算。客户端通过小程序的后台运行,与学术单位的一个中控节点连接,当计算机休眠后会在后台启动,从中控节点下载任务进行计算,最后将结果返回给中控节点,继而下载另一个任务。
网格计算主要针对广域网环境,是需要大量计算资源进行协同工作的一种体系,这与当今的区块链有异曲同工之妙,在后续章节中将会具体介绍区块链与分布式数据库的联系。
可以看到,无论是集群计算还是网格计算,都是非常古老的体系。集群计算依赖共享内存,规模不可能无限扩大。而网格计算缺乏计算节点之间的协作能力,过于依赖中控节点的调度,很难形成真正实用的商业解决方案。因此,近些年分布式计算开始被提上日程。分布式系统是一组计算机通过网络相互连接传递消息与通信后,协调它们之间的行为而形成的系统。组件之间彼此进行交互以实现一个共同目标,把需要进行大量计算的工程数据分割成小块,由多台计算机分别计算,上传运算结果后将结果合并,从而得出相应的数据结论 [4] 。可以看到,分布式计算的核心与并行系统和网格计算的区别在于组件之间彼此交互。
如图2.5所示,图2.5a和图2.5b是分布式系统,组件之间涉及大量的依赖关系和彼此交互的逻辑,而图2.5c则是一个标准的并行系统,除了内存总线以外,处理节点各自独立,对等且无交互。当前的SOA(面向服务的架构)、微服务等架构之所以被称为分布式系统,就是因为模块之间的交互是形如图2.5a和图2.5b这样的形式。
图2.5 分布式系统和并行系统
云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给计算机各种终端和其他设备,使用服务商提供的计算机作为计算资源。
如图2.6所示,当构建一个应用程序的时候,将逻辑工作分布至其他组件中,会大幅提升运维的复杂度。因此,为了有效支撑分布式体系,业界也开始有了云服务。最开始的时候,云服务在某种程度上就是服务器虚拟机租赁,最早的AWS也只有EC2将虚拟机资源分享到网络供大家租用。此后在虚拟机上开始产生各种各样的计算、存储、通信、管理、网络等组件,这些组件构成了PaaS层,也就是平台层。有了平台层,各种分布式框架就如同雨后春笋一样纷纷涌现,让用户可以非常容易地编写用户逻辑,把逻辑嵌入各自的PaaS框架中,让系统管理员比较容易管理。现在业界流行的框架叫作K8S,它就是这样一种服务编织框架。
图2.6 云计算
除了分布式技术之外,当前业界还有另一种完全不同但被很多人混淆的技术——去中心化技术。最典型的去中心化应用就是区块链 [5] 。区块链体系在某种程度上和过去的网格计算有些类似,它们的设计理念都是基于完全不可靠的终端设备,在网络层面没有切实保障的广域网上进行计算。
如图2.7所示,在过去的网格技术中,为了保证每个任务单元都能被可靠地完成,中控节点需要在多个终端设备里进行同样的计算,并对结果集进行比对。而区块链技术中则是参与计算的所有节点进行同样任务的计算,并通过数字签名和链的机制对结果进行比对。
图2.7 App与DApp
虽然去中心化技术不只有区块链技术,但是大多数情况下,大家谈到去中心化应用(DApp),指的往往是类似以太坊或者EOS这些区块链体系中的应用程序。