Session共享问题---理论

  随着网站访问量增加,初期的一台服务器已经完全不能支持业务,这个时候我们就需要增加服务器设备,来抗住请求的增量,如下所示:

  负载均衡的目的本来就是要为了平均分配请求,所以没有固定第一次访问和第二次访问的是同一台服务器,实际上无法确定的。第一标访问可能是a服务器,第二秒访问的可能是c服务器。这样的话,生成的session文件不可能恰巧都在同一台服务器上,所以,当同一个登录会员,访问第一台服务器生成了一个session数据。第二秒负载请求到第三台服务器,结果获取不到刚才生成的session数据。
  ==只有涉及到多台后端服务器(php,java等处理服务器)的时候,才涉及到session读取不到的问题==

一、session共享方案
1、session复制
使用一些文件同步工具(linux下的rsync),当a服务器中的session数据有更改的时候,就会把这些更改也同步到b,c服务器上去。通过复制的方式,最终a,b,c各个服务器上都拷贝了一份session数据。

坏处:

  • ·速度慢。复制数据会出现延迟。比如第一秒访问是a服务器,修改了session数据,负载均衡,可能下一秒访问的是b服务器,session数据如果没有被复制到b服务器,则是读取不到session数据的,出现时间上的延迟。这种复制数据要消耗很多的网络带宽。在实际中业界用的比较少。机器的数量越多,复制数据的性能消耗越大。不具备高扩展性。
  • ·复制session的方式,无论是网络带宽成本还是硬件开销上都很大。

2、session存储客户端
把原来存储在服务器磁盘上的session数据存储到客户端的cookie中,一般是把session数据按照自己定义的加密规则,加密后保存在cookie中。
好处:
服务器的压力减小了,因为session数据不存在服务器磁盘上。根本就不会出现session读取不到的问题。
坏处:
1)网络请求占用很多。每次请求时,客户端都要通过cookie发送session数据给服务器
2)浏览器对cookie的大小存在限制。每个浏览器限制是不同的。

  • ·Firefox和Safari允许cookie多达4097个字节
  • ·Opera允许cookie多达4096个字节
  • ·IE允许cookie多达4095个字节

3)一般session中存的都是重要性数据(账号、昵称、用户id等),会存在安全问题

3、访问规则
  设计用一种算法(简单理解为规则),什么几只虾session是保存在哪台服务器下,那么读取的时候就按照这种规则去读取,就能定位到原来的服务器。其原理是存session和读session数据保证都在一台服务器操作,就不会需要涉及到共享,具体实现方式是通过约定一种分发机制来实现。也叫作sticky模式(粘性回话模式),同一个用户的访问请求都被派送到同一个服务器上。
坏处:
  如果这台机子挂掉,那么后续的请求按照session的规则还是会分发到这台服务器上去,但是现在不可用了,比如用户编号是1-200涉及到的session数据保存到a服务器上去。所以只要一台出问题,1-200的用户就无法实现登录了。后面就不可用了

4、session中间层
做一个中间层服务器,专门来存储所有访问涉及到的session。也就是所有的session都存储在这里。服务器端统一从这里读取session数据。

1)NFS做中间层
通过nfs的方式,各个php服务器操作session数据的时候,是读取本地磁盘目录,但实际上是一个共享网络文件。各个php服务器实际上操作的都是同一个目录的文件。

2)关系型数据库做中间层
把以前存储在文件中的session数据存储到数据库中去,那么这样做,其实就不用到php内置的session机制了(像session_start()之类的函数都不需要去用了)。
从数据库拿session数据,约定什么情况下数据过期了然后自动清理,这里是指删除数据库中的行。保存在文件中的时候,php有垃圾回收机制回去自动清理过期的session文件。
有些做法跟这种思想是类似的:比如ecshop、phpcms是把session数据都存储在数据库中去。服务端就是从数据库中拿session的数据。
坏处:

  • ·放在数据库里面,访问量小没问题。大流量网站这么做,只会拖慢速度。因为查询数据库,造成数据库压力大。高并发访问的情况下,会出现很大的性能问题。
  • ·在线人数决定了其瓶颈,主要问题是影响性能。在线人数,因为登录的session数据存储在数据库中,只要是登录的用户就会涉及到频繁的操作数据库。

