什么是分布式系统(通俗易懂的说法)

本文介绍了分布式系统的概念,强调分布式不等同于并行计算,通过简单三步将软件转变为分布式,并探讨了分布式系统的本质及应用场景。
部署运行你感兴趣的模型镜像
作者:林建入
链接:http://www.zhihu.com/question/22764869/answer/56011081
来源:知乎

一、三个步骤完成华丽转身——任意软件变为“分布式”

分布式——一个高大上的名词,是计算机软件设计中人民群众喜闻乐见的“逼格满满”、“不明觉厉”的几个名词之一。但很可惜,这玩意儿一点也不复杂,甚至有些“简单”。不信?你只要遵循下述步骤即可将任何一个软件拆分为“分布式”的:
  1. 将你的整个软件视为一个系统(不管它有多复杂)
  2. 将整个系统分割为一系列的 Process(进程), 每个 Process 完成一定的功能
  3. 将这些 Process 分散到不同的机器上。分散后,选择若干种(没错一种可能不够)通信协议把他们连接起来
蹬蹬蹬蹬~大功告成。哈哈别打我,这真的是很严肃的通用型三步骤大杀器,对付任何软件,是任何软件都可以的。接下来我当然要解释清楚为什么。

二、跳出误区——分布式不等于并行计算

人们常常把分布式系统自然而然的和并行计算联系起来。然而这并不正确。实际上,分布式系统并不一定是并行的,举个简单的例子就能理解——

某软件,功能如下:
  1. 提示用户输入两个数 A 和 B
  2. 在内部,对 A 和 B 执行某数学运算,获得 C
  3. 输出 C
很简单吧?这三个步骤是无法并行的。它们需要被依次执行。但是这个软件依然可以被改为分布式的,方法就是用前面提到的方法,把步骤 2 的计算过程独立为一个 Process 移动到另外一台计算机上完成。

如果我们从整个系统流程的观点来看,并没有什么并行。整个过程都是顺序执行的。只不过执行时出现了“跨设备”的现象而已。可见,分布式本身就只如其字面意思所指,指的仅仅是从结构角度的分散而已。

当然啊,现实世界中,我们更多的时候钟情于分布式,还是因为它与并行之间可以相互配合。例如实现既是分布同时也是并行的系统。

好了,理解这一点之后就不难解释为什么我会说前文提到的三步骤是万用大法了。接下来我们继续讨论分布式本身。

三、拆分+连接是分布式系统的本质

所谓分布式,无非就是”将一个系统拆分成多个子系统并散布到不同设备“的过程而已。

本质上而言,实现一个分布式系统,最核心的部分无非有两点:
  1. 如何拆分——可以有很多方式,核心依据一是业务需求,二是成本限制。这是实践中构建分布式系统时最主要的设计依据。
  2. 如何连接——光把系统拆开成 Process 还不够,关键是拆开后的 Process 之间还要能通信,因此涉及通信协议设计的问题,需要考虑的因素很多,好消息是这部分其实成熟方案很多

四、为什么你要使用分布式?

分布式系统并非灵丹妙药,解决问题的关键还是看你对问题本身的了解。通常我们需要使用分布式的常见理由是:
  • 为了性能扩展——系统负载高,单台机器无法承载,希望通过使用多台机器来提高系统的负载能力
  • 为了增强可靠性——软件不是完美的,网络不是完美的,甚至机器本身也不可能是完美的,随时可能会出错,为了避免故障,需要将业务分散开保留一定的冗余度
在以提供 Service 为主的服务端软件开发过程中常常遇到这些问题。

五、一些分布式方案能解决你的问题,另一些却不能,要学会的其实是选择

笼统的讨论分布式没有太大的意义,就如我刚才所谈的,实际上分布式很容易实现。真正难的地方在于如何选择正确的分布方案。

