Nginx Plus的商业授权版开始具有TCP负载均衡的功能。从Nginx 1.7.7版本开始加入的,现在变成了一个商业收费版本,想要试用,需要在官网申请。也就是说,Nginx除了以前常用的HTTP负载均衡外,Nginx增加基于TCP协议实现的负载均衡方法。

HTTP负载均衡,也就是我们通常所有“七层负载均衡”,工作在第七层“应用层”。而TCP负载均衡,就是我们通常所说的“四层负载均衡”,工作在“网络层”和“传输层”。例如,LVS(Linux Virtual Server,Linux虚拟服务)和F5(一种硬件负载均衡设备),也是属于“四层负载均衡”。

TCP负载均衡的配置方式

Nginx使用了一个新的stream模块来实现TCP负载均衡,这个模块,类似于http和mail模块,允许我们配置一组监听TCP连接的服务。允许你配置多个服务的TCP连接,通过在upstream的server组中配置proxy_pass指令。

修改nginx.conf文件,在http模块的统计目录,添加一个stream模块(和http等同级):

  1. stream {

  2.     server {

  3.         listen 1034;

  4.         proxy_pass app;

  5.     }

  6.     upstream app {

  7.         server 192.168.0.3:1034;

  8.         server 192.168.0.4:1034;

  9.         server 192.168.0.6:1034;

  10.     }

  11. }

TCP负载均衡的执行原理

当Nginx从监听端口收到一个新的客户端链接时,立刻执行路由调度算法,获得指定需要连接的服务IP,然后创建一个新的上游连接,连接到指定服务器。

TCP负载均衡支持Nginx原有的调度算法,包括Round Robin(默认,轮询调度),哈希(选择一致)等。同时,调度信息数据也会和健壮性检测模块一起协作,为每个连接选择适当的目标上游服务器。如果使用Hash负载均衡的调度方法,你可以使用$remote_addr(客户端IP)来达成简单持久化会话(同一个客户端IP的连接,总是落到同一个服务server上)。

和其他upstream模块一样,TCP的stream模块也支持自定义负载均和的转发权重(配置“weight=2”),还有backup和down的参数,用于踢掉失效的上游服务器。max_conns参数可以限制一台服务器的TCP连接数量,根据服务器的容量来设置恰当的配置数值,尤其在高并发的场景下,可以达到过载保护的目的。

Nginx监控客户端连接和上游连接,一旦接收到数据,则Nginx会立刻读取并且推送到上游连接,不会做TCP连接内的数据检测。Nginx维护一份内存缓冲区,用于客户端和上游数据的写入。如果客户端或者服务端传输了量很大的数据,缓冲区会适当增加内存的大小。

当Nginx收到任意一方的关闭连接通知,或者TCP连接被闲置超过了proxy_timeout配置的时间,连接将会被关闭。对于TCP长连接,我们更应该选择适当的proxy_timeout的时间,同时,关注监听socke的so_keepalive参数,防止过早地断开连接。

服务健壮性监控

TCP负载均衡模块支持内置健壮性检测,一台上游服务器如果拒绝TCP连接超过proxy_connect_timeout配置的时间,将会被认为已经失效。在这种情况下,Nginx立刻尝试连接upstream组内的另一台正常的服务器。连接失败信息将会记录到Nginx的错误日志中。

如果一台服务器,反复失败(超过了max_fails或者fail_timeout配置的参数),Nginx也会踢掉这台服务器。服务器被踢掉60秒后,Nginx会偶尔尝试重连它,检测它是否恢复正常。如果服务器恢复正常,Nginx将它加回到upstream组内,缓慢加大连接请求的比例。

之所“缓慢加大”,因为通常一个服务都有“热点数据”,也就是说,80%以上甚至更多的请求,实际都会被阻挡在“热点数据缓存”中,真正执行处理的请求只有很少的一部分。在机器刚刚启动的时候,“热点数据缓存”实际上还没有建立,这个时候爆发性地转发大量请求过来,很可能导致机器无法“承受”而再次挂掉。以mysql为例子,我们的mysql查询,通常95%以上都是落在了内存cache中,真正执行查询的并不多。

其实,无论是单台机器或者一个集群,在高并发请求场景下,重启或者切换,都存在这个风险,解决的途径主要是两种:

(1)请求逐步增加,从少到多,逐步积累热点数据,最终达到正常服务状态。
(2)提前准备好“常用”的数据,主动对服务做“预热”,预热完成之后,再开放服务器的访问。

TCP负载均衡原理上和LVS等是一致的,工作在更为底层,性能会高于原来HTTP负载均衡不少。但是,不会比LVS更为出色,LVS被置于内核模块,而Nginx工作在用户态,而且,Nginx相对比较重。

