进阶阶段回顾:
模型:
① GSLB(全局负载均衡), 特点: 节点庞大, 范围广
② SLB(服务器负载均衡), 特点: 范围小, 实时性/响应性好
SLB分为四层负载均衡和七层负载均衡, Nginx是典型的七层负载均衡.
Nginx的负载均衡:
测试Nginx的负载均衡
要测试Nginx的负载均衡功能需要两台服务器, 192.168.19.134和192.168.19.136
136服务器提供三个server服务:
134服务器提供负载均衡服务:
客户端(浏览器)访问:
http://192.168.19.134
默认的结果是在这3个服务端口之间轮询
可以使用命令关闭其中某个端口, 模拟其中一个服务挂掉的情况, 测试其他两个服务还能否正常访问.
命令如下:
iptables -I INPUT -p tcp --dport 8082 -j DROP #关闭8082端口
iptables -I INPUT -p tcp --dport 8082 -j ACCEPT #开启8082端口
测试结果是8082端口的服务无法访问, 而其他两个服务正常访问.
上面提到的upstream模块还有其他的配置项:
upstream [自定义的虚拟服务的名称, 如上面我自定义的"testSLB"] {
server [域名的写法www.example.com] weight=[权重值越大则访问越多, 值为1/2/3/4/5/...];
server [域名+端口的写法www.example.com:8080];
server [socket的写法unix:/tmp/...];
}
配置参数:
down | 表示当前的server不参与负载均衡 |
backup | 备份服务器, 当其他服务没有完全挂掉的情况下不使用该备份服务器, 一旦全部挂掉, 则启用该备份服务器 |
max_fails | 允许请求失败的次数, 如: max_fails=1 |
fail_timeout | 经过max_fails失败后服务暂停的时间, 如: fail_timeout=10s |
max_conns | 限制最大的接收连接数(用于每台服务器配置不统一的情况, 降低低配置服务器的压力) |
进入134服务器的.conf配置, 在upstream的每一台server后面加上对应的参数再测试
测试结果是只能访问到8083端口, 利用上面的命令关闭8083端口, 测试能够访问到的是8082端口.
Nginx的调度算法
Nginx的调度算法默认是轮询策略, 依次访问.
调度算法:
轮询 | 按照时间顺序逐一分配到不同的后端服务器 |
加权轮询 | weight值越大, 分配到的访问几率就越大 |
ip_hash | 每个请求按照访问的ip的hash结果进行分配, 使得来自同一个ip的固定访问同一个后端服务器 |
least_conn | 最少链接数, 当前哪个服务器的连接数少就分发给哪个服务器 |
url_hash | 每个请求按照访问的url的hash结果进行分配, 使得来自同一个url的请求定向到同一个后端服务器 |
hash关键值 | hash自定义的key |
测试加权轮询:
134服务器的配置:
轮询和加权轮询都是基于请求来实现的, 这种轮询有个缺点会导致用户的cookie等信息丢失, 可以采取ip_hash的调度算法:
此时通过ip下的方问就只会固定一个server
ip_hash的缺陷在于, 如果用户在前端再走代理的话, 此时nginx是无法获取到用户的真是ip的, 同时如果用户访问的后台是多台服务器的话, 那么会导致用户的缓存发生改变, 那么信息也将发生改变.
解决办法: hash关键值/url_hash
url_hash跟hash关键值其实是同一个道理, 配置语法如下:
systax: hash [key, 如$request_uri]
default: 无配置
context: upstream域
进入.conf文件进行配置:
134服务器:
136服务器分别在code1/code2/code3里面添加url1.html/url2.html/url3.html文件, 用于区别访问的路径而已.
重新加载配置文件
访问: http://192.168.19.134/url1.html, 此时只能定向访问到server1下的url1.html,
访问: http://192.168.19.134/url2.html, 此时只能定向访问到server3下的url2.html,
访问: http://192.168.19.134/url3.html, 此时只能定向访问到server2下的url3.html,
具体访问哪台服务器则根据url的hash计算结果进行分发的.