日常开发中,我们为保证服务高可用,一般是使用集群方式部署我们的服务,为了保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,我们需要负载均衡作为调度;
下面介绍几种常见的负载均衡方式;
一,DNS方式
我们通过域名访问网站时,首先得需要通过DNS,进行域名解析,转换为实际的ip地址进行跳转访问,如,你访问www.hzxstudio.com,实际经过DNS解析后,变成了192.168.121.100这个ip,实际通过这个ip再去访问服务;那么我们可以针对这点,在DNS中为一个域名绑定多个ip(这多个ip机器是一个集群),DNS按照一定的策略返回用户一个ip,从而实现了负载均衡的功能;
使用DNS做负载均衡的好处:简单方便,不需要在应用层做任何的修改
同时也存在一些弊端:DNS域名映射存在多级缓存的问题,各级缓存按照TTL(相当于过期时间)来刷新本地缓存,而不能立即更新.这就造成了一旦某台应用服务器宕机,但是DNS映射仍然有可能映射到宕机的ip,造成服务不可用;所以一般大型互联网公司都回合其他后端负载均衡技术结合使用,比如 DNS最为一级负载均衡手段,后端应用服务器使用Nginx或者LVS方式作为二级负载均衡。
二,Nginx负载均衡
这个比较主流,Nginx 以其优异的性能,不仅作为 web 服务器使用,也常被作为负载均衡器来使用。所以通过 web 服务器的反向代理的方式是比较经济的方式,一般 web 服务器都有反向代理功能,Nginx 是其中典型代表.
Nginx 负载均衡的基本配置如下:
1 | http { |
在这个配置中,我们通过upstream
定义一个后端的服务器组,命名为app_group
,该组中包含三台主机。当用户通过 HTTP 访问 www.example.com 域名时,请求会按照轮询(轮询是默认的转发策略)的方式转到 app_group 对应的后端服务器上。
Nginx 自带多种转发策略:
轮询(Round-Robin )策略,这是也是默认的策略,Nginx 会根据服务器配置列表将机请求轮流转发到后端服务器上。
最少连接(Least-connected)策略,在该策略下 Nginx 会尝试避繁忙的机器,将请转到有减少连接较少的机器上,该策略可以环节呢后端服务器负载冷热不均的问题,使用
least_conn
配置该策略,例如:1
2
3
4
5
6upstream app_group {
least_conn;
server 192.168.56.102;
server 192.168.56.103;
server 192.168.56.104;
}
最少耗时(Least-time)策略:该策略会将请求转到都具有最小平均影响时间和最少活动链接的后端服务器,使用least_time
配置该策略,例如:
1 | upstream app_group { |
会话保持(Session persistence)策略,在轮询或者最少连接策略下,同一个用户(同一个客户端IP)的不同请求会随机分配到不同的后端服务器上。回话保持策略会通过客户端 IP 计算一个成 Hash 值,按照 hash 值分配后端服务器,该策略可以使得同一个用户的请求落在同一个后端主机上。使用ip_hash
配置该指令,例如:
1 | upstream app_group { |
自定义 Hash 策略:前面介绍的回话保持策略通过客户端IP计算Hash只,自定义 Hash 策略可以根据用户自己定的主键计算hash值,比如使用 uri 作为 key 计算hash,例如:
1 | upstream app_group { |
基于权重策略:Nginx 可以为不同的主机配置不同的权重,按照权重比例转发流量,比如下面的配置会按照 3:1:1 的比例分配流量:
1 | upstream app_group { |
前文介绍的轮询策略,可以理解为按照 1:1:1 的比例分配流量。
除了按照IP地址指定主机意外,server 指令支持多种配置形式,可以按照域名进行配置,也可以按照unix 套接字指定,也可以指定端口号,例如:
1 | upstream app_group { |
Server 指令常用的参数如下:
weight : 服务器权重,默认为1。
max_conns:限制单个服务器同时最多的连接数,默认为 0,表示不限制。
max_fails:在 fail_timeout 给定时间范围内,尝试和后端主机通信的最大连续失败次数,默认为1次,0 表示不对该主机进行健康检查。当达到该值时,对应主机被置为不可用,请求将不会被转发到不可用的主机上。在下一个 fail_timeout 时间只有,nginx 会尝试转发请求到不可用主机上,如果请求成功,则原来不可用的主机被重新置为可用。
fail_timeout:定义服务不可以用的时间段,以及定义最大尝试失败次数的时间周期,默认为10秒。
backup:标记当前主机为后备服务器,当其他服务不可都不可用时,请求才会转发给后备主机。
down:永久标记当前主机不可用。
slow_start:设置慢启动时间,当前服务器从不可用变为可用,或者权重从0变为设定值时,等在一段时间再完全恢复。 有时后端服务完全启动需要一段时间,某条请求的转发成功并不一定能完全代表服务已经完全启动,该值可以用户延迟恢复,等待后端服务器的完全启动。
- 本文作者: Kiven
- 本文链接: http://hzxstudio.com/2018/11/14/LoadBalance/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!