当使用多台服务器架设成集群之后,我们通过负载均衡的方式,同一个用户(或者ip)访问时被分配到不同的服务器上,假设在A服务器登录,如果在B服务器拿不到用户的登录信息session。这时访问到B服务器时就出现未登录情况。
所以如何对于这种情况做到共享session至关重要。
1.通过Nginx负载均衡 ip_hash策略
ip_hash通过用户的ip进行hash计算后,通过Nginx的算法分配到一台固定的服务器,这种方式让用户和一台服务器绑定;就没有session丢失的问题.
缺点:不安全.因为ip完全可以被仿造
改进:SSO单点登录,解决了用户登录验证的分布式问题,但是没有解决session共享问题
2.通过数据库mysql共享session
采用一台专门的mysql服务器来存储所有的session信息。缺点:mysql服务器无法工作,影响整个系统
3.通过cookie共享session
把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。
当访问服务器A时,登录成功之后将产生的session信息存放在cookie中;当访问请求分配到服务器B时,服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。
缺点:cookie的安全性不高,容易伪造、客户端禁止使用cookie等都可能造成无法共享session。
4.通过redis共享session
他可以把web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin都可以放到这个”内存池”中,其他的都可以使用。
edis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。