【充电】《Nginx核心知识100讲》负载均衡哈希算法
极客专栏《Nginx核心知识100讲》86~87小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。
86 | 最少连接算法以及如何跨worker进程生效
upstream_least_conn 负载均衡算法,会优先选择nginx到一群上游服务中,选择连接数最少的上游服务。upstream zone模块,解决一个问题,之前我们介绍的所有的负载均衡算法它们默认只在一个worker中生效,放在内存中的,而nginx是有多个多个worker进程,是跨进程的, 使用了zone模块 就可以让所有的上游服务器信息以及当前的状态信息全部存放在共享内存中。
upstream_least_conn模块
image.png很多算法都会退换成round-robin算法。
upstream_zone 模块
为了跨进程就必须使用共享内存。
image.png我们以上介绍了keep alive、upstream zone、least_conn,这些模块间会有退化。有时候keep alive会优先在我们选择服务之前生效,有很多使用方法,这些方法与upstream模块间的顺序是相关的。看下upstream模块之间的顺序,通过查看configure执行完生成的ngx_module.c文件。
image.png留言问题
1.least-con 负载均衡算法是不是可能出现 负载不均衡的情况
作者回复
是。实际上所有负载均衡算法都会在某些条件下出现负载不均衡情况
2.能否提供一个配置共享内存的实际案例; 共享内存的配置只是在upstream模块配置 zone name [size]就可以了? 比如无需提前在http模块先配置好zone 共享内存,然后在upstream模块进行共享内存的调用?
作者回复
不需要提前,在upstream{}里的zone里配置时,就会直接创建共享内存,并把相关的负载均衡参数以及服务器状态数据都放在共享内存中,进而对所有worker进程生效。
3.昨天这个问题我没有表述清楚:
之前的upstream并未使用zone模块,为什么也能正常运行呢?比如权重为2的话,会记录下已经访问了1次或者2次?
我想问您的是,您是不是在您的nginx中只开启了一个work进程?不然的话,您若不使用zone模块,访问次数无法记录在共享内存,多个work无法判断上次访的客户端访问是分配到了哪个上游服务。
作者回复
- 1、我的示例中,只开启了1个worker进程。
- 2、没使用zone,则会在内存中会记录访问了1次或者2次,所以功能是正常的。
- 3、如果开启了多个worker进程,但没有开启zone,那么多个worker是独立的在各自内存中记录,不能分享其他worker进程的访问记录。