例如,当你想要建立一个分布式的数据管理系统的时候,你就必须得面对“一致性”问题。如果你对数据一致性要求很高,你就不得不容忍一些缺陷例如规模伸缩困难;而如果你放弃它,你可以轻松伸缩规模,但你必须解决好由此带来的一系列数据不一致导致的问题。(CAP 问题)

于是你会意识到,有许多种分布方案,为了正确解决你的问题,你需要对每一个方案都进行了解,并评估,选择不同的方案有时候区别不大,有时候却会深刻的影响整个系统中其他部分的工作方式,甚至影响用户界面中用户操作时的流程。这是我们学习分布式系统的重点所在。

六、分布式学习入门——基础知识要点

如我前面所讲,分布式入门不难。主要包含如下知识点:
  • Process(进程)。在分布式系统中,进程是基本单元
  • 通信协议。Process 间需要相互配合才能完成工作,因此通信协议是最基本要解决的问题。这部分其实挺复杂,牵涉面光,不过核心还是抓住两方面,一是存在哪些需求,二是各个协议如何满足这些需求
  • 命名法。两个 Process 要通信,必须相互知道对方的名字,名字可以是数字,也可以是结构化的字符串。例如众所周知域名系统就是一种命名方案,但是方案还有很多,各有特点
  • 协作。上面都在谈 Process 之间的通信,可是为什么要通信?因为要协作。协作是个复杂的主题,其中最基本最基本的一个问题就是同步问题。而聊同步问题必然要聊“锁”……知识点就这么展开了
上面几点是最基础的知识。了解了这些其实就算入门了。可是如何进阶呢?那么必然要开始学习下面的问题:
  • 一致性。数据存储时,最基本的问题。其实也是实际设计系统时常常需要反复考虑的问题
  • 容错。冗余是容错的基础,但并不是全部,分布式本身为实现容错提供了一些便利,这也是实际设计系统时常常需要考虑的问题
好了,如果这些你都学的差不多了,那咱们“纸上谈兵”也就告一段落了。接下来进入实战演练。

七、实战演练?其实你已经开发过分布式系统了

你有没有开发过简单的增删改查软件?这类软件通常都需要搭配一个独立的数据库管理系统共同完成功能。实际上,只要你开发过这么简单的软件,那么你就已经开发过分布式系统了。
“什么,基于数据库管理系统开发出来的软件就可以算分布式呀?我做了很多这类软件,怎么我从来没听过这种说法?
真的,我没开玩笑。还记得我们前面提到的吗,什么是分布式?不就是一个大系统拆分成多个小系统分散到不同的设备上吗。回想一下,当你写一个简单的增删改查软件时,只要用到数据库管理系统,是不是具有如下特点:
  • 整个系统中,你写的代码跑在 A 进程里,而数据库管理系统则跑在另外一个进程 B 里
  • A 进程与 B 进程通过某种通信协议连接
  • 既可以使 A 进程与 B 进程运行在同一台机器上,也可以将它们分开运行于不同的机器上,并且系统依然可以照常运行
你看,这不就是分布式系统的特点吗?
“啊,原来如此,可是我印象里一说分布式的话,应该会讲「集群」啊啥的吧,这么简单的也算?”
关于「集群」的问题我们之后会谈到,它也是分布式系统的一个应用,但谈集群的时候,我们谈的往往是更具体的东西。但咱们看问题,需要抓住本质。别看麻雀小,五脏却俱全。

不过,你已经熟悉的东西,我们在这里就不再展开了,我们不妨关注其他一些更有趣的话题。
逃避不一定躲得过,面对不一定最难过

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

