多个节点,一个分布式系统
人们常说,没有人(或者说,女人,或者说个人)是一座孤岛;如今,我们真的可以把“计算机”也加到这个名单里。我们周围都是相互通信的机器、计算机和数据库。事实上,我们每天交互(以及构建!)的大多数应用程序和服务,实际上都是一堆相互通信的计算元素,即使我们可能没有意识到这一点。
这些系统及其工作原理的研究属于分布式计算领域,而分布式计算的核心正是对分布式系统的研究。从某种程度上来说,分布式系统是计算机科学领域的延续或延伸——它通常涉及问题解决、将事物分解为离散任务,以及研究如何处理、存储和处理数据。
但在其他方面,分布式系统与计算机科学完全不同。分布式计算几乎要求我们抛开对机器工作原理的假设。当处理单台计算机时,我们甚至可能会发现事情还算简单。但如果涉及多台计算机呢?
嗯,那完全是另外一个故事了。
在出现许多之前,有一个
为了理解分布式系统究竟由什么构成,我们必须首先理解什么不是分布式系统。需要明确的是,在定义分布式系统的“对立面”究竟是什么方面,确实存在一些争议。理论上,我们可以用不同的方式定义分布式系统的对立面,因为分布式系统的定义在某种程度上取决于系统的实际组件。我们稍后会对此进行更详细的阐述。
我们可以将非分布式系统视为“单一”系统。单一系统是指不与其他系统通信且独立运行的系统,它不是分布式系统。

我们计算机上的单个进程就是一个独立运行的单个系统。如果一个进程不与其他进程通信,那么它本质上就不属于更大的系统。我们也可以把我们的机器本身,与互联网断开连接,看作一个“单个”系统——尽管有些研究(例如这篇 2009 年的论文)并不这么认为。
“ distribute”(分布)一词的意思是将某物分散、散布或散布到某个空间。如果我们思考一下这个词的定义以及单个系统的工作原理,那么很明显,单个系统本身并不是分布式系统。因为只有一台机器在独立运行,所以这台机器显然不可能被分散到各处!
那么,分布式系统究竟是什么呢?如果我们思考一下现实世界中机器是如何交互的,我们就会意识到,实际上大多数计算机都存在于分布式系统中。计算机很少只在自身环境中使用;我们几乎总是用它们与某种应用程序或服务进行交互。
如果您曾经在线玩过多人游戏、预订过航班、在推特上发布过猫咪动图、观看过 Netflix 节目或在亚马逊上购买过连体衣,那么您就依赖分布式系统来完成这些事情。
确实,你每天都可能与最大的分布式系统打交道:互联网!但分布式系统并非都是大规模的。事实上,它们的规模之大甚至不是它们分布式的真正原因。

分布式系统无非就是多个实体以某种方式相互通信,同时执行各自的操作。这样的系统可以是简单的东西,比如智能传感器,或者家里的一个通过 WiFi 网络捕获和发送数据的无线插座,甚至只是一个可以连接到笔记本电脑的无线键盘或鼠标。
只要系统中的所有进程都是自治的,或者能够执行自己的操作,同时还能够与系统中的其他进程通信,我们就可以将该系统归类为分布式的。
粘在一起的节点
现在我们对分布式系统有了更多的了解,让我们仔细看看它的主要角色——即系统内的“实体”!
你可能注意到,我把分布式系统的组件称为“计算机”、“进程”,甚至简称为“机器”。我们用来描述分布式系统各个组件的确切术语,实际上取决于系统本身的样子以及它是什么类型。如果系统是由一堆分布式服务器组成的,那么这些组件也许可以被称为“服务器”;如果系统涉及相互通信的进程,那么这些实体也许就叫“进程”。
为了解决术语上的差异,我们实际上可以使用一个完全不同的、更通用的术语。我们可以将分布式系统中的各个实体称为系统的节点。

如果“节点”这个术语让你感觉很熟悉(并且让你想起了图论),那么你的直觉是正确的——这里确实存在联系!如果我们将分布式系统视为计算元素的网络(它们确实是计算元素),那么我们可以将该网络可视化为由互连节点组成的图。
我们知道分布式系统可以大规模或小规模运行,因此我们也可以推断,实际节点本身的性质也可能存在差异。节点可以是硬件设备(例如传感器),也可以是软件进程(客户端或服务器)。节点本身也不必位于同一位置——因此系统才具有“分布式”的特征——并且很可能在物理上相距很远。
了解节点的新方法
尽管分布式系统中的节点与图中的节点对应关系非常相似,但分布式系统中节点的某些方面仍会使事情变得有些棘手。我们在处理单个系统时会做出一些假设,但这些假设在分布式系统中被证明是不正确的。而当谈到分布式计算时,我们遇到的几乎所有障碍都与一件事有关:节点之间的通信。

由于分布式系统中的节点在定义上是自治的,因此它们能够运行自己的操作。节点内部发生的操作(由节点自身运行)无需依赖外部信息。换句话说,节点可以运行自己的操作,而无需与分布式系统中的其他节点通信。这意味着节点可以运行自己的操作,无需任何人的帮助,并且可以快速运行。
节点内的操作很快;但是,节点之间的通信却并非如此。
众所周知,一个系统的节点可能位于不同的地方,并且依赖于分布式系统及其网络进行所有通信,但通信则完全不同。虽然节点内部执行任务可能很快,但两个节点之间的通信却不一定如此。事实上,两个节点之间的通信通常非常缓慢(更不用说不可靠了!),这恰恰是分布式计算中最大的问题之一。

单个节点内的操作不仅快速执行,而且按顺序执行。乍一看,这似乎是显而易见的事实,因为事件当然是按顺序发生的,对吧?然而,对于分布式系统来说,答案是……并非总是如此。
即使节点内的操作是按顺序进行的,但当分布式系统中多个节点必须协同工作时,情况就会变得有些混乱。一旦我们从单系统/单节点迁移到分布式系统/多节点,跨一组节点的操作就有可能以错误的顺序呈现。
节点内操作有序的原因部分在于系统内的每个节点都按照自己的时钟运行。

如果我们思考一下分布式系统中可能构成节点的不同事物——传感器、进程、服务器或数据库——这个事实就显而易见了。但同样,我们或许能够猜想这在分布式系统中可能会带来哪些问题:如果系统中两个独立节点的时钟不完全匹配会怎样?这是分布式计算的另一个难题(我们将在本系列中讨论!)。
处理单个节点时,我们所熟悉和喜爱的一切,一旦加入多个节点,就开始变得陌生,不再那么讨喜。但这正是学习新事物的乐趣所在——比如分布式系统!我们必须改变我们的视角,以及我们对系统的思考方式,了解它们如何作为一个整体协同工作,以及使它们有效运作的各个部分。
如果你问我,这似乎是开始全新系列的好方法。😊
资源
关于分布式系统,有很多东西需要学习,而且有很多地方可以入手!以下是一些入门资源,可以帮助你巩固对分布式系统及其组成实体的理解。
- 分布式系统简介,Maarten van Steen 和 Andrew S. Tanenbaum
- 从门外汉到超人:分布式系统简介,Median Rawashdeh
- 分布式系统(DS)简介,Frank Eliassen 教授
文章来源:https://dev.to/vaidehijoshi/many-nodes-one-distributed-system-kl9