17. 分布式系统的核心特征
Last updated
Last updated
分布式系统的核心特征包括可扩展性、可靠性、可用性、效率和可管理性。我们简要概括这些特征。
可扩展性是系统、进程或网络的增长和管理需求增加的能力。任何分布式系统如果可以持续发展以支持增长的工作量,就被认为是可扩展的。
系统可能因为很多原因必须扩展,例如增长的数据规模或增长的工作量,例如事务数量。可扩展的系统可以在没有性能损失的情况下实现扩展。
通常而言,虽然系统被设计成(或被声明成)可扩展的,但是由于管理或环境开销的原因,当系统规模增加时,系统的性能会降低。例如,由于机器之间的距离远,网络速度可能变慢。更一般的情况是,由于任务固有的原子特征或系统设计中的一些缺陷,任务无法成为分布式的。在某些时刻,这样的任务会限制通过分布达到的提速。可扩展的架构可以避免这样的情形,试图将负载平均地分布在所有参与节点上。
水平扩展和垂直扩展:水平扩展表示通过向资源池中增加更多服务器实现扩展,垂直扩展表示通过向已有地服务器增加更多能量(CPU、RAM、存储等)实现扩展。
使用水平扩展,通常更容易通过向资源池中增加更多机器动态扩展。垂直扩展通常受限于单台服务器的容量,超过容量的扩展通常会导致停机和容量上限的增加。
水平扩展的好例子有 Cassandra 和 MongoDB,这两者都提供了水平扩展的简单方式,通过增加更多的机器满足增长的需求。类似地,垂直扩展的一个好例子是 MySQL,MySQL 提供了垂直扩展的简单方式,从较小的机器切换到较大的机器。但是,这个过程通常导致停机。
根据定义,可靠性是系统在给定时间段内宕机的可能性。简单而言,如果一个分布式系统持续发布服务,即使该系统的一个或多个软硬件组件宕机了也能持续发布服务,那么这个分布式系统被认为是可靠的。可靠性表示任何分布式系统的主要特征之一,因为这样的系统中,任何宕机的机器总是可以被另一个正常运行的机器替代,确保请求的任务可以完成。
以大型电子商务店铺(例如 Amazon)为例,主要的需求之一是任何用户业务永远不能因为运行该业务的机器宕机而取消。例如,如果用户在购物车中增加了一个项目,系统不应该丢失该项目。一个可靠的分布式系统通过对软件组件和数据的备份实现这一点。如果包含用户购物车的服务器宕机了,另一个有该购物车备份的服务器应该取代宕机的服务器。
显然,备份会有成本,可靠的系统必须付出这样的成本,通过排除每一个单点故障达到可恢复服务的能力。
根据定义,可用性是系统在给定时间段内可以执行要求的功能的时间。可用性可以通过计算系统、服务或机器可以正常运行的时间的百分比得到。一台可以在一个月内飞行很多小时不停工的航空器可以认为具有高可用性。可用性需要考虑可维护性、修理时间、备件保障度以及其他物流因素。如果一台航空器停工用于维护,则在这段时间内这台航空器被认为是不可用的。
可靠性是考虑现实世界中所有可能发生的情况下的可用性。一台可以在任何可能的天气中飞行的航空器比一台在特定条件下有弱点的航空器更可靠。
可靠的系统一定是可用的,但是可用的系统不一定可靠。换言之,高可靠性意味着高可用性,但是可能使一个不可靠的产品通过最小化修理时间和确保备件在需要的时候总是可以使用的方式达到高可用性。考虑一个例子,一个在线零售商店在开店之后的前两年内有 99.99% 的可用性。然而,系统发布没有经过任何信息安全测试。顾客对这个系统满意,但是他们没有意识到系统不够可靠,对于可能的风险存在弱点。在第三年,系统经理了一系列信息安全事故,事故突然导致很长一段时间内系统的可用性非常低。这导致该系统给顾客带来名誉损失和财务损失。
为了理解如何评估分布式系统的效率,我们假设有一个分布式执行的操作,将一系列项目作为结果发送。效率的两个标准评估方式是响应时间(或延迟)和吞吐量(或带宽),响应时间表示获得第一个项目的延迟时间,吞吐量表示在给定时间单元(例如一秒)内发布的项目数。两个评估方式对应以下单元开销:
不考虑消息大小,由该系统的节点全局发送的消息数。
消息大小,表示数据交换的体量。
分布式数据结构支持的操作(例如在分布式索引中搜索特定关键字)的复杂度可以通过这些开销单元之一的函数衡量。总体而言,使用「消息数量」分析分布式结构的做法过于简单化。该做法忽略了很多方面的影响,包括网络拓扑结构、网络负载以及方差(用于数据处理和发送的软硬件组件的不均匀性)。但是,要开发一个可以精确考虑所偶性能因素的精准开销模型是非常困难的。因此,我们只能使用粗糙但是健壮的估算方式用于评估系统性能。
另一个设计分布式系统时需要考虑的重要因素是系统操作和维护的容易程度。可服务性或客观理性是系统被修复和维护的简单成都和速度。如果修复宕机系统的时间增加,可用性就会降低。可管理性需要考虑的因素由在问题发生时的诊断和理解问题的容易程度,更新或修复的容易程度,以及操作系统的简单程度(例如按照常规操作是否可以没有失败或异常)。
早期检测到故障可以降低或避免系统的停机时间。例如,一些企业系统在遇到系统故障时可以自动联系服务中心(不需要人工干预)。