3)非关系型数据库做中间层
将session数据保存在memcached,redis之类内存数据库中,因为内存的数据读取速度是很快的,与磁盘读取的速度不是一个数量级的,所以性能很高,用户并发量很大的时候尤其合适。而且方便统计在线人数,内存数据库系统能够控制内存中的过期数据自动失效(刚好符合session过期需要)

原文地址:https://www.cnblogs.com/lxhyty/p/11321709.html

时间: 2024-07-30 10:21:34

Session共享问题---理论的相关文章

nginx+tomcat+redis负载均衡,实现session共享

实验环境: 系统: centos 7.4 3.10.0-327.el7.x86_64 docker: 18.03.0-ce docker-compose:docker-compose version 1.21.0 redis: 4.0.9 nginx: 1.12.2 tomcat:8.5.30 jdk:1.8.161 基础理论 session 统一方案:1.单机的session会话保持机制如nginx的ip-hash,如果单个机器下线,那么session将会全部丢失2.session共享,如to

spring-session用redis实现session共享实践

什么是spring session? Spring Session provides an API and implementations for managing a user’s session information. 简单一句话,spring session帮你管理用户的session信息. 为什么使用spring session? 通常情况下,Tomcat.Jetty等Servlet容器,会默认将Session保存在内存中.如果是单个服务器实例的应用,将Session保存在服务器内存中

Nginx做负载均衡时session共享问题详解

用nginx做负载均衡时,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 再者Nginx连接Memcached集群时,Nignx的请求从memcached服务器中根据key获得了value则直接返回value,如果没有获得到value则去MySQL中查询再返回. location / { set $memcached_key "$request_uri"; #设置请求memcached服务器的key memca

Redis主从复制实现session共享

一.Redis安装 1. 下载安装扩展源及源码包 yum install -y epel-release jemalloc-devel wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21 tar -zxvf 2.8.21 make:make PREFIX=/usr/local/redis install mkdir -p /usr/local/redis/etc 解决办法: cd deps/ make hiredis lua

Nginx-tomcat-redis------负载均衡以及session共享

测试环境 Nginx 1.10.1 tomcat 7.0.70 Redis-x64-3.2.100 说明 tomcat 8 和 redis 实现session共享 有问题. 寻找源码 发现tomcat8 中的 catalina.jar 已经没有了 org.apache.catalina.util.LifecycleSupport 这个类. 然而这个类在redis的启动中需要加载,所以就一直报错 java.lang.NoClassDefFoundError: org/apache/catalina

spring boot + redis 实现session共享

这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下: @Configuration @EnableRedisHttpSession public class RedisSessionConfig { } 而@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的,所以

Tomcat集群环境下session共享方案梳理(1)-通过memcached(MSM)方法实现

对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式: 一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据: 另一种就是在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据. Tomcat集群session同步方案有以下几种方式: 1)使用tomcat自带的

SqlServer Session共享注意点

公司下派任务,之前的网站是一台服务器,由于用户过多,负载过大,现在老大要求多加一台服务器.加就加贝,应该跟我这DEV没有 关系吧,应该不会碰到Source的吧.但是,之前网站有一些数据是放在Session里面的.大家应该理解Sessino的机制(自己的理解):当用户访问服务器的时候,会在Cookie里面留下一个SessionId,HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value就能取到,然后服务器会根据这个Se

Ubuntu上使用Redis数据库存储SessionID并实现Session共享

p { margin-bottom: 0.1in; direction: ltr; color: #00000a; line-height: 120%; text-align: left; orphans: 2; widows: 2 } p.western { font-family: "Liberation Serif", serif; font-size: 12pt } p.cjk { font-family: "Noto Sans CJK SC Regular"