暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【AntDB高可用性方案设计与最佳实践】基于中间件的开源软件介绍 - Nginx

北陌 2024-01-23
48

Nginx 本是一个反向代理服务器,但由于丰富的负载均衡策略,常常被用于客户端可真实的服务器之间,作为负载均衡的实现。

正向代理:被代理的是客户端,比如通过×× 代理访问国外的某些网站。当客户端没有权限访问国外的网站,客户端可以请求 ×× 代理服务器,×× 代理服务器访问国外网站,将国外网站返回的内容传给真正的用户。用户对于服务器是隐藏的,服务器并不知道真实的用户。

反向代理:被代理的是服务器,也就是客户端访问了一个所谓的服务器, 服务器会将请求转发给后台真实的服务器,真实的服务器做出响应,通过代理服务器将结果返回给客户端。服务器对于用户来说是隐藏的,用户不知道真实的服务器是哪个。

用 Nginx 做实现服务的高可用,Nginx 本身可能成为单点,有两种解决方案,一种是公司搭建自己的 DNS,将请求解析到不同的 Nginx,另一种是配合Keepalive 实现服务的存活检测。如图 6-8 所示。


图 6-8 NGINX 工作原理图


相对于传统基于进程或线程的模型(Apache 就采用这种模型)在处理并发连接时会为每一个连接建立一个单独的进程或线程,且在网络或者输入/ 输出操作时阻塞。这将会大量消耗内存和 CPU ,因为新起一个单独的进程或线程需要准备新的运行环境,包括堆和栈内存的分配,以及新的执行上下文,当然,这些也会导致多余的 CPU 消耗。最终,会由于过多的上下文切换导致服务器性能变差。

反过来,Nginx 的架构设计采用模块化、基于事件驱动、异步、单线程且非阻塞。

Nginx 大量使用多路复用和事件通知,Nginx 启动以后,会在系统中以 daemon 的方式在后台运行,其中包括一个 master 进程,nn ≥ 1)个 worker 进程。所有的进程都是单线程(即只有一个主线程)的,且进程间通信主要使用共享内存的方式。

其中,master 进程用于接收来自外界的信号,并给 worker 进程发送信号, 同时监控 worker 进程的工作状态。worker 进程则是外部请求真正的处理者, 每个 worker 请求相互独立且平等的竞争来自客户端的请求。请求只能在一个worker 进程中被处理,且一个 worker 进程中只有一个主线程,所以只能同时处理一个请求。(原理与 Netty 类似)

Nginx 负载均衡主要是对七层网络通信模型中的第七层应用层上的 http、https 进行支持。Nginx 是以反向代理的方式进行负载均衡的。反向代理(Reverse Proxy)方式是指以代理服务器来接收 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外表现为一个服务器。


Nginx 实现负载均衡的分配策略有很多,Nginx 的 upstream 目前支持以下几种方式:

● 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端服务器宕机,能自动剔除。

● weight:指定轮询概率,weight 和访问比率呈正比,用于后端服务器性能不均的情况。

● ip_hash:每个请求按访问 ip 的 Hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

● fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。

● url_hash(第三方):按访问 url 的 Hash 结果来分配请求,使每个 url定向到同一个后端服务器,后端服务器为缓存时比较有效。Nginx 本是一个反向代理服务器,但由于丰富的负载均衡策略,常常被用于客户端可真实的服务器之间,作为负载均衡的实现。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论