session一致性架构设计实践

什么是session一致性问题?

当只有一台web服务器提供服务时,每次http短连接请求,都能够正确路由到存储session对应的web服务上(因为只有一台)。

但如果我们使用多台web服务器来做高可用时,每次http短连接请求就不一定能路由到正确的session了。会导致用户需要重新登录。

session同步法

思路:多个web服务器之间相互同步session,这样每个web服务器之间都包含了全部session。
优点:web服务器支持的功能,应用程序不需要修改代码
不足:session的同步需要数据传输,占内网带宽,有延时;所有web服务器都包含了所有session数据,数据量受内存限制,无法水平扩展;有更多web服务器时要歇菜。

客户端存储法

思路:服务端存储所有用户的session,内存占用大,可以将session存储到浏览器cookie中,每个端只要存储一个用户的数据。
优点:服务端不需要存储
缺点:每次http请求都要带上session,占外网带宽;数据存储在客户端,并且在网络传输,存在泄露、篡改、窃取等安全隐患;session存储的数据大小受cookie限制。

反向代理hash一致性

思路:web服务器为了保证高可用,有多台冗余,反向代理层能不能做一些事情,让同一个用户的请求保证落在一台web服务器上呢?

方案1:四层代理hash
反向代理层使用用户ip来做hash,以保证同一个ip的请求落到同一个web服务器上。

方案2:七层代理hash
反向代理使用http协议中的某些业务属性来做hash,例如sid,city_id,user_id等,能够更加灵活的实施hash策略,以保证同一个浏览器用户的请求落在同一个web服务器上。

优点:只需要修改nginx配置,不需要修改应用代码;负载均衡,只需要hash属性是均匀的,多台web的负载是均衡的;可以支持web服务器水平扩展。

不足:如果web服务器重启,一部分session会丢失,产生业务影响,例如部分用户需要重新登录;如果web服务器水平扩展,rehash后session重新分布,也会有一部分用户路由不到正确的session。

session一般是有 有效期的,所以不足中的2点,可以认为等同于session失效,一般问题不大。

对于四层hash还是七层hash,个人推荐前者:让专业的软件做专业的事情,反向代理就负责转发,尽量不要引入应用业务属性。

后端统一存储(推荐)

思路:将session存储在web服务器后端的存储层,数据库或者缓存(如redis)。
优点:没有安全隐患;可以水平扩展;web服务器重启或者扩容都不易有session丢失
不足:曾经了一次网络请求,并且需要修改应用代码

对于db存储还是cache,个人推荐后者:session读取的频率很高,数据库压力回较大。如果session有高可用需求,cache可以做高可用。

延伸阅读

配置 PHP 的 Session 存储到 Redis

方法一:修改 php.ini 的设置

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

修改完之后,重启一下 php-fpm。

方式二:通过 ini_set() 函数设置

ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://127.0.0.1:6379");

如果配置文件 /etc/redis.conf 里设置了连接密码requirepass,保存 session 的时候会报错,save_path这样写 tcp://127.0.0.1:6379?auth=authpwd即可。

测试代码:

<?php
// 如果未修改php.ini下面两行注释去掉
// ini_set('session.save_handler', 'redis');
// ini_set('session.save_path', 'tcp://127.0.0.1:6379');
 
session_start();
$_SESSION['sessionid'] = 'this is session content!';
echo $_SESSION['sessionid'];
echo '<br/>';
 
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
 
// redis 用 session_id 作为 key 并且是以 string 的形式存储
echo $redis->get('PHPREDIS_SESSION:' . session_id());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值