1高并发访问(访问量大):
一般传统网站并发量在1000以上,就可以赚钱了.如果服务器遇到大规模的访问,如果不做优化,不做升级,架构不升级,网站是承受不了这么大的并发量.这样用户的体验度不是很好。
2海量数据存储问题(大数据):
用户一多,数据就会多,比如说淘宝网站,几亿用户注册,数据存入到数据库当中,从一个数据库查询出相应的数据,就算表的字段加上索引,也要花费大量的时间来查询,从而导致用户体验度不是良好。
面对这两个问题我们必须对架构进行优化,如果不做优化很难满足用户高并发访问,大数据存储。
1.要求前端页面必须美观,大气,上档次,(好实现)
2.后台系统必须具有流畅的运行效果(不好实现),—>要是系统具有流程的运行效果,就必须经过项目的一系列优化,具体哪些优化呢?
2.1.数据层的优化
2.2:项目层优化
2.3:应用层优化
互联网项目架构思想:
服务器就是项目的意思,项目上线就需要部署服务器里面,服务器在互联网项目当中不存在单机版的,一定是集群,来分担服务器压力(因为并发量太高),如上图,我们部署4台服务器.
我们的mysql数据库也要采用集群的方式,单机版是不可能满足我们搜索需求的.
上面的服务器中的项目要访问下面的数据库,由于数据库本身结构的限制导致查询效率不是很高(数据库都是从前到后依次扫描,如果加上索引,扫描速度会快点),但我我们想一想,是服务器项目的压力大,还是数据库的压力大?当然是数据库的压力大,比如我访问一个页面,这个页面要查询非常多的数据,比如我们上京东
这个页面上有分类数据1,导航数据2,广告数据3…所有的分类模块都要发送一条sql语句去数据库查询,所以每次刷新网页,加载整个页面会发送上百次sql语句查询数据库.所以所数据库面临的压力是远远大于服务器项目的.
同时由于数据库查询效率的问题,横容易造成数据库io阻塞,什么叫io阻塞,就是我们从数据库查询数据,查询的数据统统从io流出来,但是并发量太高的话,数据都会堵塞在流当中,最后就会造成数据库的崩溃。
如果采用非常多的集群的话,性能不升反降,同时成本太高.所以所数据库面临频繁的读取数据的问题。
所以我们在服务器项目集群和数据库集群之间加上redis缓存服务器,同时缓存服务器也采用集群的方式,这样项目就会先加载缓存当中的数据,如果缓存没有数据,再查mysql数据库,同时把数据放入缓存当中,那么加入redis数据库缓存有什么好处呢?1减轻数据库压力.2提高查询效率,尤其是redis的查询效率,所以当redis缓存服务器集群一加,完全满足高并发访问。
同时我们还需要搜索优化,我们使用ES索引库进行搜索,我们在项目服务器集群和mysql数据库集群之间创建一个ES项目来访问索引库。
由于服务器是集群的方式搭建的,所以我们并不知道让哪一个项目服务器来完成请求,那么怎么解决我们的请求发给哪一个服务器?
在项目服务器的上面,必须要有一个负载均衡nginx服务器(官方测试 nginx 能够支支撑 5 万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定。)
同时也采用集群的方式,那么用户会把请求发给nginx服务器,nginx服务器就会自动决定将请求转发给一台项目服务器,但是由于nginx采用了集群的方式,每一台nginx服务器都会完成负载均衡,那么请求来了,我们到底将请求交给那一台nginx服务器呢?
这就存在一个问题:
最顶层也采用集群,意味着我们要对这个集群再次做负载,可以这么说,凡是集群,都要做负载均衡。
如果我们一直采用集群,就会一直向上循环,这个架构就一直往上顶,在最高层,必须只有一台服务器,不然就会处于无限的循环当中,我们nginx服务器采用主备的方式,备份机(监控主机有没有挂,一旦挂了,就立马充当主机,相当于有两条命,达到一个高可用的作用),相当于目前就一台nginx服务器,所以就不会出现无限的循环集群。
=====================================================
对于session如何共享问题?
用户第一次访问服务器1,在此服务器上产生一个名字jack,当这个服务器宕机了,用户请求转移服务器2,但是这个服务器并没有jack名字信息,由于是两个不同的pc,不同的服务器,那么怎么实现session数据共享问题呢?
可以使用tomcat集群session复制功能,把用户的信息直接广播给每一个集群服务器,但是这样不行,如果服务器1当中有1亿个session信息,sessipn数据量非常庞大,那么在传输过程中可能会卡死,这种方式在传统项目当中可以使用,但是在互联网项目当中,这种方式不可取.
另一种方式就是使用第三方服务器来存储我们的session数据,使用redis服务器来存储session数据,当请求一访问服务器1,服务器1就把数据放在redis服务器当中,如果服务器2想要数据的话,就去redis服务器当中查询就行了,这就实现了session共享.
集群:就是干同样的事情,
分布式:就是干不同的事情