负载均衡的解决方案
前言
我们在设计分布式系统的时候往往需要考虑系统的伸缩性,这里所说的伸缩性指的是我们可以通过添加服务器节点的方式来提升我们整个系统的并发能力,这种提高伸缩性的基础原理其实就是我们所说的——负载均衡。
正文
负载均衡
负载均衡是网站必不可少的基础技术手段,不但可以实现网站的伸缩性,同时还改善网站的可用性。
负载均衡算法
- 轮询:所有请求被依次分发到每台应用服务器上,即每台服务器需要处理的请求数目都相同,适合于所有服务器硬件都相同的场景。
- 加权轮询:在轮询的基础上,按照配置的权重将请求分发到每个服务器,高性能的服务器能分配更多的请求。
- 随机:请求被随机分配到各个应用服务器,即使应用服务器配置不同,可以加权随机算法。(这种方法最常用)
- 最小连接:记录每一个应用服务器正在处理的连接数,将新的请求分发到最少连接的服务器,也支持加权最小连接。
- Hash选择:对请求的
IP
地址进行hash
计算,实现同一个IP地址的请求总在一个服务器上处理。(实现对有状态应用服务器高可用的一种方式)
负载均衡与反向代理的差异:
- 负载均衡时基于反向代理来实现的.
- 反向代理每一种应用服务器只有一个,它会负责把请求完成。(点对点模式)
- 负载均衡是一种应用服务器可能有多个,它只负责把请求分发到特定的应用服务器中。(它不会告诉前端请求是否响应 只负责传输数据)
四层负载均衡与七层负载均衡的区别
- 四层交换机通过解析
TCP
头等协议的内容,来决定分流的目的地; - 七层交换机则通过解析软件应用层的内容来决定分流的目的地。
- 四层是基于
IP+端口号
进行负载均衡的,七层是基于URL
进行负载均衡的。 - 七层对负载均衡的设备要求更高,性能方面比四层弱。
- 七层负载均衡更加智能化,安全性上更加有保障。
负载均衡实现方案
常见负载均衡的方法有:
- 利用Http重定向负载均衡:即利用
nginx
中的rewirte
模块来实现。(客户端行为,不需要服务器转发响应,这种方法性能比较差) - DNS域名解析负载均衡:
DNS
负载均衡的控制权在域名服务商中,通常作为第一级负载均衡手段。(不需要服务器转发响应) - 反向代理负载均衡:即利用
nginx
中的upstream
模块来实现(配置简单,但性能也有局限性,响应要通过反向代理服务器返回给客户端) - IP负载均衡:即利用网关服务器实现负载均衡(性能有提升,响应要通过网关服务器,受限于其网卡带宽)
- 数据链路层负载均衡:在通讯协议的数据链路层修改
mac
地址进行负载均衡。(不需要服务器转发响应,最常见的是LVS
)
通过硬件方式实现
F5服务器
- 优点:能够直接通过智能交换机实现,处理能力更强,而且与系统无关,负载性能强更适用于一大堆设备、大访问量、简单应用。
- 缺点:成本高,除设备价格高昂,而且配置冗余.很难想象后面服务器做一个集群,但最关键的负载均衡设备却是单点配置,无法有效掌握服务器及应用状态。
通过DNS方式实现
DNS负载均衡的实现
可以利用DNS,进行域名解析(但是由于DNS的缓存机制 高可用难以实现)
DNS(Domain Name System,域名系统)
,万维网上作为域名和IP
地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP
数串。
通过软件方式实现
软件负载均衡的四种实现方案:
LVS
,即Linux
虚拟服务器,即使用ipvsadm
Nginx
HAProxy
- 基于
Gossp
实现无中间点的软件负载,如Facebook
的Cassandra
知识点:
LVS
实施及配置还有维护过程就比较复杂 不常使用- 对于
Http
协议,Haproxy
处理效率比Nginx
高。 - 一般场景,建议使用
Haproxy
来做Http
协议负载,但如果是Web
,那么建议使用Nginx
。
LVS
LVS提供了三种具体的实现方式:
- LVS-NAT(IP负载均衡):请求和响应都会通过代理服务器。
NAT
为地址转换技术. - LVS-DR(直接路由,不可跨子网,最常用):只会修改链路层报文,不会更改原有的
IP
报文和TCP
报文。请求会通过arp协议+MAC
发送到指定服务器,响应会直接发回给服务器。 - LVS-TUN(IP隧道,可以实现跨子网):工作机制与
DR
类似,但是采用IPIP隧道协议。
知识点
- arp地址解析协议:借助
arp
地址解析协议可以利用MAC
地址将子服务器之间与IP
地址进行绑定 - MAC多路访问控制:它是一种信道划分技术, 用分布式算法决定结点如何共享信道,即决策结点何时可以传输数据。
借助代理服务器,实现请求的分发(NAT模式)
- 代理服务器:提供了 公网IP:
115.39.19.22
局域网IP:192.168.0.100
- 功能:将请求IP报文中的目的地 从
公网IP
转换成局域网IP
- 修改请求中的链路层报文、
IP
数据报、TCP
报文涉及了LVS
技术,即Linux
虚拟服务器技术。 - 要注意的是
IP
是网络层协议、TCP
是传输层协议、HTTP
是应用层协议
请求IP数据报
请求响应分离(DR模式)
- 借助
arp
地址解析协议可以利用MAC
地址 将子服务器之间与IP
地址进行绑定,借助代理服务器将arp
广播出去。 - 实现响应跳过代理服务器,请求的转发从网络层(跨
IP
传输) 转换成数据链路层,这样本地传输,一定程度提高了安全。
总结
我们实际在使用负载均衡的时候通常会涉及到失效转移,一般来说如果请求不存在业务状态时(如涉及用户信息)可以直接使用负载均衡机制来切换其它节点来处理请求,但是如果该请求是有业务状态需要结合session
共享的方案来实现。
具体的实现可参考我的博客:Tomcat负载均衡时实现session共享