负载均衡:静态负载均衡算法 与 动态负载均衡算法 实例

一、普通轮询算法

这是Nginx 默认的轮询算法。

例子:两台相同的Tomcat服务器,通过 localhost:8080 访问Tomcat1,通过 localhost:8081访问Tomcat2,现在我们要输入 localhost 这个地址,可以在这两个Tomcat服务器之间进行交替访问。

1、分别修改两个Tomcat服务器的端口为8080和8081。然后再修改Tomcat的首页,使得访问这两个页面时能够区分。如下:

修改端口号文件为 server.xml :
image

修改首页的路径为:webapps/ROOT/index.jsp
image

修改完成之后,分别启动这两个Tomcat服务器,然后分别输入相应的地址端口号:

输入地址:localhost:8081
image

输入地址:localhost:8080
image

2、修改 nginx 的配置文件 nginx.conf

upstream OrdinaryPolling {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://OrdinaryPolling;
            index  index.html index.htm index.jsp;

        }
    }

3、启动 nginx。然后在浏览器输入localhost 地址,观看页面变化:

image

二、基于比例加权轮询

上述两台Tomcat服务器基本上是交替进行访问的。但是这里我们有个需求:

由于Tomcat1服务器的配置更高点,我们希望该服务器接受更多的请求,而 Tomcat2 服务器配置低,希望其处理相对较少的请求。

那么这时候就用到了加权轮询机制了。

nginx.conf 配置文件如下:

upstream OrdinaryPolling {
    server 127.0.0.1:8080 weight=5;
    server 127.0.0.1:8081 weight=2;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://OrdinaryPolling;
            index  index.html index.htm index.jsp;

        }
    }

其实对比上面不加权的轮询方式,这里在 upstream 指令中多了一个 weight 指令。该指令用于配置前面请求处理的权重,默认值为 1。

也就是说:第一种不加权的普通轮询,其实其加权值 weight 都为 1。

下面我们看页面相应结果:
image

明显 8080 端口号出现的次数更多,试验的次数越多越接近我们配置的比例。

三、基于IP路由负载

我们知道一个请求在经过一个服务器处理时,服务器会保存相关的会话信息,比如session,但是该请求如果第一个服务器没处理完,通过nginx轮询到第二个服务器上,那么这个服务器是没有会话信息的。

最典型的一个例子:用户第一次进入一个系统是需要进行登录身份验证的,首先将请求跳转到Tomcat1服务器进行处理,登录信息是保存在Tomcat1 上的,这时候需要进行别的操作,那么可能会将请求轮询到第二个Tomcat2上,那么由于Tomcat2 没有保存会话信息,会以为该用户没有登录,然后继续登录一次,如果有多个服务器,每次第一次访问都要进行登录,这显然是很影响用户体验的。

这里产生的一个问题也就是集群环境下的 session 共享,如何解决这个问题?

通常由两种方法:

1、第一种方法是选择一个中间件,将登录信息保存在一个中间件上,这个中间件可以为 Redis 这样的数据库。那么第一次登录,我们将session 信息保存在 Redis 中,跳转到第二个服务器时,我们可以先去Redis上查询是否有登录信息,如果有,就能直接进行登录之后的操作了,而不用进行重复登录。

2、第二种方法是根据客户端的IP地址划分,每次都将同一个 IP 地址发送的请求都分发到同一个 Tomcat 服务器,那么也不会存在 session 共享的问题。

而 nginx 的基于 IP 路由负载的机制就是上诉第二种形式。大概配置如下:

upstream OrdinaryPolling {
    ip_hash;
    server 127.0.0.1:8080 weight=5;
    server 127.0.0.1:8081 weight=2;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://OrdinaryPolling;
            index  index.html index.htm index.jsp;

        }
    }

注意:我们在 upstream 指令块中增加了 ip_hash 指令。该指令就是告诉 nginx 服务器,同一个 IP 地址客户端发送的请求都将分发到同一个 Tomcat 服务器进行处理。

四、基于服务器响应时间负载分配

根据服务器处理请求的时间来进行负载,处理请求越快,也就是响应时间越短的优先分配。

upstream OrdinaryPolling {
    server 127.0.0.1:8080 weight=5;
    server 127.0.0.1:8081 weight=2;
    fair;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://OrdinaryPolling;
            index  index.html index.htm index.jsp;

        }
    }

通过增加了 fair 指令。

五、对不同域名实现负载均衡

通过配合location 指令块我们还可以实现对不同域名实现负载均衡。

upstream wordbackend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    }

    upstream pptbackend {
    server 127.0.0.1:8082;
    server 127.0.0.1:8083;
    }

    server {
        listen       80;
        server_name  localhost;

        location /word/ {
            proxy_pass http://wordbackend;
            index  index.html index.htm index.jsp;

        }
    location /ppt/ {
            proxy_pass http://pptbackend;
            index  index.html index.htm index.jsp;

        }
    }

学习自:
https://www.cnblogs.com/ysocean/p/9392912.html

posted @ 2021-09-05 23:41  光一  阅读(620)  评论(0编辑  收藏  举报