
文章插图
以上内容摘自网友发布的文章 , 简单一句话是资源的处理 , 直接通过内核层进行数据传递 , 避免了数据传递到应用层 , 应用层再传递到内核层的开销 。
目前高并发的处理 , 一般都采用sendfile模式 。通过直接操作内核层数据 , 减少应用与内核层数据传递 。
2.3.3Nginx通信模型(I/O复用机制)
开发模型:epoll和kqueue 。
支持的事件机制:kqueue、epoll、rt signals、/dev/poll 、event ports、select以及poll 。
支持的kqueue特性包括EV_CLEAR、EV_DISABLE、NOTE_LOWAT、EV_EOF , 可用数据的数量 , 错误代码.
支持sendfile、sendfile64和sendfilev;文件AIO;DIRECTIO;支持Accept-filters和TCP_DEFER_ACCEP.
以上概念较多 , 大家自行百度或谷歌 , 知识领域是网络通信(BIO,NIO,AIO)和多线程方面的知识 。
2.4均衡策略nginx的负载均衡策略可以划分为两大类:内置策略和扩展策略 。内置策略包含加权轮询和ip hash , 在默认情况下这两种策略会编译进nginx内核 , 只需在nginx配置中指明参数即可 。扩展策略有很多 , 如fair、通用hash、consistent hash等 , 默认不编译进nginx内核 。由于在nginx版本升级中负载均衡的代码没有本质性的变化 , 因此下面将以nginx1.0.15稳定版为例 , 从源码角度分析各个策略 。
2.4.1. 加权轮询(weighted round robin)
轮询的原理很简单 , 首先我们介绍一下轮询的基本流程 。如下是处理一次请求的流程图:

文章插图
图中有两点需要注意 , 第一 , 如果可以把加权轮询算法分为先深搜索和先广搜索 , 那么nginx采用的是先深搜索算法 , 即将首先将请求都分给高权重的机器 , 直到该机器的权值降到了比其他机器低 , 才开始将请求分给下一个高权重的机器;第二 , 当所有后端机器都down掉时 , nginx会立即将所有机器的标志位清成初始状态 , 以避免造成所有的机器都处在timeout的状态 , 从而导致整个前端被夯住 。
2.4.2. ip hash
ip hash是nginx内置的另一个负载均衡的策略 , 流程和轮询很类似 , 只是其中的算法和具体的策略有些变化 , 如下图所示:

文章插图
2.4.3. fair
fair策略是扩展策略 , 默认不被编译进nginx内核 。其原理是根据后端服务器的响应时间判断负载情况 , 从中选出负载最轻的机器进行分流 。这种策略具有很强的自适应性 , 但是实际的网络环境往往不是那么简单 , 因此要慎用 。
2.4.4 通用hash、一致性hash
这两种也是扩展策略 , 在具体的实现上有些差别 , 通用hash比较简单 , 可以以nginx内置的变量为key进行hash , 一致性hash采用了nginx内置的一致性hash环 , 可以支持memcache 。
2.5场景Ngnix一般作为入口负载均衡或内部负载均衡 , 结合反向代理服务器使用 。以下架构示例 , 仅供参考 , 具体使用根据场景而定 。
2.5.1入口负载均衡架构

文章插图
Ngnix服务器在用户访问的最前端 。根据用户请求再转发到具体的应用服务器或二级负载均衡服务器(LVS)
2.5.2内部负载均衡架构

文章插图
LVS作为入口负载均衡 , 将请求转发到二级Ngnix服务器 , Ngnix再根据请求转发到具体的应用服务器 。
2.5.3Ngnix高可用

文章插图
分布式系统中 , 应用只部署一台服务器会存在单点故障 , 负载均衡同样有类似的问题 。一般可采用主备或负载均衡设备集群的方式节约单点故障或高并发请求分流 。
Ngnix高可用 , 至少包含两个Ngnix服务器 , 一台主服务器 , 一台备服务器 , 之间使用Keepalived做健康监控和故障检测 。开放VIP端口 , 通过防火墙进行外部映射 。
推荐阅读
- 百度信誉认证对网站优化有什么好处
- 家电批发网的5个网站你们知道吗 买家电的网站
- 根据的用户需求来制作营销型网站
- 日常的网站内容更新应该如何做
- 网站被劫持到其他网站如何解决
- 一文搞懂MySQL的Join,聊一聊秒杀架构设计
- 网站被搜索引擎降权的原因
- 搜索引擎为什么不收录网站内页
- JD架构师分享:微服务架构到底是什么东西
- 现在程序员最火的微服务架构与SpringCloud,你真的弄清楚了吗?
