本次分享大纲

  1. 软件负载均衡概述
  2. Ngnix负载均衡
  3. Lvs负载均衡
  4. Haproxy负载均衡
  5. 本次分享总结

一、软件负载均衡概述

硬件负载均衡性能优越,功能全面,但是价格昂贵,一般适合初期或者土豪级公司长期使用。因此软件负载均衡在互联网领域大量使用。常用的软件负载均衡软件有Nginx,Lvs,HaProxy等。本文参考大量文档,部分为直接拷贝,参考出处见负载均衡详解(4)。

二、Ngnix负载均衡

Ngnix是一款轻量级的Web服务器/反向代理服务器,工作在七层Http协议的负载均衡系统。具有高性能、高并发、低内存使用等特点。是一个轻量级的Http和反向代理服务器。Nginx使用epoll and kqueue作为开发模型。能够支持高达 50,000 个并发连接数的响应。

操作系统:Liunx,Windows(Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows)

开发语言:C

并发性能:官方支持每秒5万并发,实际国内一般到每秒2万并发,有优化到每秒10万并发的。具体性能看应用场景。

2.1.特点

1.模块化设计:良好的扩展性,可以通过模块方式进行功能扩展。

2.高可靠性:主控进程和worker是同步实现的,一个worker出现问题,会立刻启动另一个worker。

3.内存消耗低:一万个长连接(keep-alive),仅消耗2.5MB内存。

4.支持热部署:不用停止服务器,实现更新配置文件,更换日志文件、更新服务器程序版本。

5.并发能力强:官方数据每秒支持5万并发;

6.功能丰富:优秀的反向代理功能和灵活的负载均衡策略

2.2.功能

2.2.1基本功能

  • 支持静态资源的web服务器。
  • http,smtp,pop3协议的反向代理服务器、缓存、负载均衡;
  • 支持FASTCGI(fpm)
  • 支持模块化,过滤器(让文本可以实现压缩,节约带宽),ssl及图像大小调整。
  • 内置的健康检查功能
  • 基于名称和ip的虚拟主机
  • 定制访问日志
  • 支持平滑升级
  • 支持KEEPALIVE
  • 支持url rewrite
  • 支持路径别名
  • 支持基于IP和用户名的访问控制。
  • 支持传输速率限制,支持并发数限制。

2.2.2扩展功能

2.2.3性能

Nginx的高并发,官方测试支持5万并发连接。实际生产环境能到2-3万并发连接数。10000个非活跃的HTTP keep-alive 连接仅占用约2.5MB内存。三万并发连接下,10个Nginx进程,消耗内存150M。淘宝tengine团队测试结果是“24G内存机器上,处理并发请求可达200万”。

2.3架构

2.3.1Nginx的基本工作模式

一个master进程,生成一个或者多个worker进程。但是这里master是使用root身份启动的,因为nginx要工作在80端口。而只有管理员才有权限启动小于低于1023的端口。master主要是负责的作用只是启动worker,加载配置文件,负责系统的平滑升级。其它的工作是交给worker。那么当worker被启动之后,也只是负责一些web最简单的工作,而其他的工作都是有worker中调用的模块来实现的。

模块之间是以流水线的方式实现功能的。流水线,指的是一个用户请求,由多个模块组合各自的功能依次实现完成的。比如:第一个模块只负责分析请求首部,第二个模块只负责查找数据,第三个模块只负责压缩数据,依次完成各自工作。来实现整个工作的完成。

他们是如何实现热部署的呢?其实是这样的,我们前面说master不负责具体的工作,而是调用worker工作,他只是负责读取配置文件,因此当一个模块修改或者配置文件发生变化,是由master进行读取,因此此时不会影响到worker工作。在master进行读取配置文件之后,不会立即的把修改的配置文件告知worker。而是让被修改的worker继续使用老的配置文件工作,当worker工作完毕之后,直接当掉这个子进程,更换新的子进程,使用新的规则。

2.3.2Nginx支持的sendfile机制

Sendfile机制,用户将请求发给内核,内核根据用户的请求调用相应用户进程,进程在处理时需要资源。此时再把请求发给内核(进程没有直接IO的能力),由内核加载数据。内核查找到数据之后,会把数据复制给用户进程,由用户进程对数据进行封装,之后交给内核,内核在进行tcp/ip首部的封装,最后再发给客户端。这个功能用户进程只是发生了一个封装报文的过程,却要绕一大圈。因此nginx引入了sendfile机制,使得内核在接受到数据之后,不再依靠用户进程给予封装,而是自己查找自己封装,减少了一个很长一段时间的浪费,这是一个提升性能的核心点。

