分布式与集群

1,594 阅读7分钟

前言

在当前的互联网环境中,分布式集群是一个比较热门的话题,它们的诞生解决了单机环境下的种种问题,下面,我将从是什么为什么两个方面来分享一下最近我对它们的理解。

是什么

什么是单机?

单机,顾名思义,就是把开发的系统部署到一台服务器上,所有的业务请求都由这台服务器来处理。

单机

什么是分布式?

分布式就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系统,它们独立地运行在不同的服务器上,彼此之间通过 RPC 或消息中间件等方式通信。

分布式

什么是集群?

集群就是单机的多实例,在多个服务器上部署同一个系统,这些服务器的集合就叫做集群。

集群

为什么

机架构有什么问题?

性能问题

  • 单个服务器无论是计算资源还是存储资源都非常有限,当请求量非常大的时候,会出现响应变慢等情况,严重影响用户体验。

  • 单体架构的多个服务中,某个服务占用资源多,时间长,导致总体响应显慢。

可用性问题

  • 当出现单机故障(进程崩溃、断电、磁盘损坏等)时,整个应用不可用。

eBay 因为 1999 年 6 月停机 22 小时的事故,中断了约 230 万的拍卖,使 eBay 的股票下降了 9.2 个百分点。

开发问题

  • 单体架构下,我们将各个模块放在一个系统中,系统过于庞大臃肿,维护成本高,各个功能模块之间的耦合度偏高,难以针对单个模块进行优化,出现 BUG 较难定位。

  • 交付周期长,所有功能得一起上线,一起构建,一起部署。任何一个环节出错,都可能影响交付。

为什么要引入分布式?

提高性能

  • 相较于单体架构,在请求量非常大的时候,整个系统的响应速度会提高,因为各个服务都享有一个服务器的资源,资源竞争小,任务处理快。

提高可用性

  • 相较于单体架构,各个服务分布在不同的服务器上,当出现单机故障(进程崩溃、断电、磁盘损坏等)时,可能影响的只是非核心服务,对核心服务影响不大。

提高开发效率

  • 相较于单体架构,系统之间的耦合度大大降低,可以独立开发、独立部署、独立测试,系统与系统之间的边界非常明确,排错也变得相当容易,开发效率大大提升。

  • 相较于单体架构,服务的复用性更高。比如,当我们将用户系统作为单独的服务后,该公司所有的产品都可以使用该系统作为用户系统,无需重复开发。

为什么要引入集群?

提高性能

  • 相较于单体架构,在请求量非常大的时候,整个系统的响应速度会有所提高,因为单体架构是一台服务器干活,引入集群后就是一群服务器干活。

提高可用性

  • 相较于单体架构,集群架构的可用性大大增加,当出现单机故障(进程崩溃、断电、磁盘损坏等)时,其它服务器仍然可以正常运转。

分布式与集群的区别

从提升效率的角度

  • 分布式是以缩短单个任务的执行时间来提升效率的;

  • 集群则是通过提高单位时间内执行的任务数来提升效率的。

从应用部署的角度

  • 分布式是将各个服务分布到不同的服务器上;

  • 集群则是将几台服务器集中在一起,提供同一业务;

  • 分布式中的每一个节点,都可以做集群。

分布式与集群的关系

根据分布式的介绍可以看出,其主要的作用是将我们的系统模块化,将系统进行解耦,方便我们的维护和开发,但是它并不能解决大并发问题,也无法保证我们的系统在服务器宕机后的正常运转。

而集群恰好弥补了分布式的缺陷,集群,就是多个服务器处理相同的业务,这在一方面可以解决或者说改善我们系统的并发问题,一方面可以提高在某个服务器出现单机故障(进程崩溃、断电、磁盘损坏等)时,整个系统的可用性,换句话说,当某些服务器出现宕机后,系统仍然可以正常运转。

分布式集群

根据前文的介绍和分析,可以发现,若在系统的架构设计上,只使用分布式或者只使用集群都存在着各种各样的不足,所以一个好的设计应该是分布式和集群的结合,具体地说就是先分布式再集群,系统服务拆分成若干个子服务,然后针对子服务进行集群部署。

分布式集群

分布式集群的好处

系统可用性提升

  • 一个系统全年可用时间在 99.999%,5 个 9 的服务可用率在设计合理的分布式集群系统中并不是一个触不可及的数字。

  • 传统的集中式计算或集中式存储在遇见单点故障时很容易造成整个服务不可用,分布式集群下的服务体系,单台机器有故障,不致于造成整个服务不可用。

系统并发能力提升

  • 请求通过负载均衡被分发到不同的服务器上,运行同样代码的服务器可以有 1 台或 N 台,通常情况下会根据实际用户访问量随时增加服务器,无论是数据库还是服务,都可以做到随时水平扩展。

比如双 11 活动,平时订单少, 50 台机器就够了,到了双 11 ,订单量剧增,服务器增加到 100 台,每台服务器之间相互独立,互不影响。

系统容错能力提升

系统容错

  • 同一组服务分别部署在北京、上海、杭州,假如杭州的机房突发断电或者火灾,杭州机房的流量会被自动分发到北京和上海的机房,不影响用户的系统使用体验。

低延迟

  • 参考上一个图,北京的用户请求分发到北京,上海的用户请求分发到上海,服务器会根据用户的 IP 选择距离自己最近的机房,降低网络延迟。

低耦合

  • 系统之间的耦合度大大降低,可以独立开发、独立部署、独立测试,系统与系统之间的边界非常明确,排错也变得相当容易,开发效率大大提升。

  • 系统更易于扩展。我们可以针对性地扩展某些服务,换句话说,就是对子系统进行集群。例如在双十一时,订单子系统、支付子系统需要集群,账户管理子系统不需要集群。

  • 服务的复用性更高。比如,当我们将用户系统作为单独的服务后,该公司所有的产品都可以使用该系统作为用户系统,无需重复开发。

分布式集群带来的挑战

依赖网络,会因为网络问题导致系统数据丢失或不一致性

服务器间通讯依赖网络,不可靠网络包括网络延时,丢包、中断、异步,一个完整的服务请求依赖一连串服务调用,任意一个服务节点网络出现问题,都可能造成本次请求失败。

系统复杂化,系统监控维护,版本迭代发布变得相对复杂,成本高

传统单体式服务只需要维护一个站点就可以。分布式服务系统被拆分成若干个小服务,服务从 1 变为几十个上百个服务后,增加运维成本。

一致性,可用性,分区容错性无法同时满足

这个是最主要的,这三种特性就是平时说的 CAP 定理,在分布式系统中,这三种特性最多只能满足两种,无法同时满足,需要根据实际情况去调整牺牲掉其中哪个。