走进分布式中间件(一)

懒驴 2021年12月17日 2,334次浏览

        分布式系统凭借其具有高吞吐、强扩展、高并发、低延迟及灵活部署等特点,大大促进了互联网的飞速发展,给企业带来了巨大的收益。而作为分布式系统中关键的组件---分布式中间件,也起到了必不可少的作用。它是一种独立的基础系统软件或者服务程序,处于操作系统软件与用户的应用软件中间,可作为独立的软件系统运转。

        作为一名IT行业从业人员,在普通研发工程师到系统架构师的成长之路上,分布式中间件是绕不过去的。既然绕不过去,那好不如从现在开始认真地学习分布式中间件,也当做是自己职业生涯的一个成长轨迹。

一. 分布式系统概述

1. 白话分布式系统

关于“分布式系统”定义,说直白点,可以这样理解:
1. 分布式系统整体上来说比较强大,其内部至少由多台计算机组成,类似于一个统一的“机器中心”一样,背后由一组独立的计算机组成。
2. 对于用户来说,这个“机器中心”却像是单个相关系统一样,根本感觉不到计算机集群的存在。

从程序的角度来看,程序A与程序B分别运行在两台计算机上,它们相互协作完成同一个功能。从理论上讲,这两个程序所组成的系统,就可以称做是“分布式系统”。当然,这两个程序可以是不同的程序,也可以是相同的程序。如果是相同的程序,我们又可以称之为“集群”。

2. 分布式系统发展历程

在分布式系统出现之前,市面上几乎所以的软件系统都是集中式的,即所谓的单机系统。软件、硬件及各种组件高度耦合组成了单机架构。在很长一段时间内,这种架构着实起到了很大的作用,给企业带来了诸多收益。随着业务的发展及用户访问量的上升,这种系统架构也随之进行了演进。下面来以Web应用为例,主要包含了5个历程。

(1)单点集中式Web应用

早期很多中小型企业的大部分项目都是基于这样的架构,如下图所示:


单点集中式Web应用

单点集中式Web应用系统架构总体上来看还是比较简单的,一般以后台管理系统应用为主,比如CRMOA系统等。这种系统架构有一个很明显的特点就是数据库(比如MySQL)及应用的War包都是共同部署在同一台服务器上,文件的上传存储也是上传到本台机器上。

单点集中式Web应用系统架构的优点是适用于小型项目,发布便捷(只需要打包成War包,并进行解压即可),对于运维的工作量也比较小。其缺点在于若是该台服务器宕机,整个应用将无法访问。

(2)应用与文件服务及数据库单独拆分

随着时间的推移,数据库及文件的数量越来越多,由于服务器的容量是有限的,原有的系统架构已经不足以支撑,此时需要将Web应用、数据库、文件存储服务拆分出来作为独立的服务,以此来避免存储瓶颈,如下图所示:

应用与文件服务及数据库单独拆分


应用与文件服务及数据库单独拆分这种系统架构,一个明显的特点就是三个服务独立部署,不同服务器宕机了,其他的仍然可以使用。

(3)引入缓存与集群,改善系统整体性能

当系统应用的请求并发量上去了,而单台Web服务器(比如Tomcat容器)不足以支撑应用的时候,此时我们会考虑引入缓存及集群,以改善系统的整体性能,这种架构的示意图如下:


引入缓存与集群,改善系统整体性能


(4)数据库读写分离+反向代理及CDN加速访问服务

再后来,在大多数互联网应用系统中,用户的读请求数量往往大于写请求,它们会相互竞争,在这个时候往往写操作会受到影响,导致数据库出现存储瓶颈。因此会对数据库采取读写分离,从而提高数据库的存储性能。
除此之外,为了加速网站的访问速度,尤其是加速静态资源的访问,会将系统的大部分静态资源存放到CDN中,并加入反向代理的配置,从而减少访问网站时直接去服务器读取静态数据。
DB的读写分离将有效的提高数据库的存储性能,而加入CDN与反向代理将加速系统的访问速度,如下图所示:


数据库读写分离并提供反向代理及CDN加速访问服务


(5)分布式文件系统与分布式数据库

经过统计与监测,发现系统对于某些表有大量的请求,此时为了减少DB的压力,我们会进行分库分表,即根据业务来拆分数据库。

3. 分布式系统特性

回顾分布式系统的发展历程会发现,在分布式系统出现之前,软件系统都是集中式的,俗称单机系统。在很长一段时期,单机系统通过不断升级“程序”或者相关硬件,就能满足不断增长的性能需求,然而,随着互联网的飞速发展,高吞吐、低延迟逐渐成为“刚需”,单凭“生硬”的不断升级已无能为力,于是分布式系统“应需求而生”。总的来说,分布式具有以下5个特性:

  • 内聚性和透明性: 分布式系统是建立在网络之上的软件系统,所以具有高度的内聚性和透明性。
  • 可扩展性: 分布式系统可以随着业务的增长动态扩展自己的系统组件,从而提高系统整体的处理能力。通常有两种方式:其一,优化系统的性能或者升级硬件,即垂直扩展;其二,增加计算单元(如服务器等)以扩展系统的规模,即水平扩展。
  • 可用与可靠性: 说直白点,可靠性量化的指标是给定期内系统无故障运行的平均时间,而可用性量化的指标是给定周期内系统无故障运行的总时间,一个是“平均”时间,一个是“总”时间。
  • 高性能: 不管是单机系统还是分布式系统,性能始终是关键指标。不同的系统对性能的衡量指标是不同的,最常见的有“高并发”(即单位时间内处理任务月底越好)和“低延迟”(即每个任务的平均处理时间越少越好)。分布式系统的设计初衷便是利用更多的机器,实现更强大的计算和存储能力,即实现高性能。
  • 一致性: 分布式系统为了提高可用性和可靠性,一般会引入冗余(副本)。为了保证这些节点上的状态一致,分布式系统必须解决一致性问题,其实就是在多个节点集群部署下,如何保证多个节点在给定的时间内,操作或者存储的数据只有一份。

4. 分布式系统常见问题

分布式系统虽然看似很强大,但是实际的应用环境中,由于一些人为难以控制或者根本就不可控的因素,导致系统整体上变得十分脆弱。典型的常见问题因素包括以下几点:

1. 网络并没有那么可靠

分布式系统中,节点间本质上是通过网络通信,而网络有些时候并没有那么可靠。常见的网络问题有网络延时、丢包和消息丢失等。

2. 节点故障无法避免

当分布式的节点数目达到一定规模后,整个系统出现故障的概率将变高。而分布式系统需要保证故障发生时,系统仍然是可用的,即在某个或者某些节点发生故障的情况下,需要将该节点所负责的计算和存储任务转移到其它节点。

总而言之,分布式系统在给互联网企业带来诸多好处之时,随之也带来了诸多挑战和不确定性。可谓是一把 “双刃剑”。

传送门:《走进分布式中间件(二)》