session多服务器共享的方案

PX4飞控CAN总线通信深度配置:从menuconfig到驱动加载的完整指南 本文详细解析了PX4飞控中CAN总线通信的深度配置流程,从menuconfig选项设置到驱动加载的完整指南。涵盖硬件抽象层、驱动层和应用层的配置细节,提供实际验证方法和故障排查技巧,帮助开发者高效实现CAN通信,特别适用于无人机和机器人底盘运动控制等场景。 阅读详情

session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点。我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢?

 

 php中session的原理,以前做了一下总结,可以参考:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html

 

以前业界使用session的做法:

 

默认情况下,php的session文件是保存在磁盘文件中。在php.ini配置文件中的配置项如下:

 

session.save_handler = files

 

session.save_path = "N;/path"

 

第一个配置项是指定使用files(文件形式)存储session数据。

 

第二个参数指定保存的路径。N表示生成多少级目录(不放到一个目录下,分散到多个磁盘目录中去)

 

我的配置项是:session.save_path = "F:/wamp/tmp"。那么就会去这个目录下面看到很多session数据的文件。

 

当我们使用php的内置函数session_start()的时候,就是去上面指定的磁盘目录把session数据载入,实际上就是拿类似

sess_74dd7807n2mfml49a1i12hkc45的文件。

 

 

74dd7807n2mfml49a1i12hkc45就是大家经常说的什么session的id号。

 

php.ini中还有一个关键配置项,如下:

 

session.name = PHPSESSID

 

 

PHPSESSID就是cookie的名称,其实上面一串"74dd7807n2mfml49a1i12hkc45"会保存在一个名为PHPSESSID的cookie中。

 

根据http的请求机制,当浏览器请求的时候,头部信息会把浏览器中的cookie一起发给服务器。PHPSESSID这个cookie也

是在其中发给了服务器,php引擎通过读取PHPSESSID的值来确定要载入哪个session文件。

比如值为74dd7807n2mfml49a1i12hkc45,载入的就是"sess_74dd7807n2mfml49a1i12hkc45"。

 

注:当你调用php的函数session_start(),才表明你需要使用session文件了。不然平白无故就去载入文件,浪费性能。

 

===========================================

 

根据如上原理。session的数据默认是保存在磁盘文件中。假设这种情况:多台php服务器进行负载均衡的时候,比如有三台php服务器,为了实现负载均衡,那么三台服务器上面的php代码都是一样(拷贝一份)。

 

 

 

上面的图是nginx+fpm部署图。可以看到多台php服务器进行负载均衡。

 

 

生成session数据文件都是在本地了(a,b,c各自的服务器磁盘上)。负载均衡的目的本来就是要为了平均分配请求,所以没有固定第一次访问和第二次访问是同一台服务器,实际上无法确定的。第一秒访问可能是a服务器,第二秒访问的可能是c服务器。

所以同一个登录会员,实际上就会出现:第一秒访问第一台php服务器,第二秒访问的是第二台服务器。登录的信息一般是保存在session中的。这样子登录保存的session数据就需要进行共享了。不然的话会出现,访问第一台服务器生成了一个session数据。第二秒负载请求到第三台服务器,结果获取不到刚才生成的session数据。

 

我的理解是:只有涉及到多台多台后端服务器(php,java等处理服务器)的时候,才涉及到session读取不到的问题。

在php环境中,只有多台php服务器(php服务器而非web服务器,session文件是php引擎生成的)的情况下,才会涉及到

session共享的问题。单台php服务器,存储都在一台主机上。不涉及到共享问题。因为session直接存储在这台服务器磁盘上是能够被本机读取到的。

 

如果是:一台php服务器,多台mysql服务器。这种也是负载均衡,这种负载均衡不涉及到共享问题。因为怎么session数据怎么操作都是保存在一台服务器上。

 

==================================

