关于分布式系统,一直不知道该怎么写,这里就先介绍下架构的演变前端
浏览器向后台服务器发送请求,而后服务器请求数据库,获取数据,在响应给浏览器,这是最先期的架构,服务器和数据库放在一台主机上,nginx
这样的架构带来的问题是:git
当访问量逐渐增大时,服务器的负载就会愈来愈大,负载达到必定限制时,服务器就会宕机,一旦服务器宕机,前端就获取不到任何数据github
经过将数据库分离出来成为一个单独的服务器,来减少放web项目的服务器的压力,这样虽然解决了第一种架构的问题,可是新的问题出现了:web
当有十万并发请求web服务器时,服务器就会宕机,服务器宕机,浏览器仍然获取不到任何数据,核心功能在web服务器上redis
为了解决上一种架构的问题,因而就提出了使用web服务器集群来部署项目,这样当节点1宕机的话,就会请求节点2处理请求,那么问题也随之而来:算法
若是访问量很是大,致使节点1宕机的话,那么全部的请求就会被节点2接受,节点1宕机,节点2最后必然也会宕机,数据库
针对上面的架构的问题,就有了解决办法:浏览器
使用nginx来作负载均衡,使用轮询算法,一条给节点1,一条给节点2,下一个请求还给节点1,这样就解决了上面的问题,可是又迎来了新的问题:缓存
假设节点1的最大负载是8万,那么当节点1上如今已经达到满载8万时,下一条请求就是压死骆驼的最后一根稻草,当下一次请求进入节点1,节点1的负载就到了8万零一条,
这时节点1就会宕机。当节点1宕机后,nginx会继续尝试链接节点1,当尝试几回仍是链接不上后,就会放弃链接,并将节点1标记为宕机状态。
节点1宕机后,全部的请求就会压在节点2上,那么最后结果是节点2也必然宕机
将一个项目于分两个节点来存放,节点1就只存放门户网站,节点2存放登陆的项目, 这样就将请求分不一样的服务器处理了
假设此时又十万并发过来了,这十万并发中有两万是请求门户网站的,就访问节点一、3,八万是请求登陆项目的就访问节点二、4,这样高并发的问题就解决了。能够查看dubbo架构:https://github.com/Zs-xiazhi/dubbo
并发的问题解决了,数据库又出现问题了:想象一下,随着项目的愈来愈大,用户愈来愈多,数据库中的用户表中的数据也愈来愈多,数据的查询就会很是慢,并且服务器集群中全部的服务器都是访问这一个数据库,那么数据库的压力就会很大。随着数据库中的数据愈来愈多,压力愈来愈大,数据库就会宕机,而服务器集群访问的只有这一台数据库,一旦数据库宕机,那么全部的项目都获取不到数据了。
由于上面已经解决了服务器集群高并发问题,所以就不详细画该部分了:
数据库设置主从关系库,正常运行时web服务器访问主库,全部的数据都存放在DB1上,当DB1宕机时,访问DB2,发现没有数据,所以DB1和DB2之间要作数据同步。
当DB1宕机期间,全部的数据都存放在DB2上,若是DB1修好了,这时发现DB2上有的数据DB1上没有,DB2就会自动向DB1同步数据,速度很是快,为了加快速度,能够将常常使用的且不常常修改的数据放入redis缓存中
这种架构出现的问题是:
1.若是DB1宕机,如何切换从库?
启用监听。项目启动后,web项目链接数据库DB1,当DB1链接超时,启用监听,切换数据库DB2
2.单表数据过大,数据库承受访问压力过大
单表数据量过大:分库分表
数据库承受访问压力过大:独写分离
如上图所示,假设项目用户愈来愈多,那么用户表user内的数据就会愈来愈多,这时查询数据很是慢,使用分库分表,就是将同一张表放入不一样的数据库中。
假设user表中有10万条数据,那么就在db1放1-5万条数据, db2中放5-10万条数据
在分库分表中,没有主从概念,全部的数据库都是平等的
问题:如何知道要查询的数据在那儿个数据库中?
假设用户须要查询一条数据, 那么服务器如何知道这条数据存在哪儿个数据库的表中的呢?因此须要在服务器和数据库之间创建一个命名节点,这也是一个数据库,里面存放的数据是每一个数据库节点的数据范围。如:DB1---1-5万,DB2--5-10万。这样服务器访问数据库时,先到命名节点中查询要查的数据库是在哪儿个数据库上,而后再到相应的数据库中查询数据。
分库分表完美解决了大量数据的存储问题,可是单个服务器压力过大的问题尚未解决,读写分离解决但服务器压力过大问题:中间的命名节点仍然存在,这里画漏了
读写分离:
就是把服务器端的select和增删改操做分离开来,对每个数据库作标识(read-->只作select操做,write-->只作增删改操做)
读写分离是有主从概念的,并非真的有主库和从库的区分,是有这个概念,读为主,写为从。
上图使用的是独写分离加上分库分表,这两种方式能够同时使用,也能够分开单独使用,并不冲突