redis - Nginx负载均衡策略和SESSION共享

 lin碌say-蓉 发布于 2022-10-29 19:56

集群WEB应用或多或少都会遇到session问题,多台服务器的情况下,session的要地存储会引起一些问题,影响用户体验。

下面列出这里我能想到的几种处理方法,各有优缺点

  • 配置Nginx负载策略,比如ip_hash,使客户端绑定在固定服务器上,这样最终用户访问到的机器是固定的,所以session存储在本地,不影响用户使用。但缺点主要有两项:

  1. ip_hash分配并不均匀,尤其是用于ip_hash的Nginx不是最前端时,可能无法使用此策略

  2. 假如不考虑负载均匀问题,仍然存在的问题是,当后端某台机器宕掉时,这台机器上所有的session都会失去,假如session中记录的用户的认证状态,那么用户将变成未认证状态

  • 服务器(Nginx代理的服务器)间进行session广播,这种方式存在的问题是,随着集群规模的扩张,广播的性能会变得很差,一般不推荐使用

  • 使用session共享方案,具体使用redis还是使用memcached这里不讨论,这里假设使用redis,方法也很简单,将session的存储实现用redis替换掉,也可以使用HttpServletRequestWrapper方式来动态修改sessionmemcached-session-manager或者spring-session等实现,除了集中存储对性能(相对于本地存储)有一定影响,其它几乎完美,前提是实现代码够强壮

  • 个人也想了一个有缺陷的办法,反正也只是设想,从来没用过。session广播的方式随着集群规模扩大,性能会下降,那么就不所有机器间广播,可以两台、三台之间广播,假设以两台为一组,所有集群中的服务器,以两台为单位分组,相互广播session,这时只需要保证相互广播的两台机器不同时挂掉即可(^_^ 貌似无法保证的吧!)

除了上面一的些方法,肯定还有其它办法,有兴趣的进来讨论一下

补充记录

[2016/9/1]
个人认为完全可以避免使用sessionservlet系的应用做分布式本就有很多限制,如果要实现分布式,最好的办法是利用http的无状态特性来实现,当然,用户登录、购物车等信息确实需要进行状态存储,这些完全可以直接存储到第三方存储中,比如:redismysql等,其本质上类似于session共享方案,但相对更加激进。

1 个回答
  • 你这里所说的session绝对部分说的是存登录信息吧?

    如果是,那么统一登录服务应该也是一种方案

    2022-10-31 19:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有