如果搭建一个可以承载很大的访问量的WEB服务,那应该是是怎样构建的呢。
如:一台主机构建LAMP或者LNAMP(Linux+nginx+apache+mysql+php),其中NGINX很容易服务于静态内容,性能很好,很容易承载更多的并发链接,NGINX有两个作用:1、对所有静态内容可以直接反馈;2、对所有动态内容通过反向代理的方式发送给AMP(apache+mysql+php构建成动态服务器,其中APACHE不服务于静态内容,只服务于动态内容)。如下图
由于LAMP构建在一台主机上随着用户的增加,对LNAMP的并发访问量激增,该服务器不能承载众多的请求,于是将其在一台主机上的LNAMP分层切割成两台主机,第一台主机提供NGINX,在本地服务于静态内容,同时对所有冬动态内容反向代理给第二个服务器的AMP,这样,80%的静态内容由NGINX处理,20%的动态内容交给AMP处理,因此,这个系统的承载能力就相应得到了提升。如下图
但由于用户数量的继续增加,前端的NGINX仍旧可以正常处理请求,但后端AMP的承载能力不足。这样就再次切分,将AP放在一个主机上,MYSQL放在另一台主机上(因为MYSQL资源需求量较大,既消耗内存,又消耗cpu),这样所有动态内容中的80%为程序运行处理数据,只有20%会用到数据库,这样MYSQL和AP的压力都会变小。如下图,但是MYSQL处理的速度<AP的处理速度<NGINX的处理速度,这样就需要添加缓存来应对处理速度不匹配的情况,所以就要再次扩展。如下图
随着用户访问量的继续增加,NGINX和AP可能无压力,但MYSQL压力变大,现在就需要在MYSQL外部添加公共缓存(键值存储,旁挂式缓存,缓存中的数据为热点数据,也可以做集群,不过存在的问题较多,如要达到精准的查询,需要一些算法(除模取余法,一致性哈希环)才能得以实现,且在数据频繁更新的情况下用处不大),这样,当AP需要查询数据时,先询问公共缓存,如找到数据,则直接返回,如未找到数据,则进入MYSQL查询。同样,当NGINX上有动态内容需要向AP请求,而AP中程序生成的文件有很多是不变的,因此在AP的前端也可以加增缓存(键值存储,穿透式缓存),这样,NGINX直接向缓存发请求,有则返回,无则由缓存向AP发请求,如果设计得当,则80%动态请求由缓存直接返回,这样就减少了AP的压力,同时NGINX前端响应性能也会得到相应提升。如下图
不仅在系统内可以搭建反向代理缓存,在用户和NGINX中间也可有反向代理缓存,在用户请求时首先请求的是反向代理服务器,如80%的服务在反向代理缓存上得到返回,则又减轻了系统整体的负担,这样,层层添加缓存,即加速了服务,又减轻了系统的压力。如下图
如果用户到系统之间的缓存不够的话,还可以做CDN,在全国各地的机房中部署缓存服务器,如请求的内容不在该缓存服务器中的话,再由该缓存服务器向上层缓存服务器请求,按层级划分的缓存服务器请求都没有后再向主机房内服务器发起请求,再经过如上图的流程。这样就极大的减少了系统的负载。
如果再不行的话,可以遵循以下三点:
1、 在系统内出问题的环节做集群吧(对于MYSQL做主从或切片);
2、 面壁;
3、 换份工作。
以上内容如有偏颇,望指正。
原文地址:http://cthlj.blog.51cto.com/9694348/1655094