Api设计程序员Nginx高端成长之路

【充电】《Nginx核心知识100讲》负载均衡策略:round-

2019-01-17  本文已影响52人  言十年

极客专栏《Nginx核心知识100讲》83小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。

83 | 负载均衡策略:round-robin

nginx负责与上游交互的模块,统称为upstream模块。不管是stream、upstream、http upstream。在upstream除了指定上游服务之外,还提供了一个最基本的负载均衡算法round-robin,下面我们将介绍下upstream模块的基本使用方法,以及round-robin这个负载均衡算法是怎样工作的。

image.png image.png

down相当于一个注释,但是方便我们管理、维护。

算法介绍

image.png

最核心的加权Round-Robin,这个算法是所有算法的一个基础。哈希算法或者一次性哈希算法,在某种情况下,它们都会退化成加权Round-Robin负载均衡算法。所以这个算法很重要。

什么叫Round-Robin呢?依次轮询挨个进行的方式叫Round-Robin。什么叫做加权呢?比如有的机器我们用了4核8G有的用了8核16G。8核的处理性能更强。那么通过一个权重来标识这台服务不同于其他服务。它(8核)的权重更大。Round-Robin算法应该按照权重值将更多的请求发给这样的服务。

默认集成在Nginx的upstream框架中的,无法删除或添加这个算法。

Round-Round提供了这四个weight、max_conns、max_fails、fail_timeout 参数针对server的。

max_fails和fail_timeout是配合使用的。fail_timeout单位是秒。

对上游使用keepalive

image.png

实际上对上游服务使用长连接效果会更明显,因为我们上游的应用服务数量是有限的,而且都是在我们的内网中,这个时候我们使用长连接很多好处会更直观,会更明显的看到它的效果。

同一台应用服务是为很多个客户端服务,所以调整keepalive会得到立竿见影的效果。

proxy_http_version 1.1 ,http 1.0是不支持keepalive长连接的,为了防止用户发来的是1.0协议,需要重置version。

proxy_set_header Connection "",为了防止用户发来的connection头部是Closed而不是keepalive,我们主动设置向上游发的connection。

指令

image.png

keepalive connections 可以去配置nginx向这一组upstream上游服务中,最多保持多少个空闲的TCP连接,用于keepalive请求。

keepalive_requests: tcp连接上最多一个最多多少个请求。

keepalive_timeout :一个tcp连接在处理完keepalive http请求,最多60秒,还没有第二请求处理,就关闭这个tcp连接。

resolver :当我们使用域名去访问上游服务的时候,可以用resolver指定一个我们自己或者提供好的DNS服务。

演示示例

为了做演示启用两台nginx,其中一台作为上游服务,模拟我们的应用服务器。下面两个监听端口就是提供上游服务。

image.png

模拟nginx的服务配置在下面。先测试round-robin算法。

image.png image.png

接下来看keepalive是否生效。我们可以通过抓包来验证。

image.png image.png

上面访问了两次。再看抓包情况,我们看到没有断开连接,因为断开连接会发fin包。

留言问题

1.请问keepalived是不是针对客户端在同一个连接上(相同的客户端ip和客户端端口)发送多次请求的场景下,才会生效?keepalived_timeout超时后,谁来把连接关闭呢,nginx会不停地检测这些连接吗?

 作者回复

2.请教个问题:keepalived_timeout、proxy_send_timeout、proxy_read_timeout都是超时时间,如果配置成一样的值(两种情况:比如一个较大的1500s;再比如一个较小值60s),会不会存在问题呢?能不能把这几个超时时间解释下差异呢?盼回复,谢谢!
2019-01-04

proxy_send_timeout是三次握手中SYN_SENT状态的时间(第5部分会介绍),proxy_read_timeout是两次读操作(参见第5部分的TCP滑动窗口)的超时,而keepalive-timeout则是http连接的空闲时间

3.老师您好:我还是没有表达清楚,我想问您的是,您在本节所讲的内容中,给上游服务器8011设置的权重是2,所以客户端访问的时候会被两次分配到8011后才被分配一次8012。我是想知道,您这个例子里面没有使用zone,假设有两个work进程w1和w2,第一次客户端访问是w1处理,w1把请求转给了8011,第二次客户端访问若是w2处理,w2怎么知道上次分配的情况?

 作者回复
两个worker进程顺序就乱了!w2不知道w1。如果需要知道,必须用zone。

上一篇下一篇

猜你喜欢

热点阅读