ps:实际上,session在php,.net,java等只要是后端语言都会用到。session的存储机制,各种语言都大体差不多。我觉得这跟cookie在各个语言中都会用到差不多。.net,java我没去了解过。但是存储原理是差不多的。区别就是,php,java,.net调用的函数,读和取session数据的方式不同。默认都是存储在本地文件中的(不然怎么会涉及到session共享问题呢,存储在数据库本身就可以实现共享的)。

 

 

 

所以,无论是.net还是java都会涉及到session数据共享的问题。

其实我的理解是,session的原理都是一样的。讨论session共享方案设计,是可以抛开具体的语言去讨论session共享方案设计。

 

 

目前业界解决session共享的几种思路,我总结如下:

 

第一种办法:把原来存储在服务器磁盘上的session数据存储到客户端的cookie中去。

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

这样子,在多台php服务器负载均衡的情况下,即便第一秒请求是a服务器,第二秒请求是b服务器,都不需要管哪台服务器了。反正都是读取客户端上的cookie数据。

一般是把session数据按照自己定义的加密规则,加密后后存在cookie中。

数据保存在cookie中这种做法有好处,也有坏处。

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

带来的弊端是:

网络请求占用很多。每次请求时,客户端都要通过cookie发送session数据给服务器。

另外,浏览器对cookie的大小存在限制。每个浏览器限制是不同的。

Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。

  Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。

  Internet Explorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。

 

所以第一种方案不适合高访问量的情况下,因为高访问量的情况下,每次请求浏览器都要发送session数据给服务器。一般一个cookie大小2k的样子。

要占用很多带宽了(服务器购买带宽是一个很大费用),成本增高。归纳为带宽性能,速度问题。

存储到cookie中去,第二方面是安全问题:把session数据放到客户端,一般session中存的都是重要性数据(帐号、昵称、用户id等),会存在安全问题。

了解到,淘宝以前用过这种方式,把session数据存储到cookie中,根据cookie来识别用户。

 

第二种思路:用一种算法(简单理解为规则),什么机制下session是保存在哪台服务器下,那么读取的时候就按照这种规则去读取,就能定位到原来的服务器。叫做分发请求,分发到特定的服务器上去,我理解其原理是存session和读session数据保证都在一台服务器操作,就不会需要涉及到共享,具体实现方式是通过约定一种分发机制来实现。

也叫做sticky模式(粘性会话模式),同一个用户的访问请求都被派送到同一个服务器上。

假设是同一个用户user1,每次访问都路由到同一台服务器上,这样即便是在负载均衡的情况下,也能保证每次访问都能读取到session,不需要做session数据共享了。

关键多台server的原因是为负载均衡而做的,那么就得把原来负载均衡的规则假设是—a,现在改为按照session来均衡分发请求的规则—b。

 

如果这台机子挂掉了,那么后续的请求按照session的规则还是会分发到这台服务器上去,但是现在不可用了。

本来负载均衡有一个目的就是:当其中一台机子不可用的时候,会自动分发到可用的机子上去(自动判断现在要请求的机子是否可用)

 

因为某种规则的session都是保存在一台服务器上,比如用户编号是1-200涉及到的session数据保存到a服务器上去。所以只要一台出问题,1-200的用户就无法实现登录了。后面就不可用了(可能想到1-200用户的session服务器用多台进行复制,这感觉很蹩脚,仍然需要用到复制的话,还不如用其他简便的方法)

 

第三种思路:做一个中间层,专门来存储所有访问涉及到的session。也就是所有的session都存储在这里。

服务器端统一从这里读取session数据。

 

具体实现方式很多种。我的理解是,这里只是一种思想层面上的。我不知道淘宝的tbsession框架的具体实现。但是大致思想差不多,

由这个session框架来维护所有网站的session数据。我根据自己的理解,猜测淘宝的结构画图大致如下:

 

使用这种中间层的思想来实现共享,具体的技术方案,我归纳为以下几种:

 

1、 通过NFS文件共享的方式,多台php服务器共享保存session文件的磁盘。

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

 

