nginx-负载均衡
前言
负载均衡(又称为负载分担),英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
一、什么是负载均衡集群技术
-
负载均衡
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。 -
集群
集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。集群组成后,可以利用多个计算机和组合进行海量请求处理(负载均衡),从而获得很高的处理效率,也可以用多个计算机做备份(高可用),使得任何一个机器坏了整个系统还是能正常运行。 -
负载均衡集群技术
负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。
负载通常包括应用程序处理负载和网络流量负载,每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。
二、负载均衡技术的实现
负载均衡(Load Balance)
负载均衡技术类型:基于 4 层负载均衡技术和基于 7 层负载均衡技术
负载均衡实现方式:硬件负载均衡设备或者软件负载均衡
硬件负载均衡产品:F5 、深信服 、Radware
软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)
- 实现效果图
三、负载均衡的分类
负载均衡根据所采用的设备对象(软/硬件负载均衡),应用的OSI网络层次(网络层次上的负载均衡)等来分类。根据应用的 OSI 网络层次来分类的两个负载均衡类型。
负载均衡可以大概分为以下几类:
- 二层负载均衡(mac)
一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应。 - 三层负载均衡(ip)
一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应。 - 四层负载均衡(tcp)
在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器。 - 七层负载均衡(http)
根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。
四层负载均衡
实现四层负载均衡的产品有:
- F5:硬件负载均衡器,功能很好,但是成本很高。
- lvs:重量级的四层负载软件
- nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
- haproxy:模拟四层转发,较灵活
七层负载均衡
实现七层负载均衡的软件有: - haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;
- nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
- apache:功能较差
-
Mysql proxy:功能尚可。
由于在实际应用中,我们比较常用的是四层负载及七层负载。这里也重点说下这两种负载。
在这里插入图片描述
四层负载架构设计比较简单,无需解析具体的消息内容,在网络吞吐量及处理能力上会相对比较高,而七层负载均衡的优势则体现在功能多,控制灵活强大。在具体业务架构设计时,使用七层负载或者四层负载还得根据具体的情况综合考虑。
二、操作步骤
-
nginx四层负载均衡及七层负载均衡
- nginx既有四层的负载均衡也有七层的负载均衡
-
代理实现
在这里插入图片描述
七层负载均衡
1.首先准备三台机器,其中两台为真实服务器,一台为proxy代理服务器并且关闭防火墙及linux确保三台机器之间可以被互相访问到。
- 192.168.253.176 webserver1
- 192.168.253.178 webserver2
- 192.168.253.189 nginx-proxy
2.在webserver1和webserver2两台机器上分别部署一个简单的页面用于测试。为了能够更好的体现出负载均衡,这里的两台服务器分别设置不同的内容。
如果有需要可以参考关于nginx的文章
- server1
[root@server1 ~]# yum -y install nginx
[root@server1 ~]# systemctl start nginx
[root@server1 ~]# systemctl enable nginx
[root@server1 ~]# echo "hello world!" >/usr/share/nginx/html/index.html
[root@server1 ~]# curl 127.0.0.1
hello world!
- server2
[root@server2 ~]# yum -y install nginx
[root@server2 ~]# systemctl start nginx
[root@server2 ~]# systemctl enable nginx
[root@server2 ~]# echo "hi world!" >/usr/share/nginx/html/index.html
[root@server2 ~]# curl 127.0.0.1
hi world!
3.在ngonx-proxy 代理服务器上进行配置
upstream配置
这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法.
upstream testapp {
server 192.168.253.178:80;
server 192.168.253.176:80;
}
server {
....
location / {
proxy_pass http://testapp; #请求转向 testapp 定义的服务器列表
}
- upstream支持的几种算法
- A、
轮询(默认)
:每个请求按时间顺序逐一分配到不同的后端服务器; - B、
ip_hash
:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。 - C、
url_hash
:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。 - D、
fair
:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx
本身是不支持fair
的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair
模块。
- A、
配置实例参考
热备:如果你有两台服务器,当一台服务器发生故障时,才启用第二台服务器提供服务;
upstream myweb {
server 192.168.253.178:80;
server 192.168.253.176:80 backup; #热备
}
轮询:nginx默认的就是轮询其权重默认为1,请求访问时 每台服务器访问一次;
upstream myweb {
server 192.168.253.176:8080; #默认80端口可以不用写端口号
server 192.168.253.178:8080;
}
加权轮询:根据配置的权重大小从而处理不同数量的访问及请求
upstream myweb {
server 192.168.253.176:8080 weight=1;
server 192.168.253.178:8080 weight=2;
}
ip_hash:nginx会让相同客户端ip访问同一个服务器;
upstream myweb {
ip_hash;
server 192.168.253.178:80;
server 192.168.253.176:80
}
- nginx 负载均衡配置状态参数
- down,表示当前的server暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
- max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
- fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。
upstream myweb {
server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;
server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1;
}
4.编辑nginx-proxy配置文件,如下
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
upstream testapp {
server 192.168.253.176;
server 192.168.253.178;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://testapp;
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
5.接下来就可以访问测试了
[root@nginx-proxy ~]# curl 127.0.0.1
hi world!
[root@nginx-proxy ~]# curl 127.0.0.1
hello world!
修改配置文件,增加权重,重新加载配置文件生效
[root@nginx-proxy ~]# vim /etc/nginx/nginx.conf
upstream testapp {
server 192.168.253.176 weight=1;
server 192.168.253.178 weight=2;
}
...
[root@nginx-proxy ~]# curl 127.0.0.1
hello world!
[root@nginx-proxy ~]# curl 127.0.0.1
hi world!
[root@nginx-proxy ~]# curl 127.0.0.1
hi world!
在此也可以看到配置已经生效。
四层负载均衡
nginx在1.9.0 的时候,增加了一个 stream 模块,用来实现OSI第四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听.
#4层tcp负载
stream {
upstream myweb {
hash $remote_addr consistent;
server 172.17.14.2:8080;
server 172.17.14.3:8080;
}
server {
listen 82;
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass myweb;
}
}
*在这里要注意stream模块不在http的服务里边,采用的是四层的协议。
在这里就不重复操作了,可以参考官方网站学习。
总结
负载均衡除了nginx的使用外比较常用的还有 LVS 、Haproxy等,在使用时应根据具体的场景进行使用,如果条件允许的话,还可以使用keepalived 高可用等相关技术。
欢迎一起交流分享!