分布式架构的前世今生

一、前言随着社会的发展,技术的进步,以前的大型机架构很显然由于高成本、难维护等原因渐渐地变得不再那么主流了,替代它的就是当下最火的分布式架构,从大型机到分布式,经历了好几个阶段,我们弄明白各个阶段的架构,才能更好地理解和体会分布式架构的好处,那么本文我们就来聊聊分布式架构的演进过程,希望能给大家带来眼前一亮的感觉 。
二、背景说明我们都知道一个成熟的大型网站的系统架构并非一开始就设计的非常完美,也没有一开始就具备高性能、高并发、高可用、安全性等特性,而是随着用户量的增加、业务功能的扩展逐步演变过来的,慢慢的完善的 。在这个过程中,开发模式、技术架构等都会随着迭代发生非常大的变化 。而针对不同业务特征的系统,各自都会有自己的侧重点,例如像淘宝这类的网站,要解决的重点问题就是海量商品搜索、下单、支付等问题; 像腾讯这类的网站,要解决的是数亿级别用户的实时消息传输;而像百度这类的公司所要解决的又是海量数据的搜索 。每一个种类的业务都有自己不同的系统架构 。
下面我们来简单模拟一个架构演变过程 。我们以 JAVAweb 为例,来搭建一个简单的电商系统,从这个系统中来看系统的演变过程 。要注意的是接下来的演示模型,关注的是数据量、访问量提升,网站结构的变化,而不关注具体业务的功能点 。其次,这个过程是为了让大家能更好的了解网站演进过程中的一些问题和应对策略 。
假如我们系统具备以下功能:

  • 用户模块:用户注册和管理 。
  • 商品模块:商品展示和管理 。
  • 交易模块:创建交易及支付结算 。
三、阶段一:单应用架构 
分布式架构的前世今生

文章插图
 
 
这个阶段是网站的初期,也可以认为是互联网发展的早期,系统架构如上图所示 。我们经常会在单台服务器上运行我们所有的程序和软件 。把所有软件和应用都部署在一台机器上,这样就完成一个简单系统的搭建,这个阶段的讲究的是效率 。效率决定生死 。
四、阶段二:应用服务器和数据库服务器分离随着网站的上线,访问量逐步上升,服务器的负载慢慢提高,我们应该在服务器还没有超载的时候就做好规划、提升网站的负载能力 。假若此时已经没办法在代码层面继续优化提高,那么在单台机器的性能遇到瓶颈的时候,增加机器是一个比较简单好用的方式,投入产出比相当高 。这个阶段增加机器的主要目的是将 web 服务器和 数据库服务器拆分开来,这样做的话不仅提高了单机的负载能力,也提高了整个系统的容灾能力 。
分布式架构的前世今生

文章插图
 
 
这个阶段的系统架构如上图所示,应用服务器和数据库服务器完全隔离开来,相互互不影响,大大减少了网站宕机的风险,此阶段我们已经开始关注到应用服务器的管理了 。
五、阶段三:应用服务器集群这个阶段,随着访问量的继续不断增加,单台应用服务器已经无法满足我们的需求 。假设我的数据库服务器还没有遇到性能问题,那我们可以通过增加应用服务器的方式来将应用服务器集群化,这样就可以将用户请求分流到各个服务器中,从而达到继续提升系统负载能力的目的 。此时各个应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提供服务 。
分布式架构的前世今生

文章插图
 
 
系统架构发展到这个阶段,各种问题也会接踵而至:
  • 用户请求交由谁来转发到具体的应用服务器上(谁来负责负载均衡)
  • 用户如果每次访问到的服务器不一样,那么如何维护session,达到session共享的目的 。
那么此时,系统架构又会变成如下方式:
分布式架构的前世今生

文章插图
 
 
负载均衡又可以分为软负载和硬负载 。软负载我们可以选择Nginx、Apache等,硬负载我们可以选择F5等 。
而session共享问题我们可以通过配置Tomcat的session共享解决 。
六、阶段四:数据库压力变大,数据库读写分离架构演变到上面的阶段,并不是终点 。通过上面的设计,应用层的性能被我们拉上来了,但数据库的负载也在逐渐增大,那如何去提高数据库层面的性能呢?有了前面的设计思路以后,我们自然也会想到通过增加服务器来提高性能 。但假如我们单纯的把数据库一分为二,然后对于数据库的请求,分别负载到两台数据库服务器上,那必定会造成数据库数据不统一的问题 。所以我们一般先考虑将数据库读写分离 。


推荐阅读