在技术领域中,分布式系统越来越成为绕不过去的一个名词。原因在于,这个时代的数据尺度与单机存储、处理能力的不匹配。于是有两条路子:机器大型化和机器互联。前者成本高昂且不灵活,于是后者越来越受青睐。根据代价守恒定律,代价不会凭空消失,硬件成本降下来了,软件设计成本便会提升。而分布式系统理论,则是帮我们降低这个软件成本的钥匙。
是什么
分布式系统奠基者 Leslie Lamport [1] 在其最重要的论文之一 ”Time, Clocks, and the Ordering of Events in a Distributed System“ [2] 中提到:
A system is distributed if the message transmission delay is not negligible compared to the time between events in a single process.
Lamport 是用类似相对论的思想来阐释这个问题。我们考虑两个时间尺度:进程间消息传递延迟和进程内事件间隔,如果前者相对后者不可忽略,则这组进程就是一个分布式系统。
理解这个定义,需要理解几个重要的概念(形式化的定义总是这样,摊手):进程(process)、消息(message)和事件(event)。为了避免套娃,这里不做过多展开,仅给出一个形象的理解:进程就是一个负责干活的劳工,其干的活可以分解为多个步骤,每个步骤就是一个事件,消息便是劳工交流的方式。
这也印证了维基百科中 distributed computing [3](分布式系统又称分布式计算)给的定义:
- There are several autonomous computational entities ( computers or nodes ), each of which has its own local memory.
- The entities communicate with each other by message passing.
这里面涉及到了计算机系统中最重的几种资源:计算(computational),存储(memory),以及沟通他们的网络(network)。
总结下,我们可以从另一个角度来对分布式系统进行描述:
对外,分布式系统表现为一个整体,基于总体的存储和计算能力,提供特定功能。
对内,分布式系统表现为一组个体,基于网络消息进行通信,分工合作。
而分布式系统的设计目标是,最大化整体资源利用率的同时,处理局部错误、保持对外可用性。
作者:木鸟杂记 https://www.qtmuniao.com/2021/10/10/what-is-distributed-system, 转载请注明出处
有什么特点
在构建分布式系统时,在逻辑上要注意以下这些方面:
- 可扩展性:可扩展性是对分布式系统最本质的要求,即系统设计允许我们只通过增加机器来应对不断增长的外部需求。
- 容错性\可用性:这是可扩展性所带来的一个副作用,即在系统规模不断变大之后,单个机器故障便会成为常态。系统需要自动处理这些故障,对外保持可用性。
- 并发性:由于没有全局时钟进行协调,分散的机器天然处在“平行宇宙”中。系统需要引导这些并发变为协作,以拆解并执行集群任务。
- 异构性(对内):系统需要处理进群内部不同硬件、不同操作系统、不同中间件的差异性,并且能够容纳新的异构组件加入系统。
- 透明性(对外):对外屏蔽系统复杂性,提供逻辑上的单一性。
有几种类型
在组织分布式系统时,在物理上可以有以下几种类型:
- 主从架构(master-workers):有一个负责指挥的机器,其他机器负责干活,如 Hadoop。好处是设计和实现相对容易,坏处是单点瓶颈和故障。
- 点对点架构(peer-to-peer):所有机器逻辑等价。如亚马逊 Dynamo,好处是没有单点故障,坏处是机器协调不好做、一致性也不好保证。不过,如果系统是无状态的,则这种架构很合适。
- 多层架构(multi-tier):这是一种复合架构,实际中也最常用,比如今年来常说存储计算分离。每一层可以根据不同特点(IO 密集型、计算密集型)进行设计,甚至可以复用现有组件(云原生)。
有哪些优劣
再次明确,分布式系统是由于单机能力不匹配数据尺度的一种无奈之举。因此,在做系统设计时,优先考虑单机系统。毕竟,分布式系统的复杂度是指数上升的。
现在来归纳下分布系统的优缺点。
优点
高可用、高吞吐、高可扩展性
- 无限扩展:只要设计的好,可以通过线性的增加机器资源来应对不断增长的需求。
- 低延迟:多地部署,将用户请求按地理路由到最近机房处理。
- 高可用、容错:一部分机器坏掉,仍可以正常对外提供服务。
缺点
最大的问题是复杂性。
- 数据的一致性。考虑到大量的机器故障:宕机、重启、关机,数据可能丢失、陈旧、出错,如何让系统容纳这些问题,对外保证数据的正确性,需要相当复杂的设计。
- 网络和通信故障。网络的不可靠,消息可能丢失、早到、迟到、Hang 住,这给机器间的协调带来了极大的复杂度。像 TCP 等网络基础协议,能解决部分问题,但更多的需要系统层面自己处理。更不用说,开放式网络上可能存在的消息伪造。
- 管理复杂度。机器数量到达一定数量级时,如何对他们进行有效监控、收集日志、负载均衡,都是很大挑战。
- 延迟。网络通信延迟要比机器内通信高出几个数量级,而组件越多、网络跳数越多,延迟便会更高,这些最终都会作用于系统对外服务质量上。
参考
- 维基百科 Leslie Lamport:https://en.wikipedia.org/wiki/Leslie_Lamport
- Leslie Lamport Time, Clocks, and the Ordering of Events in a Distributed System https://lamport.azurewebsites.net/pubs/time-clocks.pdf
- 维基百科,分布式计算:https://en.wikipedia.org/wiki/Distributed_computing
- confluent 分布式系统完全指南:https://www.confluent.io/learn/distributed-systems/
- splunk 什么是分布式系统:https://www.splunk.com/en_us/data-insider/what-are-distributed-systems.html
我是青藤木鸟,一个喜欢摄影的分布式系统程序员,欢迎关注我的公众号:“木鸟杂记”。