1.介绍

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_1.png

 

 Nginx(及其派生物)是一种广泛使用的服务器反向代理和负载平衡方案。从某种意义上说,Nginx几乎是低成本高负载网络服务器的同义词。

 

 Nginx如此受欢迎,许多人理所当然地认为Nginx也可以用来解决即时消息或消息推送场景中的负载平衡问题。

 

 此外,即时通讯的论坛和QQ群中的人们经常会问Nginx是否支持TCP、UDP和WebSocket的负载平衡。

 

 有了以上问题,让我们开始学习这篇文章吧!

 

 2.相关文章

 

 

 TCP/IP的详细说明-第11章UDP:用户数据报协议

 TCP/IP的详细说明-第17章TCP:传输控制协议

 TCP/IP的详细说明-第18章TCP连接的建立和终止

 TCP/IP的详细说明-第21章TCP的超时和重传

 易于理解——对TCP协议的深刻理解(一):理论基础

 网络编程中的懒人介绍(3):快速理解TCP协议就足够了

 初学者入门:简明的网络套接字教程

 网络插座的详细说明(一):对网络插座技术的初步理解

 快速理解高性能HTTP服务器的负载均衡技术原理

 “腾讯高级建筑师干货总结:阅读大型分布式系统设计的方方面面”

 了解分布式架构下的负载平衡技术:分类、原理、算法、常见方案等。

 初学者:从零开始理解大型分布式架构的演化历史、技术原理和最佳实践

 易于理解:基于集群共享移动终端即时通信接入层的负载均衡方案

 

 

 3.Nginx的产生

 

 没听说过Nginx吗?那你一定听说过它的“对等”阿帕奇!像Apache一样,Nginx是一个WEB服务器。基于REST体系结构风格,以统一资源标识符(URI)或统一资源定位器(URL)为通信基础,通过HTTP协议提供各种网络服务。

 

 然而,这些服务器在设计之初就受到环境的限制,如用户规模、网络带宽、产品特性等,它们的定位和发展也不尽相同。这也使得每个WEB服务器都有自己独特的特性。

 

 Apache已经发展了很长时间,它是世界上无可争议的最大的服务器。它有很多优点:稳定性、开源、跨平台等。它已经存在了很长一段时间,互联网行业远不如现在。所以它被设计成重量级的。它不支持高度并发的服务器。在Apache上运行成千上万的并发访问将导致服务器消耗大量内存。操作系统在进程或线程之间切换它,这也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。

 

 所有这些决定了Apache不能成为高性能的WEB服务器,轻量级高并发服务器Nginx应运而生。

 

 伊戈尔·塞索耶夫是俄国的一名工程师,他在为朗布勒媒体公司工作时用C语言开发了Nginx。作为一个网络服务器,Nginx一直在为兰姆勒媒体提供优秀而稳定的服务。

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_522d762853d52.jpg

 ▲伊戈尔·塞索耶夫,英吉士的创始人

 

 然后,伊戈尔·塞索耶夫打开了Nginx代码的源代码,并授予了一个自由软件许可证。

 

 出于以下原因:

 

 

 1)Nginx使用事件驱动的架构,这使得它能够支持数百万个TCP连接;

 2)高模块化和自由软件许可使得第三方模块层出不穷(这是一个开源时代~);

 3)Nginx是一个跨平台的服务器,可以在Linux、Windows、FreeBSD、Solaris、AIX、苹果操作系统等操作系统上运行;

 4)这些优秀的设计带来了极大的稳定性。

 

 因此,发动机着火了!

 

 4.Nginx最常见的用途、用法和使用场景

 

 

 4.1概述

 

 简而言之,Nginx是:

 

 

 1)免费、开源和高性能的HTTP服务器和反向代理服务器;

 2)它也是一个IMAP、POP3和SMTP代理服务器;

 3)可以作为发布网站的HTTP服务器;

 4)它可以用作负载平衡的反向代理。

 

 

 4.2什么是代理?

 

 谈到代理,首先,我们应该定义一个概念,这意味着代理是一个代表和渠道。

 

 此时,涉及两个角色,一个是代理角色,另一个是目标角色。代理角色通过该代理访问目标角色以完成某些任务的过程称为代理操作过程。就像我们生活中的专卖店一样,当顾客在阿迪达斯购买一双鞋时,这家专卖店是代理商,代理商角色是阿迪达斯制造商,目标角色是用户。

 

 

 4.3什么是远期代理?

 

 在讨论反向代理之前,让我们先看看正向代理,它也是最常见的代理模式。我们将从两个方面来解释前向代理的处理模式,并从软件和生活的角度来解释什么是前向代理。

 

 在今天的网络环境下,如果我们因为技术需要而需要访问一些外国网站,此时你会发现我们无法通过浏览器访问外国网站。此时,每个人都可以使用FQ行动来访问它。FQ的主要方式是找到一个可以访问外国网站的代理服务器。我们将向代理服务器发送请求,代理服务器将访问外国网站,然后将访问的数据传递给我们!

 

 上述代理模式称为前向代理:

 

 

 1)转发代理的最大特点是客户端非常清楚要访问的服务器地址;

 2)服务器只知道请求来自哪个代理服务器,而不知道哪个特定客户端;

 3)真实的客户端信息在转发代理模式下被屏蔽或隐藏。

 

 让我们来看一个示意图(我将客户端和转发代理放在一起,属于同一个环境,我将在后面介绍):

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_2.jpg

 

 客户端必须设置一个转发代理服务器,但前提是他们知道转发代理服务器的IP地址和代理程序的端口。

 

 如下图所示:

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_3.jpg

 

 总而言之,前向代理“它代表客户端并代表客户端发送请求”,是位于客户端和源服务器之间的服务器。为了从源服务器获得内容,客户端向代理发送请求并指定目标(源服务器),然后代理将请求转发给源服务器并将获得的内容返回给客户端。客户端必须进行一些特殊设置,才能使用转发代理。

 

 转发代理的用途:

 

 

 1)访问以前无法访问的资源,如谷歌;;

 2)它可以被缓存以加速对资源的访问;

 3)授权客户端在互联网上访问和认证;

 4)代理可以记录用户访问记录(在线行为管理)和隐藏用户信息。

 

 

 4.4什么是反向代理?

 

 理解什么是正向代理,让我们继续看看如何处理反向代理。

 

 例如,对于中国的一个财富网站来说,每天同一时间连接到该网站的访问者数量已经达到了前所未有的水平,单个服务器远远不能满足人们日益增长的购买欲望。这时,一个熟悉的术语出现了:分布式部署。

 

 分布式部署是通过部署多个服务器来解决访问者数量有限的问题。财富网站的大部分功能也是通过使用Nginx的反向代理直接实现的。在包装了引擎和其他组件之后,它有了一个很高的名字:引擎。对童鞋感兴趣的人可以访问青少年网的官方网站,查看具体信息:http://tengine.taobao.org/.

 

 那么,反向代理以什么方式实现分布式集群操作呢?让我们先看一个示意图(我将服务器和反向代理连接在一起,属于同一个环境,我将在后面介绍),如下图所示。

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_4.jpg

 

 从上图可以清楚地看到,多个客户端向服务器发送的请求被Nginx服务器接收,并被分发到后端业务处理服务器,以便按照一定的规则进行处理。在这一点上,请求的来源,也就是客户端,是清楚的,但是不清楚哪个服务器将处理该请求,并且Nginx扮演一个反向代理角色。

 

 客户端没有感知代理,反向代理对外部世界是透明的,因此访问者不知道他们正在访问代理。因为客户端无需任何配置即可访问。

 

 反向代理“代表服务器并代表服务器接收请求”,主要用于服务器集群的分布式部署,它隐藏了服务器的信息。

 

 反向代理的角色:

 

 

 1)为了保证内部网的安全,通常使用反向代理作为公共网络访问地址,网络服务器是内部网;

 2)负载均衡,通过反向代理服务器优化网站负载。

 

 典型项目场景:

 

 通常,在实际项目操作中,前向代理和反向代理可能存在于一个应用场景中,前向代理客户端请求访问目标服务器(反向单利益服务器)和多个实际业务处理服务器的反向代理。

 

 具体拓扑图如下:

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_5.jpg

 

 

 4.5正向代理和反向代理之间的区别

 

 剪切一个图表来说明正向代理和反向代理之间的区别,如下所示。

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_6.jpg

 

 该图如下:

 

 

 1)在转发代理中,代理和客户端属于同一个局域网(在图中的方框中),隐藏客户端信息;

 2)在反向代理中,代理和服务器属于同一个局域网(在图中的方框中),这隐藏了服务器信息。

 

 事实上,代理在两种代理中的作用是发送和接收对服务器的请求和响应,但就结构而言,它恰好是从左到右互换的,因此后一种代理模式称为反向代理。

 

 

 4.6引擎的负载平衡技术

 

 我们已经定义了所谓的代理服务器的概念。然后,Nginx扮演反向代理服务器的角色。它根据什么规则分发请求?可以针对不同的项目应用场景控制分发规则吗?

 

 这里提到的由客户端发送并由Nginx反向代理服务器接收的请求数就是我们所说的负载。

 

 请求数量根据一定的规则分配到不同的服务器进行处理的规则是一种平衡规则。

 

 因此,根据规则分发服务器接收的请求的过程称为负载平衡。

 

 负载均衡在实际项目运行过程中,有硬件负载均衡和软件负载均衡两种。硬件负载平衡也称为硬负载。例如,F5负载平衡相对昂贵,但是数据的稳定性和安全性得到了很好的保证。中国移动和中国联通等公司将选择硬负载运营;考虑到成本,更多的公司会选择使用软件负载平衡,这是一种利用现有技术和主机硬件实现的消息队列分发机制。

 

 即时通讯初学者:什么是一篇文章中的引擎?它能实现即时消息的负载平衡吗?_7.jpg

 

 Nginx支持的负载平衡调度算法如下:

 

 

 1)权重轮询(默认,通用):根据权重将接收到的请求分配给不同的后端服务器。即使后端服务器在使用过程中出现故障,Nginx也会自动将服务器从队列中移除,请求接受也不会受到任何影响。这样,可以为不同的后端服务器设置一个权重,以调整不同服务器上请求的分配率。权重数据越大,分配给请求的概率就越大;权重值主要根据实际工作环境中不同的后端服务器硬件配置进行调整。

 2)ip_hash(公共):根据发起客户端的ip的散列结果来匹配每个请求。在该算法下,具有固定ip地址的客户端将始终访问同一个后端服务器,这在一定程度上解决了集群部署环境中的会话共享问题。

 3)公平:智能调整调度算法,并根据后端服务器从请求处理到响应的时间动态分配调度算法。响应时间短、处理效率高的服务器分配请求的概率较高,而响应时间长、处理效率低的服务器分配的请求较少;一种结合前两者优点的调度算法。然而,应该注意的是,默认情况下,Nginx不支持公平算法。如果您想使用这个调度算法,请安装上游公平模块。

 4)url_hash:根据访问的url的哈希结果分配请求,每个请求的url将指向后端的一个固定服务器,这可以提高Nginx作为静态服务器时的缓存效率。另外,应该注意的是,默认情况下,Nginx不支持这种调度算法。如果你想使用它,你需要安装Nginx的散列软件包。

 

 

 5.Nginx支持TCP、UDP和网络套接字的负载平衡

 

 

 5.1概述

 

 准确地说,对于熟悉Nginx的用户来说,以上章节介绍的内容都是针对Nginx最擅长的Http协议,这也是Nginx最成功的应用场景。随着Nginx的不断升级和演进,开发人员期待Nginx支持仅在HTML5中出现的较低的TCP、UDP和WebSocket协议。幸运的是,这一切都实现了!

 

 Nginx支持1.3版的WebSocket反向代理(负载平衡)、1.9.0版的TCP反向代理(负载平衡)和1.9.13版的UDP反向代理(负载平衡)。

 

 原则上,Nginx与UDP或TCP反向代理(负载平衡)是一致的,而WebSocket协议实际上是TCP协议的应用层协议。因此,我们将在这一节介绍Nginx对TCP反向代理(负载平衡)的支持。

 

 对于通常被称为“七层负载平衡”的经典HTTP协议,Nginx实际上在第七层“应用层”工作。对于较低的TCP协议,负载平衡就是我们通常所说的“四层负载平衡”,它在“网络层”和“传输层”工作。例如,LVS(Linux虚拟服务器)和F5(硬件负载平衡设备)也属于“四层负载平衡”。

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_2-1.jpg

 

 

 5.2 the负载均衡的实现原理

 

 当Nginx从侦听端口接收到新的客户端链路时,它会立即执行路由算法,获取要连接的指定服务IP,然后创建新的上游连接来连接到指定的服务器。

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_2-2.jpg

 

 TCP负载平衡支持Nginx的原始调度算法,包括循环调度(默认,轮询调度),哈希(一致选择)等等。同时,调度信息数据将与鲁棒性检测模块协作,为每个连接选择适当的目标上游服务器。如果使用哈希负载平衡调度方法,您可以使用$remote_addr(客户端IP)来实现简单的持久会话(同一客户端IP的连接总是落在同一服务服务器上)。

 

 与其他上游模块一样,TCP的流模块也支持具有统一负载的自定义转发权重(配置“权重=2”),以及备份和关闭参数,这些参数用于淘汰出现故障的上游服务器。Max_conns参数可以限制服务器的TCP连接数,并根据服务器的容量设置适当的配置值,特别是在高并发情况下,可以达到过载保护的目的。

 

 Nginx监控客户端连接和上游连接。一旦收到数据,Nginx将立即读取并将其推送到上游连接,并且不会在TCP连接中进行数据检测。Nginx为客户端和上游数据写入维护一个内存缓冲区。如果客户端或服务器传输大量数据,缓冲区将适当增加内存大小。

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_2-3.jpg

 

 当Nginx从任何一方接收到连接关闭的通知时,或者当TCP连接空闲的时间超过proxy_timeout配置的时间时,连接将被关闭。对于TCP长连接,应选择合适的代理退出时间,并注意监控socke的so_keepalive参数,防止过早断开。

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_2 -。png

 

 

 5.3服务健壮性监控

 

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

 

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?_2-4.jpg

 

 如果服务器重复出现故障(超过max _ fails或fail_timeout配置的参数),Nginx也会启动该服务器。服务器启动60秒后,Nginx会偶尔尝试重新连接它,以检查它是否恢复正常。如果服务器恢复正常,Nginx将其添加回上游组,并缓慢增加连接请求的比例。

 

 这个位置是“慢慢增加的”,因为通常一个服务有“热数据”,也就是说,超过80%甚至更多的请求实际上被阻塞在“热数据缓存”中,并且只有少数请求被实际处理。当机器刚刚启动时,“热数据缓存”实际上还没有建立。此时,大量请求被爆炸性地转发,这可能导致机器无法“承受”并再次挂起。以mysql为例,我们超过95%的mysql查询通常会进入内存缓存,实际执行的查询并不多。

 

 事实上,无论是单机还是集群,在高并发请求、重启或切换的情况下都存在这种风险。

 

 有两种主要解决方案:

 

 

 1)请求逐渐增加,从少到多,逐渐积累热数据,最终达到正常服务状态;

 2)预先准备好“常用”数据,主动“预热”服务,预热完成后打开服务器的访问。

 

 原则上,TCP负载平衡与LVS是一致的,它的性能将远远高于原来的HTTP负载平衡。然而,它并不比LVS好。LVS被放置在内核模块中,而Nginx在用户模式下工作。此外,Nginx相对较重。

 

 6.Nginx能实现即时消息负载平衡吗?

 

 

 6.1概述

 

 根据上一节的内容,Nginx可以实现TCP、UDP和WebSocket协议的反向编码(负载均衡)。在这种情况下,基于TCP、UDP或WebSocket协议的即时消息聊天系统能否通过Nginx直接实现即时消息负载均衡?

 

 为了回答这个问题,我们首先来看不同长连接场景中的具体数据趋势。

 

 为了便于描述,以下基于TCP、UDP或网络套接字协议的套接字长连接简称为套接字长连接。

 

 

 6.2Nginx支持的长连接反向代理数据趋势功能

 

 对于有利于Nginx实现的套接字长连接,数据趋势如下图所示:

 即时通讯初学者:什么是一篇文章中的引擎?它能实现即时消息的负载平衡吗?_QQ截图20190606234945.jpg

 

 如上所示,即:

 

 

 1)客户端使用Nginx反向代理到套接字长连接服务器;

 2)客户端可以与套接字长连接服务器通信(即客户端->套接字长连接服务器和套接字长连接服务器->客户端)。

 

 简而言之,Nginx可以实现如下的长连接数据定向能力:

 

 

 1)客户端到服务器方向(简称c2s):即客户端向长连接服务器发送数据的能力;

 2)服务器到客户端方向(简称s2c):长连接服务器向客户端发送数据的能力。

 

 

 6.3即时消息聊天软件所需的长连接数据趋势功能

 

 对于即时消息聊天应用程序,必要的数据导向功能包括:

 

 

 1)客户端到服务器方向(简称c2s):即客户端向长连接服务器发送数据的能力;

 2)服务器到客户端方向(简称s2c):长连接服务器向客户端发送数据的能力;

 3)客户端到客户端方向(简称c2c):客户端向客户端发送数据的能力。

 

 即时消息聊天应用中的三种数据趋势,对应典型的功能逻辑场景:

 

 

 1)客户端到服务器方向(简称c2s):通常用于客户端向即时消息长连接服务器发起指令,如发起好友请求、发送陌生人聊天消息、发送群聊消息等。

 2)服务器到客户端方向(简称s2c):通常用于服务器主动向客户端推送指令,如向客户端传递好友请求、转发陌生人的聊天消息、发送群组聊天消息(发送给所有群组成员)、系统通知等。;

 3)客户端到客户端方向(简称c2c):客户端向客户端发送数据的能力。例如,普通的朋友聊天消息从客户端A发送到客户端B(当然,这不一定通过P2P技术实现)。

 

 

 6.4结论

 

 显然,如前所述,由Nginx实现的TCP、UDP或WebSocket协议的反向代理(负载平衡)只能实现c2s和s2c数据方向,而即时消息聊天应用程序必须需要c2s、s2c和c2c消息方向。数据趋势C2c显然是一个特定于即时消息的场景需求,对于通用解决方案Nginx来说,提供它有点牵强。

 

 我们可以得出结论,我们不能直接通过Nginx实现即时消息负载平衡。

 

 换句话说,如果即时消息的负载平衡可以直接通过Nginx实现,那么在处理高并发性和高吞吐量时,即时消息服务器可以像Http协议一样舒适。

 

 

 6.5例外

 

 然而,对于即时通讯网络消息推送系统(或类似系统)关注的另一个技术领域,消息推送的负载均衡可以直接通过Nginx实现,因为仅仅消息推送系统只需要c2s和s2c数据方向,而不需要c2c水平数据交互。


----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯IM融云世界

IM即时通讯钉钉技术:企业IM钉钉在后端架构上的优越之处

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

企业IM即时通讯聊天办公APP钉钉技术分析交流

哇谷云-怎么样正确认识海外云服务器

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?