从架构演变来看分布式

此博客用于个人学习,来源于网上,对知识点进行一个整理。

1. 背景与前言:

现在的架构很多,各种各样的,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等,还有很多。

那什么是分布式系统?分布式系统是支持分布式处理的软件系统,是由通信网络互联的多处理机体系结构上执行任务的系统。包括分布式操作系统、分布式程序设计语言及其编译系统、分布式文件系统分布式数据库系统等,当然这些也是分布式的关键技术。

接下来,我们通过对互联网架构的演变,来体会分布式架构的好处。

2. 架构演变:

2.1 初生:

初始阶段的小型系统,应用程序、数据库、文件等所有的资源都在一台服务器上,这种模式也被称为 LAMP(Linux+Apache+MySQL+PHP)。一般是一些无名的小网站,访问量比较低,一台服务器就能满足需求。

在这里插入图片描述
发展问题:随着网站业务的发展,越来越多的用户访问,面临的问题:

  1. 性能越来越差
  2. 越来越多的数据导致存储空间不足

2.2 应用服务与数据服务分离:

于是,我们使用应用服务与数据服务分离的方法,将应用程序、数据库、文件分别部署在独立的资源上。在这里插入图片描述

  1. 服务器对应不同的硬件需求:
    1. 应用服务器: 需要更快更强大的 CPU(处理大量的业务逻辑)
    2. 数据库服务器:需要更快的硬盘和更大的内存(快速磁盘检索和数据缓存)
    3. 文件服务器:需要更大的硬盘(存储大量用户上传的文件)
  2. 发展问题:随着用户逐渐增多,网站再次面临挑战:数据库压力太大导致访问延迟,进而影响整个网站的性能,用户体验受到影响。

2.3 使用缓存改善性能:

使用缓存改善系统性能,就是数据库中访问较集中的一小部分数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的访问压力。缓存分为本地缓存和远程分布缓存,其中本地缓存访问速度更快但缓存数据量有限,同时存在与应用程序争用内存的情况。

常用的缓存组件有 Redis 和 memcache。

在这里插入图片描述
发展问题:随着用户逐渐增多,单一应用服务器面临新的问题:能够处理的连接有限,网站访问高峰期,应用服务器成为整个网站的瓶颈。

2.4 应用服务器集群:

使用应用服务器集群来改善网站的并发处理能力,多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。通过向集群中追加资源,提升系统的并发处理能力,使得服务器的负载压力不再成为整个系统的瓶颈。

负载均衡有三个方面的内容:

  • 软件:
    • Apache Nginx Reverse-proxy
  • 硬件:F5
  • DNS 负载均衡

在这里插入图片描述
发展问题:使用缓存后,虽然大大减轻了数据库的读压力,但是面临新的问题:有一部分数据(缓存访问不命中,缓存过期)和全部的写操作要访问数据库,当用户达到一定规模后,数据库因为负载压力过高而成为整个系统的瓶颈。

2.5 数据库读写分离:

读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。

数据访问模块:

  • 在 MyBatis 中开发插件
  • MyCat
  • Sharding - JDBC

在这里插入图片描述

发展问题:用户规模越来越大,发布地域越来越广,地域网络环境差别很大,面临问题:如何保证用户的访问体验,不至于因访问慢而流失用户?

2.6 反向代理和 CDN 加速:

为了应付复杂的网络环境和不同地区用户的访问,通过 CDN 和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN 与反向代理的基本原理都是缓存。

在这里插入图片描述
发展问题:随着系统的不断运行,数据量开始大幅度增长,单文件服务器和单数据库服务器存不下日益增长的数据。

2.7 分布式文件系统和分布式数据库系统:(分库分表)

数据库采用分布式数据库,文件系统采用分布式文件系统。分布式数据库是系统数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。

适合存储文件,固定的分布式系统:

  • FastDFS
  • TFS

数据访问模块:

  • MyCat
  • Sharding - JDBC

在这里插入图片描述

发展问题:随着业务的发展,数据的存储需求和检索需求越来越复杂,面临的问题:存储的字段差异较大,存在“骷髅表”的现象;文本检索技术太过于复杂。

2.8 使用 NoSQL,搜索引擎:

系统需要采用一些非关系型数据库如 NoSQL 和分数据库查询技术如搜索引擎。应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。

搜索引擎:

  • lucene
  • solr
  • elasticsearch

NoSQL:

  • mongodb
  • elasticsearch

在这里插入图片描述

发展问题:网络越做越大,业务不断扩大,面临的问题:应用程序将变得无比庞大,迭代周期越来越快,牵一发而动全身,怎么去应对快速发展的业务需要?

2.9 业务拆分:

系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。如大型电商项目网站会将首页,店铺,订单,买家等拆分成不同的产品线,分归不同的团队负责,分成不同的应用独立部署,通过链接,MQ,数据存储系统建立关联。

业务拆分分为两个方向——横向拆分和纵向拆分:

  • 纵向拆分:将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的 Web 应用。系统纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。
  • 横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。

消息队列 MQ:

  • RabbitMQ
  • ActiveMQ
  • Kafka

在这里插入图片描述

发展问题:业务规模不断增大,应用拆分越来越小,越来越多,面临的问题:应用间的关系越来越复杂,应用中存在着大量相同的业务操作。后端的数据库要彼此成千上万台应用服务器连接,数据库连接资源不足。

2.10 分布式服务(服务化):

公共的应用模块被提取出来,部署在分布式服务器上供应用服务器调用。

服务化的两种架构方式:SOA,微服务。

服务框架:

  • Dubbo
  • SpringCloud

配置中心:

  • Dubbo
  • SpringCloud config
  • Disconfig
  • Config-toolkit
  • Diamond

在这里插入图片描述
分布式系统同样的也存在一些问题:

  • 架构设计变得复杂(尤其是其中的分布式事务)
  • 部署单个服务会比较快,但是如果一次部署需要多个服务,部署会变得复杂
  • 系统的吞吐量会变大,但是响应时间会变长
  • 运维复杂度会因为服务变多而变得很复杂
  • 架构复杂导致学习曲线变大
  • 测试和查错的复杂度增大
  • 技术可以很多样,这会带来维护和运维的复杂度
  • 管理分布式系统中的服务和调度变得困难和复杂

所以总结一下,分布式系统架构的难点在于系统设计,以及管理和运维。所以分布式系统架构在解决了一些问题的同时,也增加了其他的问题,这就需要不断的再用各种各样的技术跟手段去解决这些新增的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值