1.DNS负载均衡:DNS是最简单也最常见的负载均衡方式,一般用来实现地理级别的均衡,比如,北方的用户访问北京的机房,南方的用户访问上海的机房。DNS的本质是一个域名可以在DNS中对应多个IP地址,不同地域的用户在请求DNS服务时,DNS服务器会根据请求来源IP,解析出距离用户最近的服务器IP地址,实现就近访问。大多网站使用DNS作为第一级的负载均衡方式,一般情况下DNS负载均衡中心会将请求转发到CDN、机房级别的反向代理,网关等。DNS负载均衡的优点是通⽤(全球通⽤)、成本低(申请域名,注册DNS即可),但缺点也⽐较明显,主要体现在: 1).缓存的时间⽐较⻓,即使将某台业务机器从DNS服务器上删除,由于缓存的原因,还是有很多⽤户会继续访问已经被删除的机器。2).不够灵活。DNS不能感知后端服务器的状态,只能根据配置策略进⾏负载均衡,⽆法做到更加灵活的负载均衡策略。
2.硬件负载均衡:是通过单独的硬件设备来实现负载均衡功能,⽬前业界典型的硬件负载均衡设备有两款:F5和A10。这类设备性能强劲、功能强⼤,但价格都不便宜,⼀般 只有“⼟豪”公司才会考虑使⽤此类设备。普通业务量级的公司⼀是负担不起,⼆是业务量没那么⼤,⽤这些设备也是浪费。硬件负载均衡的优点是: 1).功能强⼤:全⾯⽀持各层级的负载均衡,⽀持全⾯的负载均衡算法,⽀持全局负载均衡。 2).性能强⼤:对⽐⼀下,软件负载均衡⽀持到10万级并发已经很厉害了,硬件负载均衡可以⽀持100万以上的并发。3). 稳定性⾼:商⽤硬件负载均衡,经过了良好的严格测试,经过⼤规模使⽤,稳定性⾼。 4).⽀持安全防护:硬件均衡设备除具备负载均衡功能外,还具备防⽕墙、防DDoS攻击等安全功能。 硬件负载均衡的缺点是: 价格昂贵,扩展能⼒差:硬件设备,可以根据业务进⾏配置,但⽆法进⾏扩展和定制。
3.软件负载均衡:通过负载均衡软件实现负载均衡,常见的有nginx和lvs,其中lvs是四层负载均衡,nginx是七层负载均衡,四层与七层负载均衡的区别就在于协议和灵活性,nginx支持http和e-mail协议,四层处于网络层,与协议无关,几乎所有应用都可以做,比如数据库等,七层负载均衡的优势是其理解应用层协议,可以基于此做应用相关的扩展,比如失败重试;相比硬件负载均衡,软件负载均衡特点是灵活,可自行开发扩展,价格优惠(1台普通linux服务器价格1万元左右)
3.1 四层负载均衡:在网络层(IP层)做负载均衡,LVS就工作在这一层,LVS支持三种模式
3.1.1.VS/NAT,利用网络地址转换(net address translation)技术修改IP报文的源IP地址以及目的IP地址,请求与响应都经过调度器。使用linux服务器做VS/NAT调度时,在来自外部的IP数据包通过网卡进入某个进程的内存地址空间之前,都要先经过内核缓冲区。那么此时Linux就拥有对IP数据包的绝对操作权,Linux内核可以改变IP数据包以实现对路由规则的改变。实现IP转发,由于转发在内核中进行,相对于工作在用户态的反向代理,效率要高很多
3.1.2.VS/TUN,利用IP隧道技术将请求报文转发至真实服务器,而真实服务器的响应直接返回客户端,不经过调度器,性能比NAT模式好很多
3.1.3.VS/DR,通过修改请求报文的MAC地址,将请求转发到真实服务器,真实服务器的响应直接返回给客户端,不经过调度器,省去了IP隧道的开销,性能最优。DR模式下,调度服务器和多个真实服务器共享一个VIP(虚拟IP),请求报文到达调度器后,调度器将报文的目的MAC地址改为某一个真实服务器的MAC地址,然后将请求转发过去,之后响应由该真实服务器直接返回给客户端
LVS的后两种模式下,由于响应都不经过调度器,除了响应速度更快以外,还可以节省大量网络带宽。LVS原理简单,调度时消耗很小,所以性能比应用层负载均衡高,其性能级别在十万级,由于LVS工作在网络底层,具有更好的通用性,但也正因如此,它无法获悉应用层的协议细节,也就无法做出应对,比如应用响应超时异常等错误,LVS是无法了解到的,而应用层负载均衡就可以应对
3.2七层负载均衡:应用层的负载均衡,其作为应用服务器的上层,会设置内外两个网卡,对外接受并响应客户端请求,对内将客户端请求转发给应用服务器并接受应用服务器的返回。nginx是应用层负载均衡的典型代表,性能级别在万级,一台普通的linux服务器装上nginx大约能达到5万/秒tps
应用层负载均衡由于可以获取应用层协议的细节,所以其能力非常强大而灵活,比如上面说的超时异常错误,nginx服务器在收到此类响应时,可以选择重试其他真实服务器实现容错