具体的操作细节。到时候还需要详细写一下。我根据理解,画了下面的图:

 

 

 

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

 

其实我理解本质是:自己写程序(php,java都可以实现,反正是保存在数据库中)模拟实现session的机制。

 

具体为,把以前存储在文件中的session数据存储到数据库中去,那么这样做,其实就不用到php内置的session机制了(像session_start()之类的函数都不需要去用了)。

写程序要模拟的是,从数据库拿session数据,约定什么情况下数据过期了然后自动清理,这里是指删除数据库中的行。保存在文件中的时候,php有垃圾回收机制会去自动清理过期的session文件。

====================================弊端

 

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

高并发访问的情况下,会出现很大的性能问题。

有些做法跟这种思想是类似的:比如ecshop、phpcms是把session数据都存储在数据库中去。服务端就是从数据库中拿session的数据。

放到数据库存储后,就可以实现:多台web服务器统一操作数据库,因为数据都在数据库,web服务器都能从数据库进行读取,那么session数据就能实现共享。

存储在数据库的做法,在线人数决定了其瓶颈,主要问题是影响性能。在线人数,因为登录的session数据存储在数据库中,只要是登录的用户就会涉及到频繁操作数据库。

我觉得小网站,同时1-2万个人在线情况下。应该没什么问题。

看网上丢出一个问题:对于大访问量的网站,数据库存储session方法可行性有待商榷。

 

我搜寻了一些资料,理解如下:

访问量大的话,一个用户访问了n多个页面,哪怕是刷新页面,都需要去数据库取session数据。数据库的承受压力,确实很恐怖。pv是多少,就要请求多少次数据库服务器。

 

访问每个页面都会去数据库查询是否登录,或者添加数据进数据库的sessions表

 

保存在文件中的时候,则交给了操作系统去控制。一个用户怎么刷新页面,查看其他页面,都只需要读取单个session文件(sess_74dd7807n2mfml49a1i12hkc45)。

我觉得,ecshop,discuz之类的系统之所以把session存储在数据库中去,跟网站的应用级别有关。他们设计的系统本身就是给中小站长用的,这些中小站长一般由于规模小,经济成本考虑,使用的是虚拟主机之类的。不具备对服务器的完全控制权限,比如还要安个memcache之类的,修改php.ini之类的都需要自己拥有独立服务器才能操控的(vps也算,只是虚拟出来的硬件而已)。

其实真正要做到网站大了,系统承受不住了。也会自己有独立的技术人员可以进行二次开发。

 

discuz这些做通用的软件要考虑思路有个特点:得考虑大部分用户的服务器环境。比如经常看到源代码里面要做php版本判断的代码,判断是5.0之前的要如何处理,以求尽量适应大部分环境。而我们公司自己运营的内部系统,环境我们完全可控。做这些确实是多余的工作量。

另外一个点是,这些通用软件不会为了高级用户的特殊需求,做一些改变,结果另外一部分用户就无法使用了。没法两全。所以我的理解是,他们一般不会随便去响应站长的需求,比如你明明是一个很大用户的站点,你用了我的系统,还要说数据量大了承受不住,表容易损坏。你都达到某种级别的应用了,还不自己进行开发。来这里抱怨。找我按照你们方式定制,愿意给钱就好。

 

从这里我看到,不是说这些软件技术含量就多好,是多么成熟的解决方案。他们针对的用户群不同。

由于http是短连接,每次过程是:建立连接(握手)》》数据通信》》通信结束后结束连接。如果频繁的这样子连接后再断开,性能会非常差。

session存储在数据库中,有多少pv,就要多少次这样的数据库连接操作(得去数据库拿session才能知道有没有登录,登录是否过时)。

 

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

主要是利用内存的数据读取速度是很快的,与磁盘读取的速度不是一个数量级的。

使用内存存储:方便统计在线人数,内存的速度比磁盘访问快、内存数据库系统能够控制内存中的过期数据自动失效(刚好符合session过期需要)。

 

