原理

负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务。

应用场景

春节期间在12306网站上买过火车票的朋友应该深有体会,有时查询一张火车票都会很慢,甚至整个网页都卡住不动了。通常一个访问量非常大的Web网站(比如:淘宝、京东、12306等),由于一个Web服务同时能处理的用户并发请求的数量有限,同时还有机器故障的情况,所以一个Web站点通常会在N台机器上各部署一套同样的程序。当某一个服务挂掉的时候,还有第二个、第三个、第N个服务。。。继续为用户提供服务,给用户的感觉,你的服务还在正常的运行!在这些提供同样服务的机器当中,在硬件配置方面也各不一样,这样就会存在部份机器性能非常好,能快速计算并响应用户的请求,另外一部份机器可能配置差点,响应用户的请求的时间会长一些。

这就需要我们思考一个问题?如果有一个服务正在同时处理1000个用户的请求,这个服务的上限可能最多能同时处理1000个用户的请求,这时它已经很忙了,如果此时又有一个新请求过来,我们仍然把这个请求分配给这台机器,这时候这个请求就只能在干等着,等这个服务处理完那些请求后,再继续处理它。这样在浏览器中的反应就像12306我们在春节买票一样,卡在那不动了,让用户眼巴巴的干着急。而能提供同样服务的其它机器,这时确很空闲。这样不仅是对服务器资源的浪费,也充分发挥不出弄多台服务器装同一个服务的最高价值。

我们通常称对某一台机器的访问量称为负载量,如何将一个用户的请求,合理的分配到一台能快速响应用户请求的服务器上,我们就需要用到一些负载策略。也就体现出了文章主题的用意了:

负载均衡,将用户的所有HTTP请求均衡的分配到每一台机器上,充分发挥所有机器的性能,提高服务的质量和用户体验。

负载均衡可以通过负载均衡网络硬件设备和Web服务器软件来实现,前者设备成本较高,小公司通常负担不起,所以后者一般是我们的首选。

实现负载均衡常用的Web服务器软件有Nginx、HAProxy、LVS、Apache,本文主要介绍Nginx的负载均衡策略

一、内置负载策略

Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。

  • 轮循(默认)

Nginx根据请求次数,将每个请求均匀分配到每台服务器

  • 最少连接

将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。

  • IP Hash

绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。

轮循

http {

    # ... 省略其它配置

    upstream tomcats {
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server example.com:8080;
} server {
listen 80; location / {
proxy_pass http://tomcats;
}
} # ... 省略其它配置
}
  • proxy_pass http://tomcats:表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。

  • upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。

  • upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略:

  • weight

默认为1,将请求平均分配给每台server

upstream tomcats {
server 192.168.0.100:8080 weight=2; # 2/6次
server 192.168.0.101:8080 weight=3; # 3/6次
server 192.168.0.102:8080 weight=1; # 1/6次
}

上例配置,表示6次请求中,100分配2次,101分配3次,102分配1次

  • max_fails

默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。

  • fail_timeout

默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它

upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 weight=3;
server 192.168.0.102:8080 weight=1;
}

192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。

  • backup 
    备份机,所有服务器挂了之后才会生效

upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 weight=3; server 192.168.0.102:8080 backup;
}

在100和101都挂了之前,102为不可用状态,不会将请求分配给它。只有当100和101都挂了,102才会被启用。

  • down 
    标识某一台server不可用。可能能通过某些参数动态的激活它吧,要不真没啥用。

upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15; server 192.168.0.101:8080 down; server 192.168.0.102:8080 backup;
}

表示101这台Server为无效状态,不会将请求分配给它。

  • max_conns 
    限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置

upstream tomcats {
server 192.168.0.100:8080 max_conns=1000;
}

表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。

  • resolve

将server指令配置的域名,指定域名解析服务器。需要在http模块下配置resolver指令,指定域名解析服务

http {
resolver 10.0.0.1; upstream u {
zone ...;
...
server example.com resolve;
}
}

表示example.com域名,由10.0.0.1服务器来负责解析。

二、第三方负载策略

1  fair

根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配。

由于fair模块是第三方提供的,所以在编译nginx源码的时候,需要将fair添加到nginx模块中。

假设我的nginx是通过源码安装的,安装在/opt/nginx目录下,而且安装时没有添加fair模块

1> 下载fair模块源码 
下载地址:https://github.com/xyang0917/nginx-upstream-fair

cd /opt
wget https://github.com/xyang0917/nginx-upstream-fair/archive/master.zip
unzip master.zip

解压后的目录名为:nginx-upstream-fair-master

2> 重新编译nginx,将fair模块添加到编译参数 
我的nginx源码目录在/opt/nginx-1.10.0

cd /opt/nginx-nginx-1.10.0
./configure --prefix=/opt/nginx --add-module=/opt/nginx-upstream-fair-master
make

注意:不要执行make install,这样会覆盖之前nginx的配置 
3> 将新编译的nginx可执行程序拷贝到/opt/nginx/sbin/目录下,覆盖之前安装的nginx 
编译后的nginx执行程序,放在nginx源码的objs目录下

ps -aux | grep nginx
kill -9 nginx进程ID # 停止nginx服务
cp /opt/nginx-1.10.0/objs/nginx /opt/nginx/sbin/ # 覆盖旧的nginx
nginx # 启动服务

