目录
引言
这里说的主要是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稳定发行版:
|
2.解压并切换到安装目录:
|
3.编译安装 & 各种依赖安装:
|
4.修改配置文件
ps : 这里在配置文件nginx.conf中添加的stream 配置项应该在最外层与http处于同一级别。总体感觉stream的语法与http段非常类似。
|
或者
|
解析:
如上配置文件的含义为
将端口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服务
|
配置示例:
下面将上面的几种配置方式做个示例配置:
1、轮询(weight=1)
默认选项,当weight不指定时,各服务器weight相同,
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
|
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
如果后端服务器down掉,能自动剔除。
比如以下配置,则1.11服务器的访问量为1.10服务器的两倍。
|
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。
如果后端服务器down掉,要手工down掉。
|
4、fair(第三方插件)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
|
5、url_hash(第三方插件)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。
在upstream中加入hash语句,hash_method是使用的hash算法。
|
6、综合示例
|
说明:
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等中间件存储数据,不同机器间进行数据共享。 缺点:数据读取速度受到中间件的性能影响。