存储在redis比较理想的选择,存储在数据库中方便存储统计在线人数,那么存储在redis中也实现了这个要求。

也可以存储在memcache中。但redis支持的数据类型多。所以用它好点。

 

关于使用技术工具复制session数据同步到多台服务器的方案权衡:

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

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

复制session的方式,无论是网络带宽成本还是硬件开销上都很大的。

 

 =================================结束

我写这篇总结文章的目的,只是为了梳理知识,完善自己的知识库。不一定正确。其中有些方式我确实没试过,也没有100%搞清楚细节。所以不一定完全正确。

有不当之处,期待后续完善,欢迎指正。

一文读懂OpenClaw:核心组件与工作原理深度解析 Agent核心:负责理解意图、规划任务、协调执行消息系统:统一的消息格式,实现组件间解耦工具注册表:可扩展的工具系统,支持自定义工具模型适配层:多模型支持,统一API接口安全机制:沙箱隔离、权限确认、操作审计性能优化:并行执行、智能缓存、增量更新理解这些核心组件和工作原理,将帮助你更好地使用OpenClaw,也为后续开发自定义扩展打下坚实基础。在下一篇文章中,我们将详细介绍OpenClaw的界面操作,包括命令行与交互模式的各种技巧。 阅读详情

相关推荐

AI大模型学习(13)小白也能学会的10分钟豆包大模型的python教程1

豆包AI大模型API是字节跳动推出的智能对话接口服务,开发者可以通过简单的HTTP请求调用强大的AI能力,实现智能问答、内容生成等功能。

isoft888的专栏,致力于C#/python分享物联网、大数据,神经网络的等领域,欢迎讨论交流! 1001

session多服务器共享的方案梳理

session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点。我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢?    php中session的原理,以前做了一下总结,可以参考:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html   ...

weixin_34327761的博客 862

机器学习之支持向量机SVM及代码示例

一、线性可分SVMSVM算法最初是用来处理二分类问题的,是一种有监督学习的分类算法。对于线性可分的二分类问题,我们可以找到无穷多个超平面,将两类样本进行区分。(超平面:一维中是一个点;二维中是一条线;三维中是一个面……)在上面的多个超平面中,它们都可以成功将样本集划分两边,但哪一个超平面更好?一般来说,当样本点离超平面越近,样本的标签为某类型的概率应该为0.5左右,确信度比较低,而样本点离超平面越远

cxmscb的博客 5万+

electron 多窗口共享session

环境 electron 1.6.8 问题: 服务端升级了spring,导致electron两个窗口之间session不能共享,两个窗口一个是登陆窗口,一个是主界面窗口;主界面窗口需要用到登陆窗口登录后产生的session。 解决方案:新建窗口时通过webPreferences指定session如下: webPreferences: { session: session.fromPartition('persist:name'), //共享session } 注意事项:如

leiweip的博客 3545

OI 生涯回忆录 《Pilgrimage》

前言 于 NOI2020 后写下本文。 本文简单提及了在写作时尚能回忆起来的,在我的 OI 生涯中对我的影响重大的人、事、比赛等。 写作本文,旨在在回忆允许的范围内,对 OI 生涯进行一定程度上的梳理,总结。 开端 入门 我最早接触计算机程序设计,是在小学。 那时候,我的数学成绩不错,就被老师推荐去学习编程。 就这样,我在局前街小学的何静老师的指导下,走上了编程的道路。 小学时的编程,与其说是 “竞赛” ,不如说是 “兴趣班” 。 当时,包括我在内,很多小孩子天性是浮躁的。支撑我对着无聊的代码学下去的,并不

cz_xuyixuan的博客 1万+

利用HipSTR从二代测序数据中精准解析短串联重复序列(STR)的遗传多态性

本文详细介绍了如何利用HipSTR工具从二代测序(NGS)数据中精准解析短串联重复序列(STR)的遗传多态性。通过三步走策略,HipSTR能够高效识别STR区域、估算重复次数并判定基因型,适用于法医鉴定、疾病研究和细胞系鉴定等多个领域。文章还提供了实战操作指南和常见问题解决方案,帮助研究者充分利用NGS数据开展STR分析。

weixin_28702105的博客 482

面试官:分布式环境下,如何实现session共享

点击上方☝码猿技术专栏轻松关注,设为星标!及时获取有趣有料的技术先了解一下为什么会出现这种session共享的解决方案?随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项...

码猿技术专栏 671

MC1496乘法器AM调制电路搭建全流程(附Multisim 14.0仿真文件)

本文提供了基于MC1496乘法器搭建AM调制电路的完整实战指南。针对仿真模型缺失的痛点,详细讲解了从晶体管级手动构建MC1496等效模型,到外围电路设计、调制度参数计算与调节,并在Multisim 14.0中进行仿真验证的全流程。通过深度剖析MC1496内部原理与AM信号调制机制,帮助读者获得从仿真到实践的可控设计与排错能力。

weixin_29190169的博客 591

Electron使用指南——Main Process API_mainwindow

)* 窗口关系parent: mainWindon, // 定义父窗口modal: true // 锁定在主窗口})* 子窗口显示和隐藏})}, 3000)}, 2000)})让页面可拖拽```no-drag 修复下面控件的bug显示红绿灯。

