架构的演变之路

关于分布式系统,一直不知道该怎么写,这里就先介绍下架构的演变前端

1.在最开始时,使用的架构是这样的:

 

 浏览器向后台服务器发送请求,而后服务器请求数据库,获取数据,在响应给浏览器,这是最先期的架构,服务器和数据库放在一台主机上,nginx

 

这样的架构带来的问题是:git

  当访问量逐渐增大时,服务器的负载就会愈来愈大,负载达到必定限制时,服务器就会宕机,一旦服务器宕机,前端就获取不到任何数据github

2.为了解决这个问题,就提出了第二套架构

 

 经过将数据库分离出来成为一个单独的服务器,来减少放web项目的服务器的压力,这样虽然解决了第一种架构的问题,可是新的问题出现了:web

  当有十万并发请求web服务器时,服务器就会宕机,服务器宕机,浏览器仍然获取不到任何数据,核心功能在web服务器上redis

3.所以就出现了第三种架构

 

 为了解决上一种架构的问题,因而就提出了使用web服务器集群来部署项目,这样当节点1宕机的话,就会请求节点2处理请求,那么问题也随之而来:算法

  若是访问量很是大,致使节点1宕机的话,那么全部的请求就会被节点2接受,节点1宕机,节点2最后必然也会宕机,数据库

4.负载均衡

 

 针对上面的架构的问题,就有了解决办法:浏览器

  使用nginx来作负载均衡,使用轮询算法,一条给节点1,一条给节点2,下一个请求还给节点1,这样就解决了上面的问题,可是又迎来了新的问题:缓存

  假设节点1的最大负载是8万,那么当节点1上如今已经达到满载8万时,下一条请求就是压死骆驼的最后一根稻草,当下一次请求进入节点1,节点1的负载就到了8万零一条,

这时节点1就会宕机。当节点1宕机后,nginx会继续尝试链接节点1,当尝试几回仍是链接不上后,就会放弃链接,并将节点1标记为宕机状态。

  节点1宕机后,全部的请求就会压在节点2上,那么最后结果是节点2也必然宕机

5.架构五,将项目拆分

 

将一个项目于分两个节点来存放,节点1就只存放门户网站,节点2存放登陆的项目, 这样就将请求分不一样的服务器处理了

假设此时又十万并发过来了,这十万并发中有两万是请求门户网站的,就访问节点一、3,八万是请求登陆项目的就访问节点二、4,这样高并发的问题就解决了。能够查看dubbo架构:https://github.com/Zs-xiazhi/dubbo

  并发的问题解决了,数据库又出现问题了:想象一下,随着项目的愈来愈大,用户愈来愈多,数据库中的用户表中的数据也愈来愈多,数据的查询就会很是慢,并且服务器集群中全部的服务器都是访问这一个数据库,那么数据库的压力就会很大。随着数据库中的数据愈来愈多,压力愈来愈大,数据库就会宕机,而服务器集群访问的只有这一台数据库,一旦数据库宕机,那么全部的项目都获取不到数据了。

6.架构六,设置主从数据库

由于上面已经解决了服务器集群高并发问题,所以就不详细画该部分了:

 

 数据库设置主从关系库,正常运行时web服务器访问主库,全部的数据都存放在DB1上,当DB1宕机时,访问DB2,发现没有数据,所以DB1和DB2之间要作数据同步。

当DB1宕机期间,全部的数据都存放在DB2上,若是DB1修好了,这时发现DB2上有的数据DB1上没有,DB2就会自动向DB1同步数据,速度很是快,为了加快速度,能够将常常使用的且不常常修改的数据放入redis缓存中

这种架构出现的问题是:

  1.若是DB1宕机,如何切换从库?

    启用监听。项目启动后,web项目链接数据库DB1,当DB1链接超时,启用监听,切换数据库DB2

  2.单表数据过大,数据库承受访问压力过大

    单表数据量过大:分库分表

    数据库承受访问压力过大:独写分离

7.分库分表

 

 如上图所示,假设项目用户愈来愈多,那么用户表user内的数据就会愈来愈多,这时查询数据很是慢,使用分库分表,就是将同一张表放入不一样的数据库中。

假设user表中有10万条数据,那么就在db1放1-5万条数据, db2中放5-10万条数据

在分库分表中,没有主从概念,全部的数据库都是平等的

问题:如何知道要查询的数据在那儿个数据库中?

  假设用户须要查询一条数据, 那么服务器如何知道这条数据存在哪儿个数据库的表中的呢?因此须要在服务器和数据库之间创建一个命名节点,这也是一个数据库,里面存放的数据是每一个数据库节点的数据范围。如:DB1---1-5万,DB2--5-10万。这样服务器访问数据库时,先到命名节点中查询要查的数据库是在哪儿个数据库上,而后再到相应的数据库中查询数据。

8.读写分离

分库分表完美解决了大量数据的存储问题,可是单个服务器压力过大的问题尚未解决,读写分离解决但服务器压力过大问题:中间的命名节点仍然存在,这里画漏了

 

 读写分离:

  就是把服务器端的select和增删改操做分离开来,对每个数据库作标识(read-->只作select操做,write-->只作增删改操做)

读写分离是有主从概念的,并非真的有主库和从库的区分,是有这个概念,读为主,写为从。

上图使用的是独写分离加上分库分表,这两种方式能够同时使用,也能够分开单独使用,并不冲突  

相关文章
相关标签/搜索