【原创】互联网常见架构模式 之 nginx负载均衡

一:什么是Nginx

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、新浪、网易、腾讯等。

Nginx有什么优点

(1)更快

这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快地响应请求。

(2)高扩展性

Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。而且在HTTP模块中,还设计了HTTP过滤器模块:一个正常的HTTP模块在处理完请求后,会有一串HTTP过滤器模块对请求的结果进行再处理。这样,当我们开发一个新的HTTP模块时,不但可以使用诸如HTTP核心模块、events模块、log模块等不同层次或者不同类型的模块,还可以原封不动地复用大量已有的HTTP过滤器模块。这种低耦合度的优秀设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。

Nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块一样具备极其优秀的性能,充分利用Nginx的高并发特性,因此,许多高流量的网站都倾向于开发符合自己业务特性的定制模块。

(3)高可靠性

高可靠性是我们选择Nginx的最基本条件,因为Nginx的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器上大规模使用Nginx。Nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务。

(4)低内存消耗

一般情况下,10 000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。

(5)单机支持10万以上的并发连接

这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大公司、网站都需要应付海量并发请求,一个能够在峰值期顶住10万以上并发请求的Server,无疑会得到大家的青睐。理论上,Nginx支持的并发连接上限取决于内存,10万远未封顶。当然,能够及时地处理更多的并发请求,是与业务特点紧密相关的。

(6)热部署

master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以在7×24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。

快速增长的互联网用户群以及业内所有互联网服务提供商越来越好的用户体验,都促使我们在大流量服务中用Nginx取代其他Web服务器。Nginx先天的事件驱动型设计、全异步的网络I/O处理机制、极少的进程间切换以及许多优化设计,都使得Nginx天生善于处理高并发压力下的互联网请求,同时Nginx降低了资源消耗,可以把服务器硬件资源“压榨”到极致。

Nginx的用处

1.Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品:能够支持高达 50,000 个并发连接数的响应。下图表示了nginx的工作架构图。

2.Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持Rails 和 PHP程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。 作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。


二:互联网常见高并发架构

1:什么是高并发


高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求

高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。

  • 响应时间:系统对请求做出响应的时间
  • 吞吐量:单位时间内处理的请求数量。
  • QPS:每秒响应请求数。

2:如何提升系统的并发能力


互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)

垂直扩展:提升单机处理能力。垂直扩展的方式又有两种:

  1. 增强单机硬件性能
  2. 提升单机架构性能

在互联网业务发展非常迅猛的早期,如果预算不是问题,强烈建议使用“增强单机硬件性能”的方式提升系统并发能力,因为这个阶段,公司的战略往往是发展业务抢时间,而“增强单机硬件性能”往往是最快的方法。

不管是提升单机硬件性能,还是提升单机架构性能,都有一个致命的不足:单机性能总是有极限的。所以互联网分布式架构设计高并发终极解决方案还是水平扩展

水平扩展:只要增加服务器数量,就能线性扩充系统性能。

小编同时也总结了几个常见的互联网分层架构图:

常见互联网分布式架构如上,分为:

  1. 客户端层:典型调用方是浏览器browser或者手机应用APP
  2. 反向代理层:系统入口,反向代理
  3. 站点应用层:实现核心应用逻辑,返回html或者json
  4. 服务层:如果实现了服务化,就有这一层
  5. 数据-缓存层:缓存加速访问存储
  6. 数据-数据库层:数据库固化数据存储

反向代理层的水平扩展,是通过“DNS轮询”实现的:dns-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问dns-server,会轮询返回这些ip。当nginx成为瓶颈的时候,只要增加服务器数量,新增nginx服务的部署,增加一个外网ip,就能扩展反向代理层的性能,做到理论上的无限高并发

站点层:

站点层的水平扩展,是通过“nginx”实现的。通过修改nginx.conf,可以设置多个web后端。当web后端成为瓶颈的时候,只要增加服务器数量,新增web服务的部署,在nginx配置中配置上新的web后端,就能扩展站点层的性能,做到理论上的无限高并发。

