本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。
学校教的或书本上写的,仅仅是一个领域的基本概念和皮毛,要想真正领悟,得多实践(多做lab敲代码)、多思考。否则这些概念不过是废纸一张、雁过无痕而已。有机会一定去做一做6.824。
谈及分布式系统,人们第一个想到的可能更多是计算机网络,但实际上,它和操作系统也紧密相关。
因为它也是有层次的,底层靠操作系统支撑,而上层则依赖于计算机网络的协议等得以组织和发展。
需要说明的是,截止目前,我对分布式系统的了解还很表面,所以以下也只是我了解到的概念和我的主观推测,如有错误,还请各位大佬指出哈~
————写在最前面。
背景
多处理机系统分为三种:
- 共享存储器,称为“共享存储器多处理机”(multiprocessor,简称多处理机)
- 共享CPU,简称为“多计算机”
- 所有计算机通过广域网连接,称为“分布式系统”。
本文重点讨论分布式系统。
通过举例理解分布式系统及其特性
- 设想你和你来自世界各地的小伙伴想要同步完成一个工作,你们各自的主机就是一个结节点。
所以,每个节点都是一台完整的计算机,且物理距离不限,只要能通过网络连接上就行。
- 大家都想要通过自己的计算机运行某一套系统,但不同的计算机是不一样的。比如你用Windows11,你的小伙伴用Ubuntu。因此结点本身可以运行不同的操作系统,也有自己的文件系统。
那如何解决冲突问题,使得整体的系统看上去是一致的呢?
这就需要在计算机本机的操作系统之上提供一层抽象,称为“中间件”。
分布式系统展示给用户看的是一个统一的接口和标准,所以从某种意义上说。中间件像是分布式系统的操作系统。
分布式系统的中间件
中间件有四种类型:
- 基于文档
- 基于文件系统
- 基于对象
- 基于协作
基于文档
web是一个由文档构成的巨大的有向图。
当用户在搜索栏键入URL并按下回车时,发生了如下事情:
- 浏览器向DNS询问目标URL的ip地址,DNS响应结果
- 浏览器建立一个到该ip地址端口80的TCP连接
- 服务器发送网址后缀中的文件
- 浏览器显示该文件的所有内容,并获取并显示该页面的所有图像
- 释放TCP连接
类似地,基于文档的中间件也是希望使得分布式系统看起来像一个巨大的、超链接的集合。
基于文件系统的中间件
有如下三个方面需要考虑:
传输模式
- 上传/下载模式
需要访问系统上的文件时,若本地没有该文件就下载下来,若需要修改,改好了再传上去。
- 远程访问模式
文件就是放在服务器上,是通过在本地远程访问服务器,远程操作文件。
(我说说我的体会和理解,不一定准确哈:
现在的分布式系统应该是两种模式并存的,不同的功能用不同的模式。
对于工作集群的结点来说,结点本身就存放着数据,它本身就是文件系统的一部分,它在本地肯定是存有文件的,那它的访问模式应该就是上传/下载;同时,对于某些结点或者说纯用户,远程访问并操作就已经足以完成任务了。所以具体要看业务需求。
想判断某个功能采用的是哪种模式,我个人认为有个简单的方法:
如果突然断网,还能成功保存的就是先在本地改好之后再传上去的;如果改不了,就是必须时刻同步、断开了连接就不得的)
目录问题
关于不同用户看见的文件目录视图是否应该相同的问题,我想用自己的经历谈谈看法。
我租了一个轻量应用服务器,当我在网页上用webshell登陆的时候,默认就是在lighthouse下的,当我在电脑本地ssh登录上去的时候,默认是以我服务器的Linux版本命名的目录下;但是当我申请root权限的时候,我能看到根目录下有这两个名字的文件夹。
所以,现在的分布式系统应该也是如此,如果你的权限不高,那应该只能看见自己的那部分;但是如果能够再往上一级翻翻,有了根目录的前缀,如/server/path,你就能看到文件分门别类地放好。
不过确实也存在在所有结点看来都相同的文件目录视图,之前好像在课程中接触过,说是系统会自动根据结点资源情况分配文件存储。文件存储的物理位置改变了,但是在分布式系统层面看到的依然是一样的(或者相反)。
因为分布式系统本身也无需知道物理机的确切位置,资源分配任由系统调度,只需要保证能提供服务即可。
语义问题————session semantic
问题背景
在多用户同时修改同一个文件时,该如何保证数据一致性呢?(比如在线协作文档)
解决方法
将文件共享的语义修改为:某进程正在修改文件时,修改只对其可见;修改完成并关闭文件后,修改才对其他进程可见。(我觉得诸如在线协作文档中 关闭文件 并不是我们用户感知到的关闭文件,而是类似于间隔xx时间没有再输入之类,因为很多时候我在输入的时候能看到别人同步输入的过程和结果,这显然不是在我关闭文档再重新打开后才出现的)
这就引入了 会话语义的概念。
处理会话语义中的矛盾
- 如果两个客户机同时修改并关闭同一个文件,系统将会随机选择一个作为先关闭者处理。
- 使用上传/下载模式访问文件期间对其加锁。
基于对象
- 概念:将计算机上的事物不再看作文件,而是看作对象。客户机与服务器之间通过网络以及其上的IIOP协议(Internet Inter Object Request Broker protocol )传输数据。
- 缺点:每个CORBA对象(Common object request broker architecture)只存在于一个服务器上,如果在很大范围内都被频繁使用,性能将会很差。
基于协作
有一个叫Linda的系统,论文发表于1986年前后,是和数据库设计相关的,但相关思想启发了分布式系统设计。论文链接如下:
LINDA:a system for loosely integrated databases
看了原论文,我认为它的核心思想在于以下三点:
发布/订阅模型是受其思想影响的基于协作的代表模型之一。
- 发布:生产者将信息作为 元组 在网络上广播。
- 订阅:对元组中的特定信息感兴趣的进程可以通过一个元组守护进程 订阅 信息。
- 传播:每个局域网中有一台机器用作信息路由器,搜集所有发布的元组并转送至其他局域网。
- 特点:完全将生产者和消费者隔离开来。