session共享方案

session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。session信息默认是以文件的形式存储在服务端的。当程序需要为某个客户端的请求创建一个 session 的时候,服务器首先检查这个客户端的请求(Http Request)里是否已包含了一个 session 标识-称为 sessionid,如果已包含一个 sessionid 则说明以前已经为此客户端创建过 session,服务器就按照 sessionid 把这个 session 检索出来使用,如果客户端请求不包含 sessionid,则为此客户端创建一个 session 并且生成一个与此 session 相关联的 sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 sessionid 将被在本次响应中返回给客户端保存。而这个 sessionid 就是作为客户端的唯一标识而存在的(即使在同一台电脑上,浏览器 A 和浏览器 B 对于服务器来说都是不同的客户端)。

而会话保持机制的意义就在于,确保将来自相同客户端的请求,转发至后端相同的服务器进行处理。换句话说,就是将客户端与服务器之间建立的多个连接,都发送到相同的服务器进行处理。如果在客户端和服务器之间部署了负载均衡设备,很有可能,这多个连接会被转发至不同的服务器进行处理。如果服务器之间没有会话信息的同步机制,会导致其他服务器无法识别用户身份,造成用户在和应用系统发生交互时出现异常。

因此在应用 session 时可能会遇到的问题:

  1. session 多服务器共享的问题,假如有多台 php 服务器进行负载均衡的时候,用户登录时访问的是第一台服务器,没准下一个页面访问的是第二台服务器,但是 session 数据是存储在第一台服务器上的,因此在访问下一个页面的时候由于没有 session 数据(第二台服务器上)导致用户必须重新登陆。
  2. 从前面的分析我们也知道,php 中 session 默认通过文件的方式实现,但是如果访问量大,可能产生的 SESSION 文件会比较多,从众多的文件中选择其中一个文件不是一件轻松的事情,而且每次都以打开文件、读取文件的方式,也会产生大量的 I/O 操作,严重影响服务器的性能。

session共享的方案:

1. 通过复制或同步的方式使得 a、b、c 服务器上都具有相同的 session 数据。

    这种方式的弊端是,速度慢。复制数据会出现延迟。

    复制数据要消耗很多网络带宽的。在实际中业界用得比较少。机器的数量越多,复制数据的性能损耗越大。不具备高度扩展性。

2. 把原来存储在服务器磁盘上的session数据存储到客户端的cookie中去。

    这样子,就不需要涉及到数据共享了。当客户端请求的时候,原来生成在服务器的数据生成到浏览器的 cookie 中,根据 cookie 中的数据识别用户。php 由原来的”从本地(也就是服务器)磁盘上读取 session 数据”转变为”浏览器的 cookie 中读取数据”。

    好处是服务器的压力减小了,因为session数据不存在服务器磁盘上。根本就不会出现 session 读取不到的问题。

    带来的弊端是:1. 网络请求占用很多。每次请求时,客户端都要通过 cookie 发送 session 数据给服务器。2. 浏览器对 cookie 的大小存在限制。3. cookie的安全问题。

3. 分发请求

用一种算法,什么机制下 session 是保存在哪台服务器下,那么读取的时候就按照这种规则去读取,就能定位到原来的服务器。

    例如 Nginx 的 ip_hash, 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。

    这种方式的弊端是:如果这台机子挂掉了,那么后续的请求按照 session 的规则还是会分发到这台服务器上去,但是现在不可用了,就会导致归属到这台服务器上的所有用户登录失败。

4. 数据库存放session

    保存在数据库中,这种方式的扩展性很强,可以随意增加WEB而不受影响。放在数据库里面安全方面好。

    弊端是:放在数据库里面,访问量小没有问题。大流量网站这么做,只会拖慢速度。因为得查询数据库,造成数据库压力大。

5. 使用文件系统存放session

通过文件系统(比如NFS方式,文件共享)来实现各台服务器间的Session共享,各台服务器只需要mount共享服务器的存储Session的磁盘即可,实现较为简单。但NFS 对高并发读写的性能并不高,在硬盘I/O性能和网络带宽上存在较大瓶颈,尤其是对于Session这样的小文件的频繁读写操作。 适合并发量不大的网站。

6. 利用缓存存储session

    可以将 session 数据保存在 memcached,redis 之类内存数据库中,memcached 是基于内存存储数据的,性能很高,用户并发量很大的时候尤其合适。

    主要是利用内存的数据读取速度是很快的,与磁盘读取的速度不是一个数量级的。使用内存存储,方便统计在线人数,内存的速度比磁盘访问快、内存数据库系统能够控制内存中的过期数据自动失效(刚好符合 session 过期需要)。

缺点: session 数据都保存在 memory 中,一旦宕机,数据将会丢失。但对 session 数据来说并不是严重的问题。如果网站访问量太大,session太多的时候,memcached会将不常用的部分删除,但是如果用户隔离了一段时间之后继续使用,已经全部乱套了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值