通过了解分布式系统常见的物理模型、架构模型、故障模型、交互模型和安全模型,我们应该能够对分布式系统设计有比较全面的认识和入手点。
物理模型
系统的物理模型是系统的底层硬件的物理表示,它描述了系统的物理组成以及这些组成的互动。
其包括节点、链路、网络拓扑、通信协议和中间件。它们的概念描述如下:
-
节点:系统中具有数据处理能力和通信能力的终端设备。它可以是服务器主机、客户端主机。
-
链路:系统中节点通信的频道。它可以是电缆、光纤或者无线电信号。有一对一、多播、共享三个类型。
-
网络拓扑:系统中节点和链路的布局。它可以是总线型、树形、星形或者杂合等。
-
通信协议:系统中节点通信的协议。其就是计算机网络通信协议,五层模型。
-
中间件:系统中运行于节点上的软件。它被用于应用程序与其它节点通信,从而完成分布式任务。
架构模型
系统的架构模型是系统的整体设计和结构,它描述了系统中的不同组成以及这些组成的互动和不同组成提供的功能。以下列出常见的架构模型:
-
客户端-服务器模型:中心化模型。客户端发出请求,服务器响应并发出回复,是一个请求-响应过程。常见的实例包括DBMS Server,WebServer。
-
P2P模型:去中心化模型。节点之间彼此直接通信。常见的实例包括BitTorrent。
-
微服务模型:系统中的不同模块被分为不同的应用程序,这些应用一般部署在不同的服务器上,模块间通过RPC或者HTTP来通信。不同的应用可以独立地扩展而不影响整体的系统服务。常见的实例包括微服务架构电商系统,由广告、推送、交易等模块共同组成。
-
分层模型:系统被划分为不同的层次,每个层次通过相邻层次提供的接口来与其通信,这让每个层次抽离开了相邻层次的复杂实现。常见的实例包括Apache Pulsar的服务层和存储层分离。
故障模型
系统的故障模型描述了系统中出现的故障。一般来说分布式系统的故障模型分为以下六类,解决的难度逐渐增大,系统设计者应该选择一个故障模型作为系统的目标,目标之外的模型是该系统不能解决的。
-
故障-停止模型(fail-stop model):出故障的节点停止工作,状态依旧保留,能够对请求做出响应。设想一下,客户端向服务器发出请求,但服务器需要从远程MySQL服务器请求数据,但数据请求失败,此时就是fail-stop情况。这种情况下服务器并不会crash。该模型并不常见,容易解决。
-
崩溃故障模型(crash failure) model:在该模型中,节点A向节点B发出请求,节点A没有收到B的回复,那么B就认为是崩溃了。通过加入新节点就能解决该问题。
-
省略故障模型(omission failure model):在该模型中,预定一个时间T,如果消息发出后,在T之前没有收到消息,那么就认为该消息在T后永远不会到达。事实上,由于复杂的网络情况这个T值几乎是不可能选准的。
-
性能故障模型(Performance failure model):在该模型中,消息可能在预定时间T之后相当长一段时间到达。
-
可检测身份的拜占庭故障模型(Authentication-detectable byzantine failure model):在该模型中,消息可能被篡改,但问题可以被系统检测到。通过非对称性加密、错误检测策略来解决。
-
拜占庭故障模型(Byzantine failure model):其他的拜占庭问题。
图片引用自:https://medium.com/codechain/byzantine-failure-why-blockchain-development-is-difficult-1d2da8de9f03
交互模型
系统的交互模型描述了系统不同组件之间交互的方式。其包括消息传递和发布与订阅两种方式。
-
消息传递:调用行为的一个技术。调用方发出消息到另一个进程,另外的进程选择并执行恰当的代码。可以是异步的也可以是同步的。
-
发布与订阅:订阅者通过订阅一个topic,然后被动或主动的从这个topic中接受新的消息。发布者通过将message发布到一个topic来通知其他订阅者。
安全模型
系统可能会遇到非法访问、数据泄露、恶意攻击等问题。一般的系统安全模型包括数据一致性、身份验证、加密三个方面。
参考文章
Byzantine Failure — Why Blockchain Development is Difficult | by Seung Woo Kim | CodeChain | Medium :一篇了解六大故障模型的文章。
Distributed Computing System Models - GeeksforGeeks :一篇给出分布式系统模型的概要文章,当作导航使用,每个部分的具体细节按需填补。