### 什么是分布式算法? 分布式算法是一种运行在分布式系统上的算法,用于协调多个独立计算机之间的操作,使得这些计算机能够像一个整体一样工作。在分布式系统中,节点之间通过网络通信,每个节点可能具有不同的状态和数据副本,而分布式算法的目标是确保这些节点能够协同完成任务并达成一致[^1]。 通俗地讲,可以将分布式算法想象为一个团队协作的过程。例如,一个公司要决定是否要启动一个新项目,每个部门都有自己的意见和数据支持。团队成员之间需要通过沟通、投票、同步信息等方式,最终达成一个统一的决策。这个过程就类似于分布式算法在多个节点之间协调和决策的过程。 ### 分布式算法的基本概念 1. **一致性(Consistency)** 一致性指的是多个数据副本之间是否保持相同的状态。例如,在一个分布式数据库中,数据可能在多个节点上都有备份,一致性确保这些备份在更新后保持一致。一致性是分布式系统设计中的核心问题之一[^2]。 2. **共识(Consensus)** 共识是指多个节点就某个决策达成一致的过程。它是实现一致性的方法之一。例如,在选举一个领导者节点时,所有节点需要通过投票等方式达成共识,选出一个统一的领导者[^2]。 3. **容错性(Fault Tolerance)** 分布式系统中,节点可能由于网络问题、硬件故障或软件错误而失效。分布式算法需要具备容错能力,即使某些节点失效,系统仍然能够正常运行并保持一致性。 4. **网络分区(Network Partition)** 网络分区是指由于网络故障,节点之间无法通信的情况。分布式算法需要处理网络分区问题,确保在分区恢复后系统仍然能够保持一致性。 5. **选举机制(Leader Election)** 在某些分布式算法中,如 Raft,会选举一个节点作为领导者,负责协调其他节点的操作。例如,领导者负责接收客户端请求、更新日志并同步到其他节点。 ### 分布式算法的类型 1. **一致性算法(Consensus Algorithms)** 一致性算法用于确保所有节点在状态上达成一致。常见的算法包括 Paxos 和 Raft。Paxos 是最早被广泛认可的一致性算法之一,但因其复杂性而难以实现。Raft 则是一种更易于理解和实现的算法,它通过领导者选举、日志复制和安全性机制来实现一致性[^2]。 2. **分布式事务算法** 分布式事务算法用于确保多个节点上的操作要么全部成功,要么全部失败。两阶段提交(2PC)和三阶段提交(3PC)是典型的分布式事务协议。 3. **分布式协调算法** 这类算法用于协调多个节点之间的操作,例如 ZooKeeper 使用的 ZAB(ZooKeeper Atomic Broadcast)协议,用于维护分布式系统的元数据一致性。 4. **分布式计算算法** 在大数据处理中,分布式计算框架如 MapReduce 和 Spark 使用特定的分布式算法来分配任务、调度资源并处理数据。例如,Shuffle 是 MapReduce 中的关键阶段,涉及数据的分发和聚合,通常需要优化网络传输和排序效率[^3]。 ### 一个简单的分布式一致性算法示例(Raft) 以下是一个简化版的 Raft 算法实现,展示了节点如何通过领导者选举和日志复制达成一致性: ```python class Node: def __init__(self, node_id, peers): self.node_id = node_id self.peers = peers self.current_term = 0 self.voted_for = None self.log = [] self.state = "follower" # 可选状态:follower, candidate, leader self.election_timeout = random.uniform(1.0, 2.0) def start_election(self): self.state = "candidate" self.current_term += 1 self.voted_for = self.node_id votes_received = 1 for peer in self.peers: response = peer.request_vote(self.current_term, self.node_id) if response == "vote_granted": votes_received += 1 if votes_received > len(self.peers) / 2: self.become_leader() def become_leader(self): self.state = "leader" while self.state == "leader": for peer in self.peers: self.send_heartbeat(peer) def append_entries(self, term, leader_id, prev_log_index, prev_log_term, entries, leader_commit): if term < self.current_term: return False self.reset_election_timer() if prev_log_index >= len(self.log) or self.log[prev_log_index].term != prev_log_term: return False self.log = self.log[:prev_log_index + 1] + entries return True ``` 该示例展示了 Raft 的基本流程:节点从 follower 变为 candidate 发起选举,获得多数票后成为 leader,并通过心跳和日志复制保持一致性。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值