2401_89693697的博客 617

uniapp - 实现手机端H5网页直播功能效果,拿到后端推流地址或播放资源后进行前端的流畅播放和画面展示功能,uniapp实时推流/拉流直播系统详细教程(提供完整示例代码,一键复制开箱即用!)

uniapp,h5网页,手机端H5网页,uniapp h5直播功能页面,uniapp直播实时推送显示,uniapp h5直播怎么做,怎么使用uniapp去实现移动端手机H5直播,h5 vue+uniapp怎么做直播,uniapp中使用videojs构建H5直播播放器,uniappH5端怎么实现直播推流,uniapp如何实现直播,直播聊天功能,h5平台端直播用什么插件,uniapp手机网页直播用什么组件插件播放器,uniapp手机H5直播播放器详细教程,直播项目,怎么使用vue+uniapp怎么做H5实时直播

✅ 精选推荐文章 8792

Open3D 读取、保存、显示点云【2025最新版】

paint_uniform_color给所有的点上一个统一的颜色。博客长期更新,本文最近更新时间为:2025年1月1日。

点云侠的博客 37万+

SpringBoot 分布式session共享方案(并且可实现session在多个项目中共享)

前言 单机环境下我们session是存储在应用服务的内存中,但是在分布式环境 下,这种存储在应用服务器内存的方案显然不能实现session共享。本次我们将介绍SpringBoot+Redis实现分布式环境下Session共享方案。

码农飞哥 3980

Swin Transformer 类可视化(grad CAM)

完整代码 from pytorch_grad_cam import GradCAM, ScoreCAM, GradCAMPlusPlus, AblationCAM, XGradCAM, EigenCAM from pytorch_grad_cam.utils.image import show_cam_on_image from torchvision.models import resnet50 import glob from demo import parse_option from models i

G果的博客 6637

多服务器共享Session的解决方案

问题为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的时候能够继续使用客户的Session?1、写客户端Cookie的方式把原来存储在服务器磁盘上的session数据存储到客户端的cookie中去。(一般是把session数据按照自己定义的加密规则(如:采用DES、RS

kwinH的博客 6214

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

多服务器session共享解决方案

多服务器session共享解决方案 作者:smarteng ⁄ 时间:2012年05月31日 ⁄ 分类: 服务器相关 ⁄ 评论:0 PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决session共享的问题: 1、不使用session,

sdbzwangdongdong的专栏 938

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[session] -- session多服务器共享的方案梳理

session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点。我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢?    php中session的原理,以前做了一下总结,可以参考:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html

lmjy102的博客 305

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 视图概述
下一篇: mysql存储过程的in,out,inout
qq_26702065
博客等级 码龄12年 10粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值