首先,我们用Python来写一个最简单的提供4个端口的服务端口,代码如下
from flask import Flask
import threading
app = Flask(__name__)
app2 = Flask(__name__)
app3 = Flask(__name__)
app4 = Flask(__name__)
@app.route('/')
def server1():
return '服务A'
@app2.route('/')
def server2():
return '服务B'
@app3.route('/')
def server3():
return '服务C'
@app4.route('/')
def server3():
return '服务D'
def run_b():
print('服务2启动')
app2.run(port=82)
def run_c():
print('服务3启动')
app3.run(port=83)
def run_d():
print('服务4启动')
app4.run(port=84)
if __name__ == "__main__":
# 先启动4个线程
threading.Thread(target=run_b).start()
threading.Thread(target=run_c).start()
threading.Thread(target=run_d).start()
print('服务1启动')
app.run(port=81)
访问效果很简单,就是下面这个样子
最简单的轮询
http {
# 待选服务器列表
upstream loadBalancing{
server 127.0.0.1:81;
server 127.0.0.1:82;
server 127.0.0.1:83;
server 127.0.0.1:84;
}
server {
listen 8080;
location / {
# 使用负载均衡的代理
proxy_pass http://loadBalancing;
}
}
}
效果就是按顺序进行访问。这里就不展示了
权重
upstream loadBalancing{
server 127.0.0.1:81 weight=1;
server 127.0.0.1:82 weight=2;
server 127.0.0.1:83 weight=3;
server 127.0.0.1:84 weight=4;
}
这种就是那个weight高,那个访问的就越频繁
IP Hash
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
# 待选服务器列表
upstream loadBalancing{
ip_hash;
server 127.0.0.1:81;
server 127.0.0.1:82;
server 127.0.0.1:83;
server 127.0.0.1:84;
}
使用这个方法后,我们每次访问的都是同一个服务。因为我们的ip地址没有变
fair(第三方模块,需要自己安装)
fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。代码如下
upstream loadBalancing{
server 127.0.0.1:81;
server 127.0.0.1:82;
server 127.0.0.1:83;
server 127.0.0.1:84;
fair;
}
url_hash(也是第三方模块)
按访问url的hash结果来分配请求,使每个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
其他标签
down和backup标签的简单展示
upstream loadBalancing{
server 127.0.0.1:81;
server 127.0.0.1:82;
server 127.0.0.1:83 backup;
server 127.0.0.1:84 down;
}
down标识某一台server不可用,backup是备份机,所有服务器挂了之后才会生效
max_conns:限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置
resolve:将server指令配置的域名,指定域名解析服务器。需要在http模块下配置resolver指令,指定域名解析服务
fail_timeout:默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
max_fails:默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。