一、负载均衡分类
(1)软硬件分类
负载均衡可以通过负载均衡软件实现,也可通过硬件负载均衡器实现。
(2)硬件负载均衡
硬件负载均衡器的性能稳定,且有生产厂商作为专业的服务团队。但其成本很高,一台硬件负载均衡器的价格一般都在十几万到几十万,甚至上百万。知名的负载均衡器有F5、Array、深信服、梭子鱼等
(3)软件负载均衡
软件负载均衡成本几乎为零,基本都是开源软件。例如,LVS、HAProxy、Nginx等。
(4)负载均衡工作层分类
负载均衡就其所工作的OSI(开放系统互联模型)层次,在生产应用层面分为四类:
- 七层负载均衡L7:应用层负载均衡,基于HTTP协议的。其是通过虚拟的URL将请求分配到真实的服务器。其一般应用于基于HTTP协议的B/S架构系统。Nginx提供的就是L7负载均衡。
- 四层负载均衡L4:传输层负载均衡,基于TCP协议的。其是通过虚拟IP+端口号的形式将请求分配到真实的服务器。其一般应用于C/S架构的ERP系统中。F5与LVS均提供的是L4负载均衡。Nginx Plus提供的也是四层负载均衡。
- 三层负载均衡L3:网络层负载均衡,基于IP协议的。其是通过虚拟IP的形式将请求分配到真实的服务器。有些DNS提供的是L3负载均衡。
- 二层负载均衡L2:数据链路层负载均衡,其是通过虚拟MAC地址的形式将请求分配到了真实的服务器。有些DNS提供的是L2的负载均衡。
二、负载均衡的实现
(1)总体规划
该机群包含一台Nginx服务器,两台Tomcat服务器。将前面打过包的web工程直接部署到两台Tomcat主机上。然后,在Nginx服务器上设置对这两台Tomcat主机的负载均衡
(2)新建nginxweb项目
新建java目录
选择Mark Diretory as再选择Sources Root下
(3)编辑项目
新建servlet
package nginx.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/some")
public class SomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.println("Nginx Ip = " + request.getRemoteAddr());
writer.println("Tomcat Ip = " + request.getLocalAddr());
}
}
pom.xml文件添加Servlet与JSP依赖
<!-- Servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- JSP依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
编辑jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>webdemo</title>
</head>
<body background="images/bj.jpg">
Nginx World Welcome You!<br>
Nginx Addr = ${pageContext.request.remoteAddr} <br>
Tomcat Addr = ${pageContext.request.localAddr} <br>
</body>
</html>
(4)tomcat配置以及部署
apache-tomcat-8081配置文件server.xml 修改
apache-tomcat-8082配置文件server.xml 修改
说明:因为是一台服务器配置,为了端口不冲突,所以这样修改。
两台tomcat部署项目
为了看到效果,部署在apache-tomcat-8081的SomeServlet类内容:
部署在apache-tomcat-8082的SomeServlet类内容:
(5)Nginx配置
(6)效果
三、Nginx负载均衡策略
Nginx内置了三种负载均衡策略,另外,其还支持第三方的负载均衡。而每种负载均衡主机根据负载均衡策略的不同,又可设置很多性能相关的属性
(1)轮询
默认的负载均衡策略,其是按照各个主机的权重比例依次进行请求分配的。该策略适用的场景是:根据主机性能设置不同权重。
对于每台主机,除了像weight一样可以设置的属性外,还可以设置如下属性
- fail_ timeout:表示当前主机被Nginx认定为停机的最长失联时间,默认为10秒。常与max_fails联合使用。
- max_fails:表示在fail_timeout时间内最多允许的失败次数。
- backup:表示当前服务器为备用服务器。
- down:表示当前服务器永久停机。
(2)ip_hash
指定负载均衡器按照基于客户端IP的分配方式,该策略确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话,解决了session不能跨服务器的问题
需要注意:
- 适用场景为有状态服务。
- 在Nginx1.3.1版本之前,该策略中不能指定weight属性。在一个客户端首次访系统时,采用的是根据权重进行分配的轮询策略。
- 此策略不能与backup同时使用。
- 当有服务器被Nginx认为停机后,必须手动指定该主机为down,否则请求仍会落到该服务器。
(3)least_conn
四、Nginx Plus的四层负载均衡实现
Nginx Plus是Nginx的商业版,其官网是: https://nginx.com
同样是修改nginx.conf文件,添加一个stream模块,其与events、http等模块同级。在其中配置upstream{}与server{}模块。此时需要注意,通行代理配置在server{}中,且不能再是http://开头的了,因为其负载均衡协议不再是HTTP协议了。
https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/