单体架构演变成分布式架构

一单体架构​

单体架构演变成分布式架构_第1张图片

这个阶段是网站的初期,系统架构如上图所示。我们经常会在单台服务器上运行我们所有的程序和软件。 把所有软件和应用都部署在一台机器上,这样就完成一个简单系统的搭建,这个阶段一般是属于业务规模不是很大的公司使用,因为机器都是单台的话,随着我们业务规模的增长,慢慢的我们的网站就会出现一些瓶颈和隐患问题,那么接下来我们就会来讲讲系统项目的发展。

二应用服务器和数据库服务器分离

随着网站的上线,访问量逐步上升,服务器的负载慢慢提高,我们应该在服务器还没有超载的时候就做好规划、提升网站的负载能力。假设此时已经没办法在代码层面上去继续优化提高了,那么在单台机器的性能遇到瓶颈的时候,增加机器是一个比较简单好用的方式,但是增加机器的方式相对来说成本会比较高。这个阶段增加机器的主要目的是将 web 服务器和数据库服务器拆分开来,这样做的话不仅提高了单机的负载能力,也提高了整个系统的容灾能力。
单体架构演变成分布式架构_第2张图片
这个阶段的系统架构如上图所示,应用服务器和数据库服务器完全隔离开来,相互互不影响,大大减少了网站宕机的风险,我们已经开始关注到应用服务器的管理了。

三 应用服务器高可用集群

随着访问量的继续不断增加,单台应用服务器已经无法满足我们的需求。 假设我的数据库服务器还没有遇到性能问题,那我们可以通过增加应用服务器的方式来将应用服务器集群化,这样就可以将用户请求分流到各个服务器中,从而达到继续服务器高可用、提升系统负载能力的目的。此时各个应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提供服务。
单体架构演变成分布式架构_第3张图片
系统架构业务发展到这个阶段,各种问题也会接踵而至:

用户请求交由谁来转发到具体的应用服务器上(谁来负责负载均衡)

用户如果每次访问到的服务器不一样,那么如何维护

这里可以使用session入库,达到session会话数据共享的目的。

那么此时,系统架构又会变成如下方式:
  单体架构演变成分布式架构_第4张图片
 负载均衡又可以分为软负载和硬负载。软负载我们可以选择Nginx、Apache等,硬负载我们可以选择F5等。而session会话数据共享问题我们可以存储在公共nosql,比如redis、memcached 。

四 数据库主从复制、读写分离

通过上面的设计,应用层的性能被我们拉上来了,但数据库的负载也在逐渐增大,那如何去提高数据库层面的性能呢?有了前面的设计思路以后,我们自然也会想到通过增加服务器来提高性能。但假如我们单纯的把数据库一分为二,然后对于数据库的请求,分别负载到两台数据库服务器上,那必定会造成数据库数据不统一的问题。 所以我们一般先考虑将数据库主从复制或者读写分离,但是在读写分离的时候会有一些数据的延迟性,所以也并不是说所有场景都适合读写分离。
单体架构演变成分布式架构_第5张图片
 这个架构设计的变化会带来如下几个问题:

主从数据库之间的数据需要同步(可以使用 mysql自带的 master-slave 方式实现主从复制 ),主从模式最大的特点就是从机可以做一个备份,解决单点问题。

读写分离模式一般会有一些数据延迟性,根据业务场景选择读写分离模式,需要能够去接受一定的数据延迟的场景可以选择读写分离来做到数据库的高可用。

应用中需要根据业务进行对应数据源的选择(采用第三方数据库中间件,例如 mycat )

五 引入缓存机制缓解数据库的压力

然后又随着访问量的持续不断增加,慢慢的我们的系统项目会出现许多用户访问同一内容的情况。那么对于这些热点数据的访问,没必要每次都从数据库重读取,这时我们可以使用到缓存技术,比如 redis、memcache 来作为我们应用层的缓存。此外,在某些场景下,我们也需要对用户的某些 IP 的访问频率做限制或者做黑白名单。那这个放内存中就又不合适,放数据库又太麻烦了,那这个时候可以使用 Nosql 的方式比如 mongDB 来代替传统的关系型数据库。
单体架构演变成分布式架构_第6张图片

六数据库水平/垂直拆分

随着数据库的压力持续增加,数据库的瓶颈仍然是个最大的问题。因此我们可以考虑对数据的垂直拆分和水平拆分。

垂直拆分:把数据库中不同业务数据拆分到不同的数据库。

水平拆分:把同一个表中的数据拆分到两个甚至更多的数据库中,水平拆分的原因是某些业务数据量已经达到了单个数据库的瓶颈,这时可以采取将表拆分到多个数据库中。

七服务应用的拆分

随着业务的发展,业务量越来越大,应用的压力越来越大。网站规模也越来越庞大。这个时候就可以考虑将应用拆分,按照领域模型拆分成多个子系统。

拆分以后,可能会有一些相同的代码,比如用户操作,后续模块都需要查询,所以会导致每个系统都会有用户查询访问相关操作。这样就会产生代码冗余,就会造成很多系统资源的浪费,毕竟我们的资源也是很贵的。所以这些相同的操作一定是要抽取出来,否则就是一个很大的坑。所以我们可以通过走服务化路线的方式来解决。

你可能感兴趣的:(单体架构演变成分布式架构)