1:负载均衡

负载均衡提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡有两方面的含义:
首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;
其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。

2:负载均衡的分类

二层负载均衡(mac)

根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应)

三层负载均衡(ip)

一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应)

四层负载均衡(tcp)

在三次负载均衡的基础上,用ip+port接收请求,再转发到对应的机器。

七层负载均衡(http)

根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。

3:Nginx负载均衡的算法

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

2、weight(轮询权值)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

upstream bakend {  
        server  127.0.0.1:8081 weight=2 max_fails=2  fail_timeout=2;
        server  127.0.0.1:8082 weight=1 max_fails=2  fail_timeout=2;
        server 127.0.0.1:8083 backup; #调用backup服务器,可以是本机或其他服务器。
}

如上所示,如果有三个请求,2个落在8081上,1个落在8082上。

3、ip_hash

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。

upstream slbserver {
        #根据Ip来分配,有存储cookie登录等场景适用
        ip_hash; 
        server  127.0.0.1:8081 weight=2 max_fails=2  fail_timeout=2;
        server  127.0.0.1:8082 weight=1 max_fails=2  fail_timeout=2;
        server 127.0.0.1:8083 backup; #调用backup服务器,可以是本机或其他服务器。
}
4、fair

比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。

upstream backend {  
    server  127.0.0.1:8081;
    server 127.0.0.1:8082; 
    fair; 
}
5、url_hash

按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

upstream backend {  
    server  127.0.0.1:8081;
    server 127.0.0.1:8082;
    hash $request_uri;
    hash_method crc32;
    .....

4:Nginx负载均衡调度状态

在Nginx upstream模块中,可以设定每台后端服务器在负载均衡调度中的状态,常用的状态有:

1、down
表示当前的server暂时不参与负载均衡

2、backup
预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的访问压力最低

3、max_fails
允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。

4、fail_timeout
请求失败超时时间,在经历了max_fails次失败后,暂停服务的时间。max_fails和fail_timeout可以一起使用。

1:搭建简单的负载均衡服务

一、案例描述
使用一台虚拟机,使用端口模拟不同的服务,设置四个nginx配置文件,作用分别如下:

端口

作用

配置文件

8888

负载均衡

/etc/nginx/conf.d/slb.conf

8081

应用服务1,服务地址:/opt/app/slb1

/etc/nginx/conf.d/slb1.conf

8082

应用服务2,服务地址:/opt/app/slb2

/etc/nginx/conf.d/slb2.conf

8083

备份服务器

/etc/nginx/conf.d/slb3.conf

用户访问8888,可以转发到8081和8082上

1、负载均衡服务nginx配置文件 slb.conf

#设置负载均衡
upstream slbserver {
        #ip_hash; #根据Ip来分配,有存储cookie登录等场景适用
        #默认是轮询
        server  127.0.0.1:8081 weight=2 max_fails=2  fail_timeout=2;
        server  127.0.0.1:8082 weight=1 max_fails=2  fail_timeout=2;
         #调用backup服务器,可以是本机或其他服务器。
        server 127.0.0.1:8083 backup;
}
server {
    #访问入口
    listen       8888; 
    server_name  localhost;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        proxy_pass  http://slbserver;#通过upstrean定义的服务器组名调用后端服务器
        proxy_set_header X-Real-IP $remote_addr;  #传递客户端的ip地址
    }
}

2、应用服务1Nginx配置文件 slb1.conf

server {
    listen       8081;
    server_name  localhost;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   /opt/app/slb1;
        index  index.html index.htm;
    }
}

3、应用服务2Nginx配置文件slb2.conf

server {
    listen       8082;
    server_name  localhost;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   /opt/app/slb2;
        index  index.html index.htm;
    }
}

4、备份服务器Nginx配置文件 slb3.conf

server {
    listen       8083;
    server_name  localhost;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   /opt/app/slb3;
        index  index.html index.htm;
    }
}

测试访问文件 index.html

分别放到:/opt/app/slb1;/opt/app/slb2;/opt/app/slb3;三个文件夹下;
并请将server 1修改一下,区分开就可以。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Server1</title>
</head>
<body>
<h1>SERVER 1</h1>
</body>
</html>

重启nginx并测试

nginx -s reload

浏览器中输入:http://127.0.0.1:8888
此时可以看到,被分发到应用服务1和2上。
也可以分别测试一下ip_hash的功能,以及权重weight的作用。这里就不测试了。
一个简单的nginx负载均衡服务就搭建完成了。
至于访问动态应用,比如php,java或者golang的应用