服务器负载均衡
当一个Web系统从日访问量10W增长到1000W,甚至超过1亿的过程中,Web服务器承受的压力就会越来越大,为了解决性能压力带来的问题,我们需要在Web系统架构方面搭建多个层次的缓存机制.
1.web负载均衡
简单的说就是给我们的服务器集群分配工作,而采用恰当的分配方式,对于保护处于后端的web服务器来说,非常重要。
用户--》负载均衡--》后端服务器集群。
负载均衡的策略很多,我们从原理上开始说!
(1)HTTP重定向
当用户发来请求的时候,web服务器通过修改响应头的Location来返回一个新的URL,然后浏览器继续请求这个新的URL,实际上就是页面重定向,通过重定向来达到负载均衡的目的。重定向非常容易实现,但是在大规模的访问量下,性能不佳,而且用户体验也不是很好,
(2)反向代理
反向代理服务的核心是转发http请求,因为它工作在http层(应用层),也就是OSI模型的第7层,因此也叫‘7层负载均衡',常见的是nginx.
nginx是一种非常灵活的反向代理的软件,可以自由的定制转发的策略,分配服务器流量权重,反向代理中,常见的一个问题就是web服务器存贮session数据,负载均衡一般是随机分配的,无法保证同一用户下次一定分配到相同的机器上,导致session无法找到!
解决方案:1.让同一个用户的请求一定落到同一台机器上(分析COOKIE),但是负载的转发规则也会消耗更多的cpu资源。2.将session这类的信息存放到专门的服务器,像memcache,redis,一般简单可靠。3.将session数据存到数据库中,但是速度较慢。
反向代理服务的实现和部署是很简单的,性能表现也好,但是它有’单点故障‘的问题,如果挂了,会带来很多问题,而且到了后期web服务器继续增加,它本身可以成为系统的瓶颈。
(3)ip负载均衡
ip负载均衡工作在网络层,比起工作在应用层性能要高出许多,它是对IP层的数据包的IP地址和端口信息进行修改,这种方式称为’四层负载均衡‘,常见的方式是LVS(LINUX 虚拟服务)
IP负载均衡的性能要高出nginx反向代理,但是配置较为复杂。
(4)DNS负载均衡
DNS负责域名解析的服务,域名URL实际上是服务器的别名,实际映射是一个IP地址,解析过程是DNS完成域名到IP地址的过程,而一个域名是可以对应多个IP的,因此,DNS也就可以作为负载均衡服务。这种负载均衡策略,配置简单,性能极佳,但是不能定义路由规则,还存在DNS生效延迟问题。
我们常用的CDN的实现方式,其实就是在同一个域名中映射为多个IP的基础上更进一步,通过GSLB,按照指定的规则映射域名的IP,一般情况都是按照地理位置,将离用户近的IP返回给用户,减少网络传输中路由节点之间的的跳跃损耗。CDN在web系统中,一般情况下是用来解决大小较大的静态资源的加载问题,让这些比较依赖网络下载的内容,尽可能的离用户更近,这种方式性能极佳,支持配置多种策略,但是搭建和维护成本很高,大公司会自建CDN,小公司使用第三方CDN。