小白学习NGINX负载均衡的笔记

目录

引言

模块安装

1.下载NGINX稳定发行版: 

2.解压并切换到安装目录:

3.编译安装  &  各种依赖安装:

4.修改配置文件

5.检测语法 & 开启服务:

配置示例:

1、轮询(weight=1)  

2、weight

3、ip_hash

4、fair(第三方插件)

5、url_hash(第三方插件)

6、综合示例

问题和思考


引言

这里说的主要是webserver方面的负载均衡的一些内容:

首先负载均衡有很多中间件可以实现,NGINX(反向代理的方式)、LVS、zooker等。由于lvs是集成在Linux内核之中,对操作系统高度依赖,适用性不强。而zk又过于有名,在各种服务治理之中应用广泛。这里就只谈一谈NGINX的负载均衡思路和实践。

特别鸣谢:https://www.jianshu.com/p/5dcd1e027e17

模块安装

NGINX借助反向代理的思路实现代理转发,负载均衡的效果。但是为了实现这个效果,需要单独安装Stream模块(nginx默认不安装,且所需版本要高于1.9.0)。【ngx_stream_core_module模块工作于传输层,基于tcp或udp的服务连接实现所谓反向代理或调度器的能力】

安装过程nginx官网有详细的说明,这里给出我的安装示例:

1.下载NGINX稳定发行版: 

wget  https://nginx.org/download/nginx-1.12.1.tar.gz


2.解压并切换到安装目录:

tar -zxvf nginx-1.12.1.tar.gz

cd nginx-1.12.1

3.编译安装  &  各种依赖安装:

yum -y install gcc gcc-c++ autoconf automake

yum -y install zlib zlib-devel openssl openssl-devel pcre-devel

./configure --prefix=/opt/nginx --sbin-path=/opt/nginx/sbin/nginx --conf-path=/opt/nginx/conf/nginx.conf --with-http_stub_status_module --with-http_gzip_static_module --with-stream

make

make install

cd /opt/nginx

4.修改配置文件

ps :  这里在配置文件nginx.conf中添加的stream  配置项应该在最外层与http处于同一级别。总体感觉stream的语法与http段非常类似。

vim /opt/nginx/conf/nginx.conf(在配置文件最后行添加如下)

    stream {

      upstream NAME1 {

        hash $remote_addr consistent;

        server 10.22.0.7:5000 max_fails=3 fail_timeout=30s;

        server 10.22.0.8:5000 max_fails=3 fail_timeout=30s;

      }

      upstream NAME2 {

        hash $remote_addr consistent;

        server 192.168.5.8:8080 max_fails=3 fail_timeout=30s;

      }

      server{

      listen 8080;

        proxy_connect_timeout 1s;

        proxy_timeout 3s;

        proxy_pass NAME1;

      }

      server{

      listen 60000;

        proxy_connect_timeout 1s;

        proxy_timeout 3s;

        proxy_pass NAME2;

      }

    }

或者

upstream masters {      #定义一个服务组

    server 127.0.0.1:8070 weight=1 max_fails=3 fail_timeout=10s;

}

server {

    server {

        listen       8090;

        server_name  _;

        location / {

                proxy_pass http://masters;

                proxy_connect_timeout 2s;

                proxy_read_timeout 2s;

                proxy_send_timeout 2s;

        }

}

解析:

如上配置文件的含义为
将端口8080反向代理NAME1组的serverIP:PORT,最大失败次数为3,超时时间为30秒;
将端口60000反向代理NAME2组的serverIP:PORT,最大失败次数为3,超时时间为30秒。

同时 stream  支持5种方式的代理方式(灵活可配置,好惊喜):

1、后端响应时间短优先分配(fair)    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

2、轮询(weight=1)                                默认方式。

3、权重(weight不相同)                       适用于下游机器的性能不一致的情况,各个集群的加权可以灵活变动。

4、客户端IP进行哈希(ip_hash)        每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。
                                                              缺点:如果后端服务器down掉,要手工down掉。

5、根据目标网址哈希(url_hash)      按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。

                                                              缺点:需要借助第三方插件实现

5.检测语法 & 开启服务:

每次修改配置文件,建议重启nginx服务

#语法检查

/opt/nginx/sbin/nginx -t

#启动nginx

/opt/nginx/sbin/nginx

#重启nginx(推荐方式)

/opt/nginx/sbin/nginx -s reload

配置示例:

下面将上面的几种配置方式做个示例配置:

1、轮询(weight=1)  

默认选项,当weight不指定时,各服务器weight相同,
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream bakend {

    server 192.168.1.10;

    server 192.168.1.11;

}

2、weight


指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
如果后端服务器down掉,能自动剔除。
比如以下配置,则1.11服务器的访问量为1.10服务器的两倍。
 

upstream bakend {

    server 192.168.1.10 weight=1;

    server 192.168.1.11 weight=2;

}

3、ip_hash


每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。
如果后端服务器down掉,要手工down掉。
 

upstream resinserver{

    ip_hash;

    server 192.168.1.10:8080;

    server 192.168.1.11:8080;

}

4、fair(第三方插件)


按后端服务器的响应时间来分配请求,响应时间短的优先分配。
 

upstream resinserver{

    server 192.168.1.10:8080;

    server 192.168.1.11:8080;

    fair;

}

5、url_hash(第三方插件)


按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。
在upstream中加入hash语句,hash_method是使用的hash算法。

upstream resinserver{

    server 192.168.1.10:8080;

    server 192.168.1.11:8080;

    hash $request_uri;

    hash_method crc32;

}

6、综合示例

upstream tel_img_stream {

    #ip_hash;

    server 192.168.11.68:20201;

    server 192.168.11.69:20201 weight=100 down;

    server 192.168.11.70:20201 weight=100;

    server 192.168.11.71:20201 weight=100 backup;

    server 192.168.11.72:20201 weight=100 max_fails=3 fail_timeout=30s;

}

说明:
1)、down 表示当前的server暂时不参与负载
2)、weight 默认为1.weight越大,负载的权重就越大。
3)、backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
4)、上例中192.168.11.72:20201 设置最大失败次数为 3,也就是最多进行 3 次尝试,且超时时间为 30秒。max_fails 的默认值为 1,fail_timeout 的默认值是 10s。
注意,当upstream中只有一个 server 时,max_fails 和 fail_timeout 参数可能不会起作用。
weight\backup 不能和 ip_hash 关键字一起使用。

问题和思考

一个比较突出的问题就是:我们的web服务器常使用session 缓存用户的一些信息,当使用nginx做反向代理进行转发请求时,同一用户的不同时段请求会转发给不同的机器处理。如果程序依赖session数据,而不同机器间内存又不共享,可能出现逻辑问题,常见的是数据不一致。网上示例解决方法:

1、使用前述的ip_hash的方法,将同一用户(默认用户一次请求IP不变)的每次请求都送给同一台机器处理。    缺点:负载均衡的灵活性下降,不能保证用户一次请求不切换IP。

2、使用cookie 替代session,将数据保存到客户端。                                                                                              缺点:数据安全性下降,而且这种情况不适用数据量比较大的情况。

3、使用DB ,redis  或者memcache等中间件存储数据,不同机器间进行数据共享。                                             缺点:数据读取速度受到中间件的性能影响。

猜你喜欢

转载自blog.csdn.net/zhanghao1225903428/article/details/85221899