配置使用fair负载策略模块:

upstream tomcats {
fair;
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}

由于采用fair负载策略,配置weigth参数改变负载权重将无效。

2> url_hash

按请求url的hash结果来分配请求,使每个url定向到同一个后端服务器,服务器做缓存时比较有效。

1.7.2版本以后,url_hash模块已经集成到了nginx源码当中,不需要单独安装。之前的版本仍需要单独安装,下载地址:https://github.com/evanmiller/nginx_upstream_hash

安装方法和fair模块一样,先下载url_hash源码,然后重新编译nginx源码,将url_hash模块添加到编译配置参数当中,最后将编译后生成的nginx二进制文件替换之前安装的nginx二进制文件即可。

upstream tomcats {
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
hash $request_uri;
}

Nginx负载均衡配置与负载策略的更多相关文章

  1. nginx的负载均衡配置,常用策略

    场景:nginx是一款非常优秀的负载均衡服务器,小巧而且性能强悍,中小型企业的首选. 下面介绍nginx的负载均衡的几种常见的配置以及优缺点 第一种:轮询(默认) 优点:实现简单 缺点:不考虑每台服务 ...

  2. nginx高性能WEB服务器系列之六--nginx负载均衡配置+健康检查

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  3. Mall电商项目总结(二)——nginx负载均衡配置和策略

    1. nginx配置文件 用户在浏览器上输入,http://www.xwld.site/ 实际上是在访问服务器80端口,nginx 监听80端口,将用户的请求转发到8080和9080端口 . upst ...

  4. Nginx 负载均衡-加权轮询策略剖析

    本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更 ...

  5. 【Nginx】负载均衡-加权轮询策略剖析

    转自:江南烟雨 本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别. 如果Nginx是以反向代理的形式配置运行,那么对请求的实际处理需要转发到后端服 ...

  6. Tomcat服务部署与Nginx负载均衡配置

    一.中间键产品介绍 目前来说IBM的WebSphere,Oracle的Weblogic占据了市场上java语言Web站点的部分份额,该两种软件都是商业化的软件,由于性能优越,可靠性高等优点应用于大型互 ...

  7. Linux记录-Nginx+Tomcat负载均衡配置

    Nginx负载均衡配置及策略: 轮询(默认) 优点:实现简单缺点:不考虑每台服务器的处理能力配置示例如下:upstream www.xxx.com {# 需要负载的server列表server www ...

  8. Centos上配置nginx+uwsgi+负载均衡配置

    负载均衡在服务端开发中算是一个比较重要的特性.因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理后端,Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就可以 ...

  9. Nginx + Tomcat Windows下的负载均衡配置

     Nginx + Tomcat Windows下的负载均衡配置 一.为什么需要对Tomcat服务器做负载均衡?    Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果超过50 ...

随机推荐

  1. Kubernetes学习之路(六)之创建K8S应用

    一.Deployment的概念 K8S本身并不提供网络的功能,所以需要借助第三方网络插件进行部署K8S中的网络,以打通各个节点中容器的互通. POD,是K8S中的一个逻辑概念,K8S管理的是POD,一 ...

  2. C++ STL 学习笔记__(5)list

    10.2.6List容器 List简介 ²  list是一个双向链表容器,可高效地进行插入删除元素. ²  list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符.It++(ok) i ...

  3. js中哈希表的几种用法总结

    本篇文章只要是对js中哈希表的几种用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. <html> <head> <script type=" ...

  4. 微信小程序中的 web-view 组件

    web-view 是一个可以承载 web 网页的容器,当 WXML 文件中存在 web-view 组件时,其他组件会自动全部失效,而且 web-view 承载的组件会自动铺满小程序的整个页面.其他组件 ...

  5. vue.js和vue-router和vuex快速上手知识

    vue.js和vue-router和vuex快速上手知识 一直以来,认为vue相比react而言,学习成本会更低,会更简单,但最近真正接触后,发现vue的各方面都有做一些客户化的优化,有一些亮点,但也 ...

  6. 私有云搭建:树莓派+kodexplorer可道云,几步搞定!

    目前蒲公英异地组网则是推出了树莓派1.0软件客户端.无需公网IP!简单60秒设置!轻松远程访问树莓派!实现远程登录.远程配置.远程访问服务.传输数据等等操作.例如:蒲公英树莓派1.0软件客户端+可道云 ...

  7. CocoStuff—基于Deeplab训练数据的标定工具【一、翻译】(未完)

    一.CocoStuff简介 CocoStuff是一款为deeplab设计的,运行在Matlab中的语义标定工具,其标定结果和结合Deeplab训练出的结果均为mat文件格式,该项目源码已在github ...

  8. 多tomcat 同一个浏览器 多个项目 会导致session覆盖

    1,多tomcat 同一个浏览器 同一个项目 会导致session覆盖 个人猜测:一个服务器中有多个Tomcat服务器多个项目,每个服务器占用不同的端口号,当在同一个浏览器里面同时打开2个系统时,一个 ...

  9. python基础网络编程--转

    python之网络编程 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的 ...

  10. 笨办法学Python - 习题1: A Good First Program

    在windows上安装完Python环境后,开始按照<笨办法学Python>书上介绍的章节进行练习. 习题 1: 第一个程序 第一天主要是介绍了Python中输出函数print的使用方法, ...