redis - Nginx负载均衡策略和SESSION共享
習慣沉默
習慣沉默 2017-04-25 09:04:41
0
1
724

集群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共享方案,但相对更加激进。

習慣沉默
習慣沉默

membalas semua(1)
过去多啦不再A梦

Bahagian mutlak sesi yang anda bincangkan di sini merujuk kepada menyimpan maklumat log masuk, bukan?

Jika ya, maka perkhidmatan log masuk bersatu juga harus menjadi penyelesaian

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan