찾다

 >  Q&A  >  본문

Nginx负载均衡策略和SESSION共享

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

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

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

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

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

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

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

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

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



高洛峰高洛峰2945일 전775

모든 응답(1)나는 대답할 것이다

  • 三叔

    三叔2016-11-11 11:20:27

    你这里所说的session绝对部分说的是存登录信息吧?

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


    회신하다
    0
  • 취소회신하다