本文已收录至Github,举荐浏览 Java随想录
微信公众号:Java随想录
CSDN: 码农BookSea
当咱们的利用单实例不能撑持用户申请时,此时就须要扩容,从一台服务器扩容到两台、几十台、几百台。此时咱们就须要负载平衡,进行流量的转发。上面介绍几种负载平衡的计划。
DNS负载平衡
一种是应用DNS负载平衡,将域名映射多个IP。
用户拜访时是通过如 https://www.baidu.com 的形式拜访,在申请时,浏览器首先会查问DNS服务器获取对应的IP,DNS服务器对每个查问将以DNS文件中主机记录的IP地址按程序返回不同的解析后果,将客户端的拜访疏导到不同的机器下来,使得不同的客户端拜访不同的服务器,从而达到负载平衡的目标。
DNS还能够设置权重,咱们能够将配置比拟好的机器设置为高权重。
具体配置能够参考阿里云官网文档:阿里云DNS负载平衡权重配置
- 长处:配置简略,将负载平衡的工作交给了DNS服务器,省去了治理的麻烦。
- 毛病:DNS会有肯定的缓存工夫,故障后切换工夫长。
DNS存在一个问题,假如某台服务器重启或者呈现故障,DNS会有肯定的缓存工夫,故障后切换工夫长,而且没有对后端服务进行心跳检查和失败重试的机制。
例如:DNS缓存了A记录,假如我有一台服务器坏了须要下线,即便批改了A记录,要使其失效也须要较长的工夫,这段时间,DNS依然会将域名解析到已下线的服务器上,最终导致用户拜访失败。
对于DNS缓存多久工夫失效,能够参考阿里云的帮忙文档:解析失效工夫FAQ
Nginx负载平衡
负载平衡算法
个别用Nginx来做负载平衡比拟多。
Nginx负载平衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。
轮循(默认)
Nginx依据申请次数,将每个申请平均调配到每台服务器。
起码连贯
将申请调配给连接数起码的服务器。Nginx会统计哪些服务器的连接数起码。
IP Hash
每个申请按拜访IP的hash后果调配,这样每个访客固定拜访一个后端服务器,能够解决session共享的问题。
fair(第三方模块)
依据服务器的响应工夫来调配申请,响应工夫短的优先调配,即负载压力小的优先会调配。
须要装置nginx-upstream-fair模块
url_hash(第三方模块)
按拜访的URL的哈希后果来调配申请,使每个URL定向到一台后端服务器,如果须要这种调度算法,则须要装置nginx_upstream_hash模块。
一致性哈希(第三方模块)
ip_hash算法,在减少和服务器宕机时会导致会话和缓存失落。如果须要应用一致性哈希,则须要装置ngx_http_consistent_hash模块。
负载平衡配置
示例配置如下:
http { upstream myserve { # ip_hash; 示意应用ip hash负载平衡策略 server 192.168.0.100:8080 weight=1 max_fails=2 fail_timeout=10;; server 192.168.0.101:8080 weight=2; server 192.168.0.102:8080 weight=3; # server 192.168.0.102:8080 backup; # server 192.168.0.102:8080 down; # server 192.168.0.102:8080 max_conns=100; } server { listen 80; location / { proxy_pass http://myserve; } }}
- weight:weight是权重的意思,上例配置,示意6次申请中,调配1次,2次和3次。
- max_fails:容许申请失败的次数,默认为1。超过max_fails后,在fail_timeout工夫内,新的申请将不会调配给这台机器。
- fail_timeout:默认为10秒,上诉代码配置示意失败2次之后,10秒内 192.168.0.100:8080不会解决新的申请。
- backup:备份机,所有服务器挂了之后才会失效,如配置文件正文局部,只有192.168.0.100和192.168.0.101都挂了,才会启用192.168.0.102。
- down:示意某一台服务器不可用,不会将申请调配到这台服务器上,该状态的应用场景是某台服务器须要停机保护时设置为down,或者公布新性能时。
- max_conns:限度调配给某台服务器解决的最大连贯数量,超过这个数量,将不会调配新的连贯给它。默认是0,示意不限度最大连贯。它所起到的作用是避免服务器因连贯过多而导致宕机,比方我给192.168.0.102调配100个连贯申请,如果这台服务器正在解决100个申请,nginx将不会调配新的申请给它。也就是同时解决的最大连贯数量。
超时配置
- proxy_connect_timeout:后端服务器连贯的超时工夫,默认是60秒。
- proxy_read_timeout:连贯胜利后等待后端服务器响应工夫,也能够说是后端服务器解决申请的工夫,默认是60秒。
- proxy_send_timeout:发送超时工夫,默认是60S
被动健康检查与被动健康检查
Nginx负载平衡有个毛病,就是说Nginx的服务查看是惰性的,Nginx只有当有拜访时后,才发动对后端节点探测。如果本次申请中,节点正好呈现故障,Nginx仍然将申请转交给故障的节点,而后再转交给衰弱的节点解决。所以不会影响到这次申请的失常进行。然而会影响效率,因为多了一次转发,而且自带模块无奈做到预警。
也就是说Nginx自带的健康检查是被动的。
如果咱们想被动的去进行健康检查,须要应用淘宝开源的第三方模块:nginx_upstream_check_module。
Nginx会定时被动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从衰弱列表中移除,当发现某服务复原时,又可能将该服务加回衰弱列表中。
示例配置如下:
upstream myserver { server 192.168.0.100:8080; server 192.168.0.101:8080; check interval=5000 rise=2 fall=5 timeout=1000 type=http; check_http_send"HEAD / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; }
interval距离5s,间断失败5次,间断胜利2次,超时工夫1s,应用http协定,发送一个申请头,如果是2xx或者3xx状态(比方200,302等)示意服务失常运行。
LVS/F5+Nginx
对于个别利用来说,有Nginx就能够了。但Nginx个别用于七层负载平衡,其吞吐量是有肯定限度的。为了晋升整体吞吐量,会在 DNS 和 Nginx之间引入接入层,如应用LVS(软件负载均衡器)、F5(硬负载均衡器)能够做四层负载平衡,即首先 DNS解析到LVS/F5,而后LVS/F5转发给Nginx,再由Nginx转发给后端实在服务器。
比拟现实的架构是这样的:
对于个别业务开发人员来说,咱们只须要关怀到Nginx层面就够了,LVS/F5个别由零碎/运维工程师来保护。Nginx目前提供了HTTP (ngx_http_upstream_module)七层负载平衡,而1.9.0版本也开始反对TCP(ngx_stream_upstream_module)四层负载平衡。
个别用到F5的公司不多,大部分LVS+Nginx就能够搞定。
另外我抱着好奇心去谷歌了下F5设施的价格
╮(╯▽╰)╭ 这玩意要几十万一台,看来不是个别人玩的起的。
本篇文章就到这里,感激浏览,如果本篇博客有任何谬误和倡议,欢送给我留言斧正。文章继续更新,能够关注公众号第一工夫浏览。