分布式系统,程序语言,算法设计

分布式系统是什么

在技术领域中,分布式系统越来越成为绕不过去的一个名词。原因在于,这个时代的数据尺度与单机存储、处理能力的不匹配。于是有两条路子:机器大型化和机器互联。前者成本高昂且不灵活,于是后者越来越受青睐。根据代价守恒定律,代价不会凭空消失,硬件成本降下来了,软件设计成本便会提升。而分布式系统理论,则是帮我们降低这个软件成本的钥匙。

是什么

分布式系统奠基者 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](分布式系统又称分布式计算)给的定义:

  1. There are several autonomous computational entities ( computers or nodes ), each of which has its own local memory.
  2. The entities communicate with each other by message passing.

这里面涉及到了计算机系统中最重的几种资源:计算(computational),存储(memory),以及沟通他们的网络(network)。

总结下,我们可以从另一个角度来对分布式系统进行描述:

对外,分布式系统表现为一个整体,基于总体的存储和计算能力,提供特定功能。

对内,分布式系统表现为一组个体,基于网络消息进行通信,分工合作。

而分布式系统的设计目标是,最大化整体资源利用率的同时,处理局部错误、保持对外可用性。

作者:木鸟杂记 https://www.qtmuniao.com/2021/10/10/what-is-distributed-system, 转载请注明出处

有什么特点

在构建分布式系统时,在逻辑上要注意以下这些方面:

  1. 可扩展性:可扩展性是对分布式系统最本质的要求,即系统设计允许我们只通过增加机器来应对不断增长的外部需求。
  2. 容错性\可用性:这是可扩展性所带来的一个副作用,即在系统规模不断变大之后,单个机器故障便会成为常态。系统需要自动处理这些故障,对外保持可用性。
  3. 并发性:由于没有全局时钟进行协调,分散的机器天然处在“平行宇宙”中。系统需要引导这些并发变为协作,以拆解并执行集群任务。
  4. 异构性(对内):系统需要处理进群内部不同硬件、不同操作系统、不同中间件的差异性,并且能够容纳新的异构组件加入系统。
  5. 透明性(对外):对外屏蔽系统复杂性,提供逻辑上的单一性。

有几种类型

在组织分布式系统时,在物理上可以有以下几种类型:

  1. 主从架构(master-workers:有一个负责指挥的机器,其他机器负责干活,如 Hadoop。好处是设计和实现相对容易,坏处是单点瓶颈和故障。
  2. 点对点架构(peer-to-peer):所有机器逻辑等价。如亚马逊 Dynamo,好处是没有单点故障,坏处是机器协调不好做、一致性也不好保证。不过,如果系统是无状态的,则这种架构很合适。
  3. 多层架构(multi-tier):这是一种复合架构,实际中也最常用,比如今年来常说存储计算分离。每一层可以根据不同特点(IO 密集型、计算密集型)进行设计,甚至可以复用现有组件(云原生)。

有哪些优劣

再次明确,分布式系统是由于单机能力不匹配数据尺度的一种无奈之举。因此,在做系统设计时,优先考虑单机系统。毕竟,分布式系统的复杂度是指数上升的。

现在来归纳下分布系统的优缺点。

优点

高可用、高吞吐、高可扩展性

  1. 无限扩展:只要设计的好,可以通过线性的增加机器资源来应对不断增长的需求。
  2. 低延迟:多地部署,将用户请求按地理路由到最近机房处理。
  3. 高可用容错:一部分机器坏掉,仍可以正常对外提供服务。

缺点

最大的问题是复杂性。

  1. 数据的一致性。考虑到大量的机器故障:宕机、重启、关机,数据可能丢失、陈旧、出错,如何让系统容纳这些问题,对外保证数据的正确性,需要相当复杂的设计。
  2. 网络和通信故障。网络的不可靠,消息可能丢失、早到、迟到、Hang 住,这给机器间的协调带来了极大的复杂度。像 TCP 等网络基础协议,能解决部分问题,但更多的需要系统层面自己处理。更不用说,开放式网络上可能存在的消息伪造。
  3. 管理复杂度。机器数量到达一定数量级时,如何对他们进行有效监控、收集日志、负载均衡,都是很大挑战。
  4. 延迟。网络通信延迟要比机器内通信高出几个数量级,而组件越多、网络跳数越多,延迟便会更高,这些最终都会作用于系统对外服务质量上。

参考

  1. 维基百科 Leslie Lamport:https://en.wikipedia.org/wiki/Leslie_Lamport
  2. Leslie Lamport Time, Clocks, and the Ordering of Events in a Distributed System https://lamport.azurewebsites.net/pubs/time-clocks.pdf
  3. 维基百科,分布式计算:https://en.wikipedia.org/wiki/Distributed_computing
  4. confluent 分布式系统完全指南:https://www.confluent.io/learn/distributed-systems/
  5. splunk 什么是分布式系统:https://www.splunk.com/en_us/data-insider/what-are-distributed-systems.html

我是青藤木鸟,一个喜欢摄影的分布式系统程序员,欢迎关注我的公众号:“木鸟杂记”。

wx-distributed-system-muniao-s.jpg