服务层:

站点层通过RPC-client调用下游的服务层RPC-server时,RPC-client中的连接池会建立与下游服务多个连接,当服务成为瓶颈的时候,只要增加服务器数量,新增服务部署,在RPC-client处建立新的下游服务连接,就能扩展服务层性能,做到理论上的无限高并发。如果需要优雅的进行服务层自动扩容,这里可能需要配置中心里服务自动发现功能的支持。

数据层:

在数据量很大的情况下,数据层(缓存,数据库)涉及数据的水平扩展,将原本存储在一台服务器上的数据(缓存,数据库)水平拆分到不同服务器上去,以达到扩充系统性能的目的。

互联网分层架构中,各层次水平扩展的实践又有所不同:

  1. 反向代理层可以通过“DNS轮询”的方式来进行水平扩展;
  2. 站点层可以通过nginx来进行水平扩展;
  3. 服务层可以通过服务连接池来进行水平扩展;
  4. 数据库可以按照数据范围,或者数据哈希的方式来进行水平扩展。

各层实施水平扩展后,能够通过增加服务器数量的方式来提升系统的性能,做到理论上的性能无限。

原文发布于微信公众号 - 码神联盟(lkchatspace)

原文发表时间:2017-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和PYTHON有个约会

Django来敲门[升级版]-0000-概述web概述课程介绍开发环境写在前面:

web软件,是软件发展过程中最重要也是代表了将来软件应用的一种趋势。 对于web软件的开发来说,传统意义上的java语言、php语言、ruby语言都是web软...

722
来自专栏测试开发架构之路

APP测试点总结

1.功能性测试:   ——根据产品需求文档编写测试用例。   ——软件设计文档编写用例。   注意:就是根据产品需求文档编写测试用例而进行测试。 2.兼容性测试...

5057
来自专栏社区的朋友们

浅聊 API 网关

在微服务概念流行之前,API 网关的就已经诞生了,如银行、证劵等领域常见的前置机系统,解决访问认证、报文转换、访问统计等;而我今天的切入点是从 API-cent...

1.6K2
来自专栏youtube下载

免费youtube视频下载的3种方法

youtube是全球最大的视频网站之一, 深受国内外用户欢迎, 网站上有海量的视频, 从少儿节目到各种影视作品, 再到个人视频作品, 应有尽有, 不仅如此, 视...

19K17
来自专栏Youngxj

Windows平台本地DNS自动检测与设置工具

6625
来自专栏Java进阶架构师

【架构技术专题】什么是架构设计的五个核心指标?如何设计?(4)

性能就是核心要素之一,不然我为什么架构设计?随随便便一个lowlow的系统上线就好了。所以性能优化是很多小公司卖不去过的坎。这么说吧,当然优化网站性能的手段也非...

2714
来自专栏北京马哥教育

微服务化的十个设计要点

在实施微服务的过程中,不免要面临服务的聚合与拆分,当后端服务的拆分相对比较频繁的时候,作为手机 App 来讲,往往需要一个统一的入口,将不同的请求路由到不同的服...

1192
来自专栏java一日一条

浅析数据一致性

在数据有多分副本的情况下,如果网络、服务器或者软件出现故障,会导致部分副本写入成功,部分副本写入失败。这就造成各个副本之间的数据不一致,数据内容冲突。 实践中,...

5911
来自专栏华章科技

关于小程序,我只服这篇文章

微信小程序能实现的事务,App理论上都能实现;但App能实现的功能,微信小程序却受限于框架与微信开放的API,就不一定能做。

1153
来自专栏北京马哥教育

LinkedIn —— Apache Kafka 的伸缩扩展能力

什么是Kafka? Apache Kafka是一个演进的发布/订阅消息系统。系统结合队列和消息机制,可把它当成在一群服务器间进行的日志提交过程。消息被分成...

3114

扫码关注云+社区

领取腾讯云代金券