一 负载均衡概述

1.1 负载均衡介绍

负载均衡是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。对于Web应用,通过负载均衡,可以将一台服务器的工作扩展到多台服务器中执行,提高整个网站的负载能力。其本质采用一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。

二 Nginx负载均衡

2.1 优点

  • 高并发连接
  • 内存消耗少
  • 配置文件非常简单
  • 成本低廉
  • 支持Rewrite重写规则
  • 内置的健康检查功能
  • 节省带宽
  • 稳定性高
  • 2.2 主要均衡机制

  • round-robin:轮询。以轮询方式将请求分配到不同服务器上。
  • least-connected:最少连接数。将下一个请求分配到连接数最少的那台服务器上。
  • ip-hash:基于客户端的IP地址。散列函数被用于确定下一个请求分配到哪台服务器上。
  • 2.3 负载均衡策略

    nginx的负载均衡策略可以划分为两大类:内置策略和扩展策略,扩展策略为第三方提供。
    内置策略
  • 轮询(默认):Nginx根据请求次数,将每个请求均匀分配到每台服务器;
  • weight:加权轮询,加权轮询则是在第一种轮询的基础上对后台的每台服务赋予权重,服务器的权重比例越大,被分发到的概率也就越大。
  • least_conn:最少连接,将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
  • ip_hash:IP 哈希,绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。
  • 扩展策略
  • fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
  • url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
  • 提示:默认轮询可能存在一个问题,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,其登录信息会丢失。因为在负载均衡系统中,每次请求都会重新定位到服务器集群中的某一个,那么就会导致已经登录某一个服务器的用户在重新定位到另一个服务器了,所以就会导致丢失登录信息。


    因此针对如上问题,可以采用ip_hash方式解决,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

    2.4 负载均衡内置变量

    nginx负载均衡器内置变量(Embedded Variables),nginx负载均衡模块ngx_http_upstream_module支持下列内置变量:
  • $upstream_addr:保存一个服务器的IP地址和端口号或者UNIX-domain套接字文件的路径。如果在处理请求过程中使用了多个服务器,那么它们的地址将以逗号分割,例如 :“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。如果一个内置的从一个服务器组到另一个服务器组的重定向使用X-Accel-Redirect” or error_page ,那么那些服务器组以冒号隔开,例如“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。
  • $upstream_response_time:保存nginx负载均衡服务器响应时间,以毫秒计。多个响应也以逗号和冒号隔开。
  • $upstream_status:保存nginx负载均衡服务器响应代码。多个响应代码也以逗号或冒号隔开。
  • $upstream_http_:保存nginx负载均衡服务器响应头字段。例如,the “Server” response header field is made available through the $upstream_http_server variable.注意,只有最后一个服务器响应头字段被保存。
  • 2.5 负载均衡健康检查

    nginx反向代理包含内置的或第三方扩展来实现服务器健康检测的。如果后端某台服务器响应失败,nginx会标记该台服务器失效,在特定时间内,请求不分发到该台上。
    fail_timeout:该指令定义了多长时间服务器将被标记为失败。在fail_timeout后,服务器还是failed,nginx将检测该服务器是否存活,如果探测成功,将标记为活的。
    max_fails:该指令设置在fail_timeout期间内连续的失败尝试。默认情况下,max_fails为1。如果被设置为0,该服务器的健康检测将禁用。

    2.6 负载均衡状态码



    状态


    概述
    max_fails
    允许请求失败的次数,默认为1。
    max_conns
    限制最大接受的连接数。
    fail_timeout
    在经历了max_fails次失败后,暂停服务的时间。
    backup
    预留的备份机器。
    down
    表示当前的server暂时不参与负载均衡。

    三 默认轮询负载均衡



    3.1 环境预设


















    主机


    IP


    备注
    nginx01
    172.24.10.21
    Nginx负载均衡
    nginx02
    172.24.10.22
    后端RS 01
    nginx03
    172.24.10.23
    后端RS 02
    nginx04
    172.24.10.24
    后端RS 03
    所有节点安装Nginx:略
    配置RS测试页面:
      1 [root@nginx02 ~]# mkdir /usr/share/nginx/balanc/
    2 [root@nginx02 ~]# echo '<h1>Rs_172.24.10.22</h1>' > /usr/share/nginx/balanc/index.html
      1 [root@nginx02 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
    2 server {
    3 listen 9090;
    4 server_name 172.24.10.22;
    5 location / {
    6 root /usr/share/nginx/balanc;
    7 index index.html;
    8 access_log /var/log/nginx/rs.access.log main;
    9 error_log /var/log/nginx/rs.error.log warn;
    10 }
    11 }
    12 EOF
      1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
    2 [root@nginx02 ~]# nginx -s reload #重载配置文件

      1 [root@nginx03 ~]# mkdir /usr/share/nginx/balanc/
    2 [root@nginx03 ~]# echo '<h1>Rs_172.24.10.23</h1>' > /usr/share/nginx/balanc/index.html
      1 [root@nginx03 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
    2 server {
    3 listen 9090;
    4 server_name 172.24.10.23;
    5 location / {
    6 root /usr/share/nginx/balanc/;
    7 index index.html;
    8 access_log /var/log/nginx/rs.access.log main;
    9 error_log /var/log/nginx/rs.error.log warn;
    10 }
    11 }
    12 EOF
      1 [root@nginx03 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
    2 [root@nginx03 ~]# nginx -s reload #重载配置文件

      1 [root@nginx04 ~]# mkdir /usr/share/nginx/balanc/
    2 [root@nginx04 ~]# echo '<h1>Rs_172.24.10.24</h1>' > /usr/share/nginx/balanc/index.html
      1 [root@nginx04 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
    2 server {
    3 listen 9090;
    4 server_name 172.24.10.24;
    5 location / {
    6 root /usr/share/nginx/balanc/;
    7 index index.html;
    8 access_log /var/log/nginx/rs.access.log main;
    9 error_log /var/log/nginx/rs.error.log warn;
    10 }
    11 }
    12 EOF
      1 [root@nginx04 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
    2 [root@nginx04 ~]# nginx -s reload #重载配置文件
    3 [root@client ~]# curl 172.24.10.22:9090
    4 <h1>Rs_172.24.10.22</h1>
    5 [root@client ~]# curl 172.24.10.23:9090
    6 <h1>Rs_172.24.10.23</h1>
    7 [root@client ~]# curl 172.24.10.24:9090
    8 <h1>Rs_172.24.10.24</h1>

    3.2 默认轮询方式配置

      1 [root@nginx01 ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 server 172.24.10.22:9090;
    4 server 172.24.10.23:9090;
    5 server 172.24.10.24:9090;
    6 }
    7
    8 server {
    9 listen 80;
    10 server_name balance.linuxds.com;
    11 access_log /var/log/nginx/mybalance.access.log main;
    12 error_log /var/log/nginx/mybalance.error.log warn;
    13 location / {
    14 proxy_pass http://mybalance01;
    15 index index.html;
    16 proxy_redirect off;
    17 proxy_set_header Host $host;
    18 proxy_set_header X-Real-IP $remote_addr;
    19 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    20 client_max_body_size 10m; #允许客户端请求的最大单文件字节数
    21 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
    22 proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时)
    23 proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
    24 proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
    25 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    26 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
    27 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
    28 proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    29 }
    30 }
      1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
    2 [root@balance ~]# nginx -s reload #重载配置文件

    3.3 确认测试

    浏览器访问:http://balance.linuxds.com/,并且刷新3次测试效果。

    四 加权轮询负载均衡

    4.1 环境预设

    参考3.1。

    4.2 加权轮询方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 server 172.24.9.11:9090 weight=1 max_fails=1 fail_timeout=2;
    4 server 172.24.9.12:9090 weight=8 max_fails=2 fail_timeout=2;
    5 server 172.24.9.13:9090 backup; #配置为备份服务器
    6 }
    7
    8 server {
    9 listen 80;
    10 server_name balance.linuxds.com;
    11 access_log /var/log/nginx/mybalance.access.log main;
    12 error_log /var/log/nginx/mybalance.error.log warn;
    13 location / {
    14 proxy_pass http://mybalance01;
    15 index index.html;
    16 proxy_redirect off;
    17 proxy_set_header Host $host;
    18 proxy_set_header X-Real-IP $remote_addr;
    19 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    20 client_max_body_size 10m;
    21 client_body_buffer_size 128k;
    22 proxy_connect_timeout 300;
    23 proxy_send_timeout 300;
    24 proxy_read_timeout 300;
    25 proxy_buffer_size 4k;
    26 proxy_buffers 4 32k;
    27 proxy_busy_buffers_size 64k;
    28 proxy_temp_file_write_size 64k;
    29 }
    30 }
    配置释义:
    weight:参数值越高则被分配到的概率越大。

    4.3 确认测试

    浏览器访问:http://balance.odocker.com/,并且刷新3次测试效果。此时测试172.24.9.12更容易被分配,172.24.9.13在其他RS正常的时候不会参与响应。

    五 最小连接负载均衡

    5.1 环境预设

    参考3.1。

    5.2 最小连接方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 least_conn;
    4 server 172.24.10.21:9090;
    5 server 172.24.10.22:9090;
    6 server 172.24.10.23:9090;
    7 }
    8
    9 server {
    10 listen 80;
    11 server_name balance.linuxds.com;
    12 access_log /var/log/nginx/mybalance.access.log main;
    13 error_log /var/log/nginx/mybalance.error.log warn;
    14 location / {
    15 proxy_pass http://mybalance01;
    16 index index.html;
    17 }
    18 }

    5.3 确认测试

    浏览器访问:http://balance.linuxds.com/。
    提示:此方式主要应用于请求处理时间长短不一造成服务器过载的情况。



    六 IP hash负载均衡

    6.1 环境预设

    参考3.1。

    6.2 ip hash方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 ip_hash;
    4 server 172.24.10.21:9090;
    5 server 172.24.10.22:9090;
    6 server 172.24.10.23:9090;
    7 }
    8
    9 server {
    10 listen 80;
    11 server_name balance.linuxds.com;
    12 access_log /var/log/nginx/mybalance.access.log main;
    13 error_log /var/log/nginx/mybalance.error.log warn;
    14 location / {
    15 proxy_pass http://mybalance01;
    16 index index.html;
    17 }
    18 }

    6.3 确认测试

    浏览器访问:http://balance.linuxds.com/。
    提示:此方式主要应用于会话保持。



    七 fair负载均衡

    7.1 环境预设

    参考3.1。

    7.2 fair方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 fair;
    4 server 172.24.10.21:9090;
    5 server 172.24.10.22:9090;
    6 server 172.24.10.23:9090;
    7 }
    8
    9 server {
    10 listen 80;
    11 server_name balance.linuxds.com;
    12 access_log /var/log/nginx/mybalance.access.log main;
    13 error_log /var/log/nginx/mybalance.error.log warn;
    14 location / {
    15 proxy_pass http://mybalance01;
    16 index index.html;
    17 }
    18 }

    7.3 确认测试

    浏览器访问:http://balance.linuxds.com/。
    提示:该方式下响应快的服务器都会优先分配,接着才会分配响应速度较慢的服务器。因此此方式主要应用于后端服务器性能不均一。



    八 url_hash负载均衡

    8.1 环境预设

    参考3.1。

    8.2 ip hash方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
    2 upstream mybalance01 {
    3 hash $request_uri;
    4 hash_method crc32;
    5 server 172.24.10.21:9090;
    6 server 172.24.10.22:9090;
    7 server 172.24.10.23:9090;
    8 }
    9
    10 server {
    11 listen 80;
    12 server_name balance.linuxds.com;
    13 access_log /var/log/nginx/mybalance.access.log main;
    14 error_log /var/log/nginx/mybalance.error.log warn;
    15 location / {
    16 proxy_pass http://mybalance01;
    17 index index.html;
    18 }
    19 }

    8.3 确认测试

    浏览器访问:http://balance.linuxds.com/。
    提示:此方式主要应用于后端服务器为缓存时比较适用。


    参考文档:
    https://ifeve.com/nginx-http/
    https://www.cnblogs.com/lcword/p/11800474.html

    012.Nginx负载均衡的更多相关文章

    1. 对比Haproxy和Nginx负载均衡效果

      为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析.下面说下这两种负载均衡环境下抓包 ...

    2. nginx负载均衡集群

      nginx负载均衡集群  0.前言:nginx 负载均衡,属于网络7层模型中的应用层,说白了就是一个代理,要用 upstrem 模块实现,代理则用proxy模块 1.可以针对域名做转发,lvs只能针对 ...

    3. 手把手教你玩转nginx负载均衡(二)----安装虚拟机操作系统

      引言 在上一篇,我们组装好了虚拟机的硬件部分,那么现在我们就要把操作系统装上了,既然是服务器,那么安装linux操作系统是个比较好的选择,如果你喜欢的话,安装windows也是没有任何问题的 我这里选 ...

    4. nginx负载均衡基于ip_hash的session粘帖

      nginx负载均衡基于ip_hash的session粘帖 nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除 ...

    5. Net分布式系统之二:CentOS系统搭建Nginx负载均衡

      一.关于CentOS系统介绍 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat ...

    6. Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用

      上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行.针对系统架构设计的高可用要求,我们需要解决Nginx ...

    7. 配置nginx负载均衡

      配置nginx负载均衡 执行命令:vi /usr/local/nginx/sbin/nginx/conf/nginx.conf 修改为: worker_processes  2; events {   ...

    8. 烂泥:nginx负载均衡

      本文由秀依林枫提供友情赞助,首发于烂泥行天下. 今天我们来学习下有关nginx的负载均衡配置.nginx的负载均衡是通过nginx的upstream模块和proxy_pass反向代理来实现的. 说明: ...

    9. nginx负载均衡集群中的session共享说明

      在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...

    随机推荐

    1. 基于SSM框架的新生报到可视化系统

      1.本课题的目的及意义 新生报到数据一直是困扰着各大高校的管理性问题,人数多.工作量大,这无疑是一个挑战,也因此加快了高校的信息化建设步伐.随着互联网的普及与发展,日常生活中人们接触到的数据正以惊人的 ...

    2. Java内存溢出OutOfMemoryError的产生与排查

      在java的虚拟机异常中,有两个异常是大家比较关心的,一个是StackOverflowError,另一个是OutOfMemoryError.今天我们就来看看OutOfMemoryError是怎么产生的 ...

    3. 4.WebPack-Loader

      一.什么是Loader WebPack默认只"认识"以*.js结尾的文件,如果想处理其他类型的文件,就必须添加Loader,有各种各样的Loader,每个Loader可处理不同类型 ...

    4. 《Java核心技术》笔记:第7章 异常、断言和日志

      1. 异常 (P 280)异常处理需要考虑的问题: 用户输入错误 设备错误 物理限制 代码错误 (P 280)传统的处理错误的方法是:返回一个特殊的错误码,常见的是返回-1或者null引用 (P 28 ...

    5. redis基础二----操作set数据类型

      set集合是无序的,不能存在重复元素 bbb吃重复元素,是不能添加成功的 2 接下来分析zset,是有序的,你在添加的时候要指定元素的序列号 上面的 3 4 5 6 就是指定的元素的序列号 withs ...

    6. MyBatis学习笔记(2)--缓存

      一.什么是缓存 --存在于内存中的临时数据. 为什么使用缓存?--减少和数据库的交互次数,提高执行效率. 适用于缓存的数据: 1.经常查询并且不经常改变的数据. 2.数据的正确与否对最终结果影响较小的 ...

    7. ubuntu18.04安装nodejs最新版、指定版 12.x 14.x

      今天准备在 ubuntu 服务器里面安装 nodejs 版本,ubuntu 18.04 仓库 nodejs 默认是 8.x 版本. 1. 通过 apt 安装 nodejs 在 Ubuntu 18.04 ...

    8. xxl-job搭建、部署、SpringBoot集成xxl-job

      一.搭建xxl-job 1.下载xxl-job代码 码云地址:https://gitee.com/xuxueli0323/xxl-job gitHub地址:https://github.com/xux ...

    9. DOM-BOM-EVENT(3)

      3.Node常用属性 childNodes 获取所有子节点 <div id="wrap"> <div>1111</div> <div> ...

    10. Spring 获取单例流程(三)

      读完这篇文章你将会收获到 Spring 何时将 bean 加入到第三级缓存和第一级缓存中 Spring 何时回调各种 Aware 接口.BeanPostProcessor .InitializingB ...