前段时间有位网友问我如何配置一个能承受高并发的网站,由于当时时间紧迫,我就让他先自己去查资料,今天就来聊聊这个问题。
当一个 Web 系统从日访问量十万增长到千万甚至亿以上时,Web 服务器的压力就会越来越大。在这个过程中,我们会遇到很多问题。为了解决这些性能压力带来的问题,我们需要在 Web 系统架构层面构建多级缓存机制。在不同的压力阶段,我们会遇到不同的问题,可以通过构建不同的服务和架构来解决。
Web 负载平衡
Web服务器负载均衡(Load),简单来说就是将“工作任务”分配给我们的服务器集群,采用合适的分配方式对于保护后端的Web服务器非常重要。
负载均衡策略有很多种,我们先从原理说起。
1、HTTP重定向当用户发送请求时,Web服务器通过修改HTTP响应头中的标签,返回一个新的URL,然后浏览器继续请求这个新的URL,这其实就是页面重定向。通过重定向,达到了“负载均衡”的目的。比如我们下载PHP源码包的时候,当我们点击下载链接的时候,为了解决不同国家和地区下载速度的问题,它会返回一个离我们比较近的下载地址。重定向的HTTP返回码是302,如下图:
如果使用PHP代码实现该功能,方法如下:
这种重定向实现起来非常简单,可以定制各种策略,但是在大规模流量下性能较差,用户体验也不好,实际请求被重定向,增加了网络延迟,一般不采用这种方式。
2、反向代理负载均衡 反向代理服务的核心工作是转发HTTP请求,起到浏览器和后端Web服务器之间的中转作用。由于它工作在HTTP层(应用层),也就是七层网络结构中的第七层,所以又被称为“七层负载均衡”。可以做反向代理的软件有很多,比较常见的有Nginx等。
Nginx 是一款非常灵活的反向代理软件,可以自由定制转发策略,分配服务器流量权重等。反向代理中一个常见的问题就是数据在 Web 服务器上的存储,因为一般的负载均衡策略都是随机分配请求,同一个登录用户的请求无法保证分配到同一个 Web 机器上,这样就会导致找不到请求的问题。
主要有三种解决方案:
配置反向代理的转发规则,让同一个用户的请求发到同一台机器(经过解析)。复杂的转发规则会消耗更多的CPU,增加代理服务器的负担。
这类信息存储在单独的服务中,例如 redis/。一般采用这种方式,可靠又简单。
存放到数据库中,比如MySQL,以前也是常用的,但是响应速度比2慢。
反向代理服务也可以启用缓存,如果启用,会增加反向代理的负担,需要谨慎使用。这种负载均衡策略实现和部署非常简单,性能也比较好。但它存在“单点故障”的问题,一旦发生故障,会带来很大的麻烦。而且,在后期,如果Web服务器数量继续增加,它本身可能就会成为系统的瓶颈。
3. IP负载平衡
IP负载均衡服务工作在网络层(修改IP)和传输层(修改端口,第四层),其性能远高于工作在应用层(第七层)。其原理是在IP层修改数据包的IP地址和端口信息,达到负载均衡的目的。这种方式也叫“四层负载均衡”。常见的负载均衡方式有LVS(Linux,Linux ),通过IPVS(IP,IP )实现。
当负载均衡服务器收到客户端发来的IP包后,会修改该IP包的目标IP地址或者端口,然后原封不动地投递给内部网络,数据包则流入实际的Web服务器,实际服务器完成处理后再将数据包投递回负载均衡服务器,负载均衡服务器再将目标IP地址修改为用户的IP地址,最后返回给客户端。
以上这种方式就叫做LVS-NAT,除此之外,还有LVS-RD(直接路由)和LVS-TUN(IP隧道),三者都属于LVS方式,但是又有一定的区别,限于篇幅,我就不细说了。
IP负载均衡的性能比Nginx反向代理高很多,它只对数据包进行处理直到传输层,不再进一步打包,直接转发到实际的服务器,但是它的配置和搭建相对复杂。
4.DNS负载平衡
DNS(Name)是负责域名解析的服务。域名URL其实是服务器的一个别名,实际映射的是IP地址。解析过程就是DNS完成域名到IP地址的映射。一个域名可以配置对应多个IP地址。因此DNS也可以作为负载均衡服务,DNS负载均衡也是比较常用的。
这种负载均衡策略配置简单,性能优异。但是不能自由定义规则,更换映射IP或者机器故障时比较麻烦。还存在DNS生效延迟的问题。
5、DNS/GSLB负载均衡我们常用的CDN(内容分发网络)实现方式,其实是在将同一个域名映射到多个IP的基础上更进一步,通过GSLB(全局负载均衡, Load )将域名的IP按照指定的规则进行映射。总体来说就是根据地理位置将距离用户最近的IP返回给用户,减少了网络传输中路由节点之间的跳转消耗。
图中“向上查找”的实际过程是,LDNS(Local DNS)先从根域名服务(Root Name)获取最顶层的根Name(比如.com),然后获取指定域名的授权DNS,进而获取实际的服务器IP。
在Web系统中,一般会使用CDN来解决大型静态资源(html/Js/Css/等)的加载问题,让这些比较依赖网络下载的内容尽可能的靠近用户,提高用户体验。比如我在(腾讯自建的CDN,不使用域名的原因是为了避免http请求时带上不必要的信息)上访问一张图片,获取到的IP是183.60.217.90。
这种方式和之前的DNS负载均衡一样,不仅性能优异,还支持多种策略的配置,但是建设和维护成本非常高,一线互联网公司会自建CDN服务,中小型公司一般会使用第三方提供的CDN。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。