极客专栏《Nginx核心知识100讲》83小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。
83 | 负载均衡策略:round-robin
nginx负责与上游交互的模块,统称为upstream模块。不管是stream、upstream、http upstream。在upstream除了指定上游服务之外,还提供了一个最基本的负载均衡算法round-robin,下面我们将介绍下upstream模块的基本使用方法,以及round-robin这个负载均衡算法是怎样工作的。
image.png image.pngdown相当于一个注释,但是方便我们管理、维护。
算法介绍
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.pngkeepalive 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会不停地检测这些连接吗?
作者回复
- 1、不是的,所有客户端都可使用同一连接;
- 2、Nginx会加一个定时器到红黑树中(参见第40课),所以不存在不停检测这一说,定时器触发后就可以由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。
网友评论