一个网站要保持高可用,绝对要避免单点故障,即只有一台服务器提供web服务,当这台服务器宕机时,流量进不来,意味着白花花的钱就丢了。
负载均衡方案
负载均衡就是为了解决单点故障而出现的方案,分为两种:
- GSLB
举个例子:同一个网址,文泰来在北京访问,骆冰在杭州访问,并非直接访问到web服务器,而是访问调度中心,调度中心会根据ip所在地,分配一个与请求者最近的web服务器ip,再去访问该web服务器
这种方式能最大限度地提高请求者的访问速度,但成本大,搭建也不容易,对于中小企业要弄这样一套负载均衡并不划算。通常是直接使用第三方提供的服务,如阿里云的付费负载均衡
- SLB
对于没什么流量,关键是没什么钱的个人、中小企业,自然是玩不起GSLB,直接用nginx搭建免费的SLB就是最佳选择。
这个原理很简单,nginx通过proxy_pass
,根据配置在upstream_server
的web服务器,进行调度分配
nginx实现负载均衡
在服务器不多的情况下,可以用一台服务器开不同的端口来模拟负载均衡,如用8001,8002,8003三个端口模拟三台服务器,nginx的配置如下:
upstream_test.conf
upstream test {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name www.test.com;
access_log /var/log/nginx/test_proxy.access.log main;
location / {
proxy_pass http://test;
include proxy_params;
}
}
检测配置是否正确:
nginx -tc /etc/nginx/nginx.conf
重启nginx后,访问域名,每次刷新都会访问不同的服务器,因为默认是采用了轮询策略
那么问题来了,当其中一台服务器宕机了,会不会当指派到这台服务器时,就报服务器错误呢?
使用iptable模拟一台服务器宕机:
iptables -I INPUT -p tcp --dport 8002 -j DROP
此时再访问,发现负载均衡策略会智能地忽略掉宕机的服务器
upstream语法
upsteam backend {
server backend1.example.com weight=5;
server backend2.exmaple.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
状态说明:
down 当前的server不参与负载均衡
backup 预留的备份服务器,当其他服务器宕机后,会自动启用
max_fails 允许请求失败的次数
fali_timeout 经过max_falis失败后,服务暂停的时间
max_conns 限制最大的接收的连接数
调度算法
算法 | 说明 |
---|---|
轮询 | 按时间顺序逐一分配到不同的后端服务器 |
加权轮询 | weight值越大,分配到的访问几率越高 |
ip_hash | 每个请求按访问ip的hash结果分配,同一个ip固定访问一个web服务器 |
url_hash | 按url的hash结果分配 |
least_conn | 优先分配给连接少的机器 |
hash 数值 | 按自定义的hash值 |
实例:
upstream test {
hash $request_uri;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}