负载均衡是指服务器性能达到极限时通过服务器集群来横向增加系统的吞吐量和性能。
一、服务器负载均衡
服务器负载均衡就是我们平时所说的负载均衡,是指在服务器上游做服务请求分发,常用的方式有:
(1)DNS域名解析负载均衡:假设我们的域名指向了多个IP地址,当一个域名请求过来时,DNS服务器进行域名解析将域名转换为IP地址,在1:N的映射转换中实现负载均衡。DNS服务器提供简单的负载均衡算法,但当其中某台服务器出现故障时,通知DNS服务器移除当前故障IP
(2)反向代理负载均衡:反向代理只针对服务器。代理服务器接受请求,通过负载均衡算法,将请求转发给后端服务器,后端服务返回给代理服务器然后代理服务器返回到客户端。反向代理服务器的优点是隔离后端服务器和客户端,使用双网卡屏蔽真实服务器网络,安全性更好,相比较于DNS域名解析负载均衡,反向代理在故障处理方面更灵活,支持负载均衡算法的横向扩展。目前使用非常广泛。
(3)IP负载均衡:我们都知道反向代理工作在HTTP层,本身开销相对大一些,对性能有一定影响,LVS-NAT是一种位于传输层的负载均衡,它通过修改接受的数据包目标地址的方式实现负载均衡。Linux2.6.x以后版本内装了IPVS,专注用于实现IP负载均衡,故而在Linux上IP负载均衡使用非常广泛。LVS-DR工作在数据链路层,比LVS-NAT更霸道的时候它直接修改数据包的MAC地址。LVS-TUN基于IP隧道的请求转发机制,将调度器收到的IP数据包进行封装,转交给服务器,然后服务器返回数据,通过服务器实现负载均衡。这种方式支持跨网段调度。LVS-DR和LVS-TUN都适合请求和响应不对称的Web服务器,如何从它们中高做选择,取决于你的网络部署需要。
二、客户端负载均衡
相比较服务器负载均衡而言,客户端负载均衡是一个非常小众的概念。
客户端负载均衡和服务器负载均衡的核心差异:在服务列表本身,客户端负载均衡服务列表通过客户端维护,服务器负载均衡服务列表由中间服务单独维护。
(1)SpringCloud分布式框架组件Ribbon用来定义客户端负载均衡:我们在使用SpringCloud分布式框架时,同一个service同时启动多个,当一个请求过来时,那么这么多个service,Ribbon通过策略决定本次请求使用哪个service的方式就是客户端负载均衡。在SpringCloud分布式框架中客户端负载均衡对开发者时透明的,添加@LoadBanaced注解就可以了。
(2)RPC框架Dubbo的负载均衡:application.properties中配置
#服务端端的负载均衡
dubbo.provider.loadbalance= roundrobin(轮询) /random(随机)/leastActive(最少活跃调用数)/consistentHash(一致性hash)
通过对以上知识的理解,大家能够杜负载均衡有较为全面的认识,常见的负载均衡算法:
· 随机:通过随机选择服务进行执行,一般这种方式使用较少
· 轮询:负载均衡默认实现方式,请求来之后排队处理
· 加权轮询:通过对服务器性能的分析,给高配置、低负载的服务器分配更高的权重,均衡各个服务器的压力
· 地址hash:通过对客户端请求的地址的hash值取模映射进行服务器调度
· 最小连接数:即使请求均衡了,压力不一定均衡,最小连接数法就是根据服务器的情况,比如请求积压等参数,将请求分配到当前压力最小的服务器上
参考资料:
http://www.luyixian.cn/news_show_37070.aspx
https://blog.51cto.com/13593129/2398217