随着公司业务规模的扩大,简单的增加服务器配置已经满足不了公司业务需求。负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务。
负载均衡按照范围可以分为GSLB
(Global Server Load Balancer)和SLB
(Server Load Balancer)。按照协议模型分为四层负载均衡
和七层负载均衡
GSLB
GSLB是对物理集群的负载均衡。GSLB是依赖于用户和实际部署环境的互联网资源分发技术,不同的目的对应着一系列不同的技术实现。
SLB
1.nginx负载均衡原理
负载均衡实现原理是通过nginxproxy_pass
模块和upstream
模块实现的。客户端发送请求,由nginx代理转发upstream服务池,在之前文章中介绍使用过proxy_pass,负载 均衡和之前的代理区别就是,之前只转发一台服务器。负载均衡是转发多台服务器,并不是客户端每次请求都会转发到多台机器而是每次请求只转发到一台服务器。
2.nginx配置模块
upstream
upstream配置项属于ngx_http_upstream_module
模块传送门
Syntax: upstream name { ... }
Default: —
Context: http
server
Syntax: server address [parameters];
Default: —
Context: upstream
parameters | 值类型 | 描述 |
---|
weight | number | 设置服务器的权重,默认为1。权重越大,分配几率越高 |
max_conns | number | 限制与代理服务器的最大并发活动连接数。默认值为零,表示没有限制 |
max_fails | number | 设置在fail_timeout参数设置的持续时间内发生的与服务器通信的不成功尝试次数,以考虑服务器在一段时间内不可用,该持续时间也由fail_timeout参数设置 |
fail_timeout | time | 套指定数量的不成功尝试与服务器通信的时间应该考虑服务器不可用;以及服务器被视为不可用的时间段。默认情况下,参数设置为10秒。 |
backup | 无 | 将服务器标记为备份服务器。当主服务器不可用时,它将被传递请求。 |
down | 无 | 将服务器标记为永久不可用 |
resolve | ip地址 | 监视与服务器域名对应的IP地址的更改,并自动修改上游配置,而无需重新启动nginx(1.5.12)。服务器组必须驻留在共享内存中。 |
route | string | 设置服务器路由名称。 |
service | name | 能够解析DNS SRV记录并设置服务名称(1.9.13)。要使此参数起作用,必须为服务器指定resolve参数并指定不带端口号的主机名。 |
slow_start | time | 设置服务器将其权重从零恢复到标称值的时间,当不健康的服务器变得健康时,或者服务器在一段时间被认为不可用后变得可用时。默认值为零,即禁用慢启动。 |
drain | | |
3.nginx配置
小菜这里刚好有两台服务器,walidream.com
和yagn.xin
服务器。walidream.com做nginx代理转发,yagn.xin做后台服务器响应。
walidream.com服务器
服务目录
/etc/nginx/conf.d
|-balancing.conf
balancing.conf
upstream wali{
server yagm.xin:9001;
server yagm.xin:9002;
server yagm.xin:9003;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/proxy_test.log main;
location / {
proxy_pass http://wali;
include proxy_params;
}
}
检测语法并重启
nginx -tc /etc/nginx/nginx.conf
nginx -s reload -c /etc/nginx/nginx.conf
yagn.xin服务器
服务目录
/opt/app
|-code1
|-index.html
|-code2
|-index.html
|-code3
|-index.html
/etc/nginx/conf.d
|-server1.conf
|-server2.conf
|-server3.conf
index.html(code1)
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>yagm服务器</h1>
<h1>第一个应用</h1>
</body>
</html>
index.html(code2)
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>yagm服务器</h1>
<h1>第二个应用</h1>
</body>
</html>
index.html(code3)
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>yagm服务器</h1>
<h1>第三个应用</h1>
</body>
</html>
server1.conf
server {
listen 9001;
server_name yagm.xin www.yagm.xin;
#charset koi8-r;
access_log /var/log/nginx/server1.log main;
location / {
root /opt/app/code1;
index index.html index.htm;
}
}
server2.conf
server {
listen 9002;
server_name yagm.xin www.yagm.xin;
#charset koi8-r;
access_log /var/log/nginx/server2.log main;
location / {
root /opt/app/code2;
index index.html index.htm;
}
}
server1.conf
server {
listen 9003;
server_name yagm.xin www.yagm.xin;
#charset koi8-r;
access_log /var/log/nginx/server3.log main;
location / {
root /opt/app/code3;
index index.html index.htm;
}
}
检测语法并重启
nginx -tc /etc/nginx/nginx.conf
nginx -s reload -c /etc/nginx/nginx.conf
注意:如果购买的是云服务器,记得要在安区组中将上面9001,9002,9003端口在公网开放,不然公网是访问不了。
如果不知道,请查看这篇文章传送门
准备好之后,访问http://walidream.com
,按F5刷新页面,会发现应用在切换。
4.ip_hash
指定组应使用负载平衡方法,其中请求根据客户端IP地址在服务器之间分配。客户端IPv4地址的前三个八位字节或整个IPv6地址用作散列密钥。该方法确保来自同一客户端的请求将始终传递到同一服务器,除非此服务器不可用。在后一种情况下,客户端请求将被传递到另一个服务器。最有可能的是,它也将始终是同一台服务器。
Syntax: ip_hash;
Default: —
Context: upstream
5.hash
Syntax: hash key [consistent];
Default: —
Context: upstream
This directive appeared in version 1.7.2.
upstream wali{
hash $request_uri; #当每次请求同一台服务器时,就会定位到同一台服务器。
server yagm.xin:9001;
server yagm.xin:9002;
server yagm.xin:9003;
}