问题场景
我们都知道,session是用于在服务器上保存用户的登录信息的,在使用负载均衡时,后端的服务器ip不是固定的,这样就导致了用户刷新网页后登陆信息会失效、订单异常等一系列问题。
解决方式
一般有以下方法来解决这个问题
- nginx ip_hash
通过nginx负载均衡策略中ip_hash来保持数据的持久化,原理就是客户端访问时,nginx会将客户端的ip转换为一个固定的hash值,同一客户端连续的Web请求都会被分发到同一服务器进行处理,从而达到保持请求状态的完整性的目的。
PS:需要注意的是,这种情况仅适用于nginx在最前端的情况下,在大型网站的架构体系中,nginx负载均衡下面可能还有各种中间件等情况,发生这种情况的话,又会发生上述问题了!
upstream example.com
{
server 192.168.1.101:80;
server 192.168.1.102:80;
ip_hash;
}
server
{
listen 80;
location /
{
proxy_pass
http://example.com;
}
}
- 使用redis/memcached等缓存服务器
使用redis是我个人比较喜欢的方式,原因也很简单,因为它是目前市场上用的最多,速度最快的非关系型数据库!它真的非常快、快、快!
当然了,你要先告诉开发,session模块要分开来写,将对系统I/O有较高需求的模块(比如session、缓存、队列数据、临时中专数据等等)都可以通过redis进行存储。需要注意的是,一定要先搭好集群,做好持久化!不然又是一次重大的生产事故了,血崩!