分布式 - 分布式体系架构:IT架构的演进过程
Posted 我一直在流浪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式 - 分布式体系架构:IT架构的演进过程相关的知识,希望对你有一定的参考价值。
文章目录
01. 应用与数据一体模式
单个应用和数据库运行在单台服务器上的模式,我们称这种模式为应用与数据一体模式。
02. 应用服务和数据服务的分离
随着网站业务的发展,一台服务器逐渐不能满足需求:越来越多的用户访问导致性能越来越差,越来越多的数据导致存储空间不足。这时就需要将应用和数据分离。
应用和数据分离后整个网站使用三台服务器:应用服务器、文件服务器和数据库服务器。这三台服务器对硬件资源的要求各不相同,应用服务器需要处理大量的业务逻辑,因此需要更快更强大的CPU;数据库服务器需要快速磁盘检索和数据缓存,因此需要更快的硬盘和更大的内存;文件服务器需要存储大量用户上传的文件,因此需要更大的硬盘。
03. 缓存与性能的提升
随着用户逐渐增多,网站又一次面临挑战:数据库压力太大导致访问延迟,进而影响整个网站的性能,用户体验受到影响。这时需要对网站架构进一步优化。
网站访问特点和现实世界的财富分配一样遵循二八定律:80%的业务访问集中在20%的数据上。既然大部分的业务访问集中在一小部分数据上,那么如果把这一小部分数据缓存在内存中,是不是就可以减少数据库的访问压力,提高整个网站的数据访问速度,改善数据库的写入性能了呢?
网站使用的缓存可以分为3种:
① 客户端浏览器缓存:当用户通过浏览器请求应用服务器的时候,会发起 HTTP 请求。如果将每次 HTTP 请求都缓存下来,就可以极大地减小应用服务器的压力。
② 应用服务器本地缓存:这种缓存使用的是进程内缓存,缓存在应用服务器上,访问速度更快一些,但是受应用服务器内存限制,其缓存数据量有限,而且会出现和应用程序争用内存的情况。
② 缓存服务器缓存:既可以和应用服务部署在同一服务器上,也可以部署在不同的服务器上。一般来说,为了方便管理和合理利用资源,会将其部署在专门的缓存服务器上。使用集群的方式,部署大内存的服务器作为专门的缓存服务器,可以在理论上做到不受内存容量限制的缓存服务。
用户请求访问数据的顺序为客户端浏览器缓存→应用服务器本地缓存→缓存服务器缓存。如果按照以上次序还没有命中数据,才会访问数据库获取数据。
04. 服务器集群处理并发
使用缓存后,数据访问压力得到有效缓解,但是单一应用服务器能够处理的请求连接有限,在网站访问高峰期,应用服务器成为整个网站的瓶颈。
使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。
对网站架构而言,只要能通过增加一台服务器的方式改善负载压力,就可以以同样的方式持续增加服务器不断改善系统性能,从而实现系统的可伸缩性。
通过负载均衡调度服务器,可将来自用户浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。
05. 数据库读写分离
网站在使用缓存后,使绝大部分数据读操作访问都可以不通过数据库就能完成,但是仍有一部分读操作(缓存访问不命中、缓存过期)和全部的写操作需要访问数据库,在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。
目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库读写分离,从而改善数据库负载压力。
应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据。
为了便于应用程序访问读写分离后的数据库,通常在应用服务器端使用专门的数据访问模块,使数据库读写分离对应用透明。
06. 反向代理和 CDN
随着网站业务不断发展,用户规模越来越大,由于中国复杂的网络环境,不同地区的用户访问网站时,速度差别也极大。有研究表明,网站访问延迟和用户流失率正相关,网站访问越慢,用户越容易失去耐心而离开。为了提供更好的用户体验,留住用户,网站需要加速网站访问速度。主要手段有使用CDN和反向代理。
CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。
使用CDN和反向代理的目的都是尽早返回数据给用户,一方面加快用户访问速度,另一方面也减轻后端服务器的负载压力。
07. 分布式文件系统和分布式数据库系统
任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库经过读写分离后,从一台服务器拆分成两台服务器,但是随着网站业务的发展依然不能满足需求,这时需要使用分布式数据库。文件系统也是一样,需要使用分布式文件系统。
分布式数据库是网站数据库拆分的最后手段,只有在单表数据规模非常庞大的时候才使用。不到不得已时,网站更常用的数据库拆分手段是业务分库,将不同业务的数据库部署在不同的物理服务器上。
08. NoSQL和搜索引擎
随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用一些非关系数据库技术如NoSQL和非数据库查询技术如搜索引擎。
NoSQL和搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具有更好的支持。应用服务器则通过一个统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。
09. 业务拆分
大型网站为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站业务分成不同的产品线,如大型购物交易网站就会将首页、商铺、订单、买家、卖家等拆分成不同的产品线,分归不同的业务团队负责。
具体到技术上,也会根据产品线划分,将一个网站拆分成许多不同的应用,每个应用独立部署维护。应用虽然做了拆分,但应用之间仍旧有关联,存在相互之间的调用、通信和协调问题。由此引入了队列、服务注册发现、消息中心等中间件,这些中间件可以协助系统管理分布到不同服务器、网络节点上的应用。
大型网站的架构演化到这里,基本上大多数的技术问题都得以解决。
10. Redis缓存在应用服务器上是进程内缓存还是进程外缓存?
Redis缓存可以部署在应用服务器内部或外部,具体取决于应用的需求和架构设计。
如果Redis缓存部署在应用服务器内部,则属于进程内缓存。这种部署方式可以提高缓存访问速度,因为缓存数据可以直接从内存中读取,而不需要通过网络传输。但是,进程内缓存的容量受限于应用服务器的内存大小,如果缓存数据量过大,可能会导致内存不足,从而影响应用服务器的性能。
如果Redis缓存部署在应用服务器外部,则属于进程外缓存。这种部署方式可以将缓存数据存储在独立的Redis服务器中,从而避免了内存不足的问题。但是,进程外缓存需要通过网络传输数据,可能会影响缓存访问速度。
因此,在选择Redis缓存部署方式时,需要根据应用的实际情况进行权衡和选择。
11. 如何判断redis缓存在应用服务器内部还是在应用服务器外部?
要判断Redis缓存是否在应用服务器上还是在服务器外部,可以考虑以下几个方面:
① 查看Redis配置文件:可以查看Redis配置文件中的bind和port参数,如果bind参数设置为127.0.0.1,则表示Redis只能在本地访问,即Redis缓存在应用服务器上;如果bind参数设置为0.0.0.0,则表示Redis可以在任何IP地址上访问,即Redis缓存在服务器外部。
② 查看Redis连接地址:可以查看应用程序中连接Redis的地址,如果连接地址为127.0.0.1,则表示Redis缓存在应用服务器上;如果连接地址为其他IP地址,则表示Redis缓存在服务器外部。
③ 查看Redis运行状态:可以通过Redis的命令行工具或者Redis客户端连接到Redis服务器,使用INFO命令查看Redis的运行状态,其中包括Redis所在的服务器IP地址和端口号等信息,可以根据这些信息判断Redis缓存是否在应用服务器上还是在服务器外部。
如何快速掌握分布式微服务架构体系?
微服务架构的演变
微服务架构的技术体系、社区目前已经越来越成熟。在最初系统架构的搭建,或者当现有架构已到达瓶颈需要进行架构演进时,很多架构师、运维工程师会考虑是否需要搭建微服务架构体系。
虽然很多文章都说微服务架构是复杂的、会带来很多分布式的问题,但只要我们了解这些问题,并找到解法,就会有种拨开云雾的感觉。
微服务架构也不是完美的,世上没有完美的架构,微服务架构也是随着业务、团队成长而不断演进的。最开始可能就几个、十几个微服务,每个服务是分库的,通过 API Gateway 并行进行服务数据合并、转发。
随着业务扩大、不断地加入搜索引擎、缓存技术、分布式消息队列、数据存储层的数据复制、分区、分表等。
微服务是一种服务间松耦合的、每个服务之间高度自治并且使用轻量级协议进行通信的可持续集成部署的分布式架构体系。这一句包含了微服务的特点,微服务架构和其他架构有什么区别?以下对比一些常见的架构。
单体架构
单体架构是最简单的软件架构,常用于传统的应用软件开发以及传统 Web 应用。传统 Web 应用,一般是将所有功能模块都打包(jar、war)在一个 Web 容器(JBoss、Tomcate)中部署、运行。
随着业务复杂度增加、技术团队规模扩大,在一个单体应用中维护代码,会降低开发效率,即使是处理一个小需求,也需要将所有机器上的应用全部部署一遍,增加了运维的复杂度。
SOA 架构
当某一天使用单体架构发现很难推进需求的开发、以及日积月累的技术债时,很多企业会开始做单体服务的拆分,拆分的方式一般有水平拆分和垂直拆分。
垂直拆分是把一个应用拆成松耦合的多个独立的应用,让应用可以独立部署,有独立的团队进行维护;水平拆分是把一些通用的,会被很多上层服务调用的模块独立拆分出去,形成一个共享的基础服务,这样拆分可以对一些性能瓶颈的应用进行单独的优化和运维管理,也在一定程度上防止了垂直拆分的重复造轮子。
SOA 也叫面向服务的架构,从单体服务到 SOA 的演进,需要结合水平拆分及垂直拆分。SOA 强调用统一的协议进行服务间的通信,服务间运行在彼此独立的硬件平台但是需通过统一的协议接口相互协作,也即将应用系统服务化。
举个易懂的例子,单体服务如果相当于一个快餐店,所有的服务员职责都是一样的,又要负责收银结算,又要负责做汉堡,又要负责端盘子,又要负责打扫,服务员之间不需要有交流,用户来了后,服务员从前到后负责到底。
SOA 相当于让服务员有职责分工,收银员负责收银,厨师负责做汉堡,保洁阿姨负责打扫等,所有服务员需要用同一种语言交流,方便工作协调。
微服务和 SOA
微服务也是一种服务化,不过其和 SOA 架构的服务化概念也是有区别的,可以从以下几个关键字来理解:
松耦合:每个微服务内部都可以使用 DDD(领域驱动设计)的思想进行设计领域模型,服务间尽量减少同步的调用,多使用消息的方式让服务间的领域事件来进行解耦。
轻量级协议:Dubbo 是 SOA 的开源的标准实现之一,类似的还有像 gRPC、Thrift 等。微服务更倾向于使用 Restful 风格的 API,轻量级的协议可以很好得支持跨语言开发的服务,可能有的微服务用 Java 语言实现,有的用 Go 语言,有的用 C++,但所有的语言都可以支持 Http 协议通信,所有的开发人员都能理解 Restful 风格 API 的含义。
高度自治和持续集成:从底层的角度来说,SOA 更加倾向于基于虚拟机或者服务器的部署,每个应用都部署在不同的机器上,一般持续集成工具更多是由运维团队写一些 Shell 脚本以及提供基于共同协议(比如 Dubbo 管理页面)的开发部署页面。
微服务可以很好得和容器技术结合,容器技术比微服务出现得晚,但是容器技术的出现让微服务的实施更加简便,目前 Docker 已经成为很多微服务实践的基础容器。
因为容器的特色,所以一台机器上可以部署几十个、几百个不同的微服务。如果某个微服务流量压力比其他微服务大,可以在不增加机器的情况下,在一台机器上多分配一些该微服务的容器实例。
同时,因为 Docker 的容器编排社区日渐成熟,类似 Mesos、Kubernetes 及 Docker 官方提供的 Swarm 都可以作为持续集成部署的技术选择。
其实从架构的演进的角度来看,整体的演进都是朝着越来越轻量级、越来越灵活的应用方向发展,甚至到近两年日渐成熟起来的 Serverless(无服务)架构。
从单体服务到分层的服务,再到面向服务、再到微服务甚至无服务,对于架构的挑战是越来越大。
微服务中的分布式
微服务架构属于分布式系统吗?答案是肯定的。微服务和 SOA 都是典型的分布式架构,只不过微服务的部署粒度更细,服务扩展更灵活。
怎样理解微服务中的分布式?举一个招聘时一个同学来面试的例子。A 同学说,目前所在公司在做从单应用到微服务架构迁移的工作,已经差不多完成了。
提到微服务感觉就有话题聊了,于是便问:“是否可以简单描述下服务拆分后的部署结构、底层存储的拆分、迁移方案?”于是 A 同学说,只是做了代码工程结构的拆分,还是原来的部署方式,数据库还是那个库,所有的微服务都用一个库,分布式事务处理方式是“避免”,尽量都同步调用……于是我就跟这位同学友好地微笑说再见了。
微服务的分布式不仅仅是容器应用层面的分布式,其为了高度自治,底层的存储体系也应该互相独立,并且也不是所有的微服务都需要持久化的存储服务。一个“手机验证码”微服务可能底层存储只用一个 Redis;一个“营销活动搭建页面”微服务可能底层存储只需要一个 MongoDB。
微服务中的分布式场景除了服务本身需要有服务发现、负载均衡,微服务依赖的底层存储也会有分布式的场景:为了高可用性和性能需要处理数据库的复制、分区,并且在存储的分库情况下,微服务需要能保证分布式事务的一致性。
如何学习分布式微服务架构体系
微服务架构的技术体系、社区目前已经越来越成熟,所以在初期选择使用或者企业技术体系转型微服务的时候,需要了解微服务架构中的分布式的问题:
在所有服务都是更小单元的部署结构时,一个请求需要调动更多的服务资源,怎样获得更好的性能?
当业务规模增大,需要有地理分布不同的微服务集群时,其底层的数据存储集群是多数据中心还是单数据集群? 数据存储如何进行数据复制?
业务数据达到大数据量时怎样进行数据的分区? 分布式事务怎样保证一致性? 不同程度的一致性有什么差别? 基于容器技术的服务发现怎么处理?
应该用哪些 RPC 技术,用哪些分布式消息队列来完成服务通信和解耦? 那么多的分布式技术框架、算法、服务应该选哪个才适合企业的业务场景?
《分布式微服务架构体系详解》从微服务不得不面对和解决的分布式问题出发,包含分布式技术的一系列理论以及架构模型、算法的介绍,同时结合技术选型和实践应用,提供一系列解决方案的梳理。
相信阅读完整个课程,你会对微服务的分布式问题有个系统地理解。本课程会对微服务的分布式场景问题一一击破,为你提供解决思路。
并且,本课程通过对分布式问题的体系化梳理,结合一些方案的对比选型,可以让工程师们一览微服务的知识图谱。
如果你是一位开发工程师,相信阅读完本系列课程,将会了解很多分布式系统的理论知识,同时也会理解一些分布式存储、中间件技术的原理,对工作中的分布式架构会有体系化的清晰认知。
如果你是一位架构师,本系列课程提供了对于分布式系统问题的全面梳理,以及一些技术背后的理论,结合实践和目前业界先进的方案,对于技术选型和架构搭建提供了参考。
扫码免费试读
《分布式微服务架构体系详解》
专家推荐
本课程内容融合了作者从阿里巴巴到创业公司这一路走来所积累的精华,是微服务及分布式领域难得的佳作。
——阿里巴巴技术专家,荣博
作者简介
李静瑶,2011 年毕业于中南大学,毕业后入职阿里巴巴集团,在职期间主要负责淘宝网营销产品线的研发工作,曾担任试用中心产品线 PM。
现就职于赤金信息科技有限公司,担任 CTO 职位。从零搭建基于 Docker 容器技术的微服务分布式企业集群,深度的 DDD 思想践行者。CSDN 博客专家。
感兴趣的同学,点击阅读原文 免费试读
以上是关于分布式 - 分布式体系架构:IT架构的演进过程的主要内容,如果未能解决你的问题,请参考以下文章