以上内容摘自网友发布的文章,简单一句话是资源的处理,直接通过内核层进行数据传递,避免了数据传递到应用层,应用层再传递到内核层的开销。

目前高并发的处理,一般都采用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端口,通过防火墙进行外部映射。

DNS解析公网的IP实际为VIP。

参考:

http://www.cnblogs.com/itfly8/p/5080743.html

大型网站架构系列:负载均衡详解(3)相关推荐

  1. 大型网站系统架构系列:负载均衡详解(一)

    大型网站系统架构系列:负载均衡详解(一) 2016-03-20 架构说 面对大量用户访问.高并发请求,海量数据,可以使用高性能的服务器.大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比 ...

  2. 大型网站架构系列:负载均衡详解(4)

    原文:大型网站架构系列:负载均衡详解(4) 本文是负载均衡详解的第四篇,主要介绍了LVS的三种请求转发模式和八种负载均衡算法,以及Haproxy的特点和负载均衡算法.具体参考文章,详见最后的链接. 三 ...

  3. 分布式架构系列: 负载均衡技术详解 | 技术头条

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者:ITFLY8 转自:架构师技术联 ...

  4. 大型网站架构系列:20本技术书籍推荐

    大型网站架构系列:20本技术书籍推荐 一.大型网站架构系列 第一本:<大型网站技术架构:核心原理与案例分析> 这是本算是国内大型网站架构的经典之作,由阿里人李智慧创作,听名字就知道本书很有 ...

  5. php负载均衡原理_Java开发大型互联网架构深入负载均衡原理之方案分析

    引言 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balan ...

  6. Spring Cloud:使用Ribbon实现负载均衡详解(下)

    在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问.这一篇文章我详细分析一下如何 ...

  7. Tomcat安装、配置、优化及负载均衡详解

    博客园 首页 新随笔 联系 管理 订阅 随笔- 31  文章- 0  评论- 25  Tomcat安装.配置.优化及负载均衡详解 一.常见JavaWeb服务器      1.WebLogic:是BEA ...

  8. Nginx代理功能与负载均衡详解

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...

  9. Kubernetes上的负载均衡详解

    如果您的应用程序是面向大量用户.会吸引大量流量,那么一个不变的目标一定是在高效满足用户需求的同时.不让用户感知到任何类似于"服务器繁忙!"的情况.这一诉求的典型解决方案是横向扩展部 ...

最新文章

  1. 读懂深度迁移学习,看这文就够了 | 赠书
  2. matlab7.0怎么用,matlab7.0中simulink使用
  3. 多线程共享内存的问题
  4. 2019牛客多校Monotonic Matrix
  5. 电脑屏保海底世界_炸弹测深出来的海底一万米,都藏有何种玄机?
  6. docker下使用mongodb
  7. linux mysql集群 备份与恢复,Linux下MySQL的备份和恢复
  8. Python3入门机器学习经典算法与应用 第3章 Jupyter Notebook基本用法 学习笔记
  9. CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换
  10. 使用SQLyog创建MySQL数据库
  11. SQLserver的安装
  12. 服务器远程管理--远程桌面(图形)
  13. WMB专题之ESQL
  14. selenium模拟登陆12306
  15. 怎样提高平面设计色彩表现力
  16. 启动tomcat报错:Destroying ProtocolHandler [ajp-nio-8009]
  17. OpenLayers分屏联动对比
  18. jdk官网下载,附带镜像站下载方式
  19. Word 中插入高亮代码 | planetB | syntax-highlight-word
  20. 微软NNI进行神经网络模型剪枝压缩的踩坑记录

热门文章

  1. 91Android万能驱动最新版,NVIDIA万能驱动电脑版下载|NVIDIA万能驱动官方安装版下载 -爱安卓...
  2. ap 目标检测算法map_目标检测mAP怎么计算
  3. php正在尝试获取中非对象的属性_PHP7-2: 面向对象开发
  4. python列表求和显示unsupport_本地使用pip命令安装requests库,提示unknow or unsupported command install解决方法...
  5. PHP代码审计弱类型,[代码审计]php弱类型总结
  6. aws iam php,php-AWS4签名密钥-本教程错误吗?
  7. java 正则高级应用_JAVA正则表白式高级用法(分组与捉拿).
  8. nodejs 前端 返回数组给_互联网寒冬,一年经验字节跳动、虾皮、快手、拼多多前端面试总结...
  9. vuejs知乎_你也许不知道的Vuejs - 深入浅出响应式系统
  10. c语言,在主函数中输入一个整数,求该整数各位数字的乘积,[求助]求由键盘输入的任意两个整数的积...