分布式架构的演变过程

本文记录最近听Chacky老师讲的一次公开课——分布式架构的演变过程。

1. 单点集中式web应用,也称之为巨石应用

很多中小型企业的中小型项目都是基于这样的架构,架构很简单,一般以后台管理应用为主,比如CRM或者OA系统等。

数据库以及war包都是部署在同一台服务器上的,文件上传也是上传到这台服务器。

特点:

  1. 所有资源都是部署在同一台服务器上,并发量小,适用于小项目;
  2. 上线方便,运维工作量小;
  3. 不利于扩展,项目会越做越大,war包体积也会越来越大。

缺点:一台服务器宕了,整个应用就都无法访问了,必须人工去恢复。

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

随着时间的推移,数据库以及文件的量不断增加,单台服务器的容量是有限的,原有架构已经不足以支撑,此时必须要把web应用与数据库还有文件服务拆分为三个独立的服务,以此来避免存储瓶颈。

特点:三个服务独立部署,单一服务器宕机,其他的仍可以使用。

3.引入缓存改善读取性能

请求并发量上去了,单台tomcat不足以支撑全部流量的时候,我们可以引入缓存来增加读取效率。也就是把大量用户的读请求引导至缓存中,而写操作仍然直接写到数据库中。

特点:把数据库中的一部分数据放入缓存,减少数据库压力,提高并发量。

4.引入集群,多机负载均衡

部署多台tomcat来减少单台tomcat的压力,常见的手段是采用 nginx+lvs。

但需要注意的是,要把有状态session改为无状态session,可以使用redis或者spring-session来解决。

特点:多台服务器构成负载均衡,减少单机的负载压力。

5.数据库读写分离

数据库连接池提供的连接数是一定的,往往用户的读请求远远大于写请求,他们会相互竞争,在这个时候往往写库操作就进行不了,出现了数据库存储瓶颈,所以可以考虑讲读写请求进行分离。

特点:数据库读写分离,提高数据库的吞吐量。

6.使用反向代理以及CDN加速服务

这样做目的是加快网站的访问速度,尤其是静态资源。

7.使用分布式文件系统和分布式数据库

经统计与监测后系统对某些表有大量的请求的时候,为了减少压力,我们需要做分库分表。

两种拆分方式:

  1. 根据业务拆分数据库,比如用户服务相关,订单服务相关,日志服务相关等
  2. 根据业务竖向拆分或者横向拆分数据表,常见拆分 user表,order表
  • 竖向拆分:比如order表中某些字段经常访问,那就把这些字段归在一个表,其他不经常访问的字段归在另外一张表,也就是主表和从表,之间使用外键关联
  • 横向拆分:根据某个时间点或者业务点来拆分,比如3个月内的订单数据放在order_a中,3个月到1年内的数据放在order_b中,1年-3年的数据放在order_c中,3年前的订单数据放在order_d中,这样拆分每张表的数据体积减少,增加查询效率。当然除了根据时间还能根据地域来做拆分,具体根据各自的业务进行。

标签: none