Nginx基于TCP的四层负载均衡介绍相关推荐

  1. nginx1.9基于端口的四层负载均衡实践,基于端口的转的负载均衡

    在大型项目四层负载有LVS,但在中小型项目或者内部有很多应用需要做TCP四层基于端口转,以前我们采用Socat,后面也尝试使用iptables来做四层的端口转发,同样HAProxy提供高可用性.负载均 ...

  2. Nginx 配置TCP和UDP负载均衡

    前言 Nginx除了以前常用的HTTP负载均衡外,Nginx增加基于TCP协议实现的负载均衡方法. HTTP负载均衡,也就是我们通常所有"七层负载均衡",工作在第七层"应 ...

  3. 【网络编程】多个服务器的情况:nginx实现反向代理、nginx基于反向代理实现负载均衡

    如果我们有多个服务器,比如我们只有一个域名:我们可以利用其中一台服务器,通过nginx为这一个域名实现反向代理:进一步,我们可以利用这多台服务器,为这一个域名基于nginx的反向代理实现负载均衡. 文 ...

  4. F5/LVS/Nginx/HAProxy硬软件级网络负载均衡介绍

    F5/LVS/Nginx/HAProxy硬软件级网络负载均衡介绍 1 硬件级的负载均衡 常见的商用硬件负载均衡器:NetScaler.F5.Radware.Array 优点: 1)专业团队维护,能够直 ...

  5. Nginx四层负载均衡详解

    Nginx四层负载均衡 什么是四层负载均衡 四层负载均衡基于传输层协议包来封装的(如:TCP/IP),那我们前面使用的七层指的是应用层,它的组装在四层基础之上,无论是四层还是七层都是这是OSI网络模型 ...

  6. 【Nginx】面试官:给我讲讲Nginx如何实现四层负载均衡?

    写在前面 这次又被问到Nginx四层负载均衡的问题了,别慌,我们一起来细细分析这个看似简单的问题. 负载均衡可以分为静态负载均衡和动态负载均衡,接下来,我们就一起来分析下Nginx如何实现四层静态负载 ...

  7. Nginx四层负载均衡模块添加

    Nginx四层负载均衡 Nginx在1.9之后,增加了一个stream模块,用来实现四层协议的转发.代理.负载均衡等.stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议 ...

  8. CDN基于谷歌开源Katran四层负载均衡方案的应用 - 原理篇

    CDN作为一种分布式缓存加速服务,对于访问量级大的区域,单个节点带宽建设一般可达百Gb量级,对外配置虚拟IP提供服务,节点内部需要通过多层负载均衡(LB)将请求分发到内部的若干台服务器进行处理.一般情 ...

  9. 基于underlay和overlay转换的四层负载均衡

    四层负载均衡 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.四层负载均衡,也就是主要通过报文中的 ...

最新文章

  1. java中关于DecimalFormat四舍五入的用法
  2. MySQL之concat、concat_ws以及group_concat的使用
  3. Google 图片搜索的原理是什么?
  4. python中函数的括号使用
  5. SharePoint 2010: 设计BCS工作流
  6. python给视频加水印_视频水印_Python SDK_服务端SDK_视频点播 - 阿里云
  7. linux github中文官网,GitHub使用简介
  8. 2019-03-21-算法-进化(合并两个有序链表)
  9. 【数据库中间件】分布式组件 - ClusterDB-Client
  10. 机器学习初级入门(二)KNN
  11. 拓端tecdat|使用R语言对进行地理空间数据可视化
  12. SharpGL学习笔记(十二) 光源例子:解决光源场景中的常见问题
  13. vue 下载插件downloadjs
  14. c语言怎样处理lrc文件格式,lrc文件的一般格式是什么_教你如何打开lrc文件 - 驱动管家...
  15. 墨画子卿第三章第5节:飞过去的是胧月
  16. 【小白】如何写好自己的一篇CSDN博客(美化1)
  17. 探访北大最AI的食堂!刷脸打饭,机器认识200多道菜
  18. 计算图片中矩形间的IOU
  19. Ubuntu18解决:Not creating XLA devices, tf_xla_enable_xla_devices not set
  20. 【SVAC1】SVAC1.0场解码相关分析

热门文章

  1. 阿里云盘又送福利啦?空间大时间长,不要犹豫快上车!
  2. 皮一皮:现在的年轻人不得了吖...
  3. 为什么阿里规定需要在事务注解 @Transactional 中指定 rollbackFor?
  4. 皮一皮:你更想成为哪个身材...
  5. 每日一皮:资深程序员调试代码的样子...
  6. 每日一皮:两个实习生的结对编程...
  7. 来谈下高并发和分布式中的幂等处理
  8. 突然远程连接不上mysql_navicat突然连接不上远程linux服务器上的mysql
  9. HRFormer 多分辨率Transformer 参数骤降,性能更强
  10. RetinaFace Mxnet转TensorRT