redis中分布式session不一致性怎么办
时间:2021-11-16 来源:互联网
今天PHP爱好者给大家带来分布式session不一致性怎么办?下面本篇文章给大家介绍一下redis中分布式session不一致性的解决方案,希望对大家有所帮助!
分布式session不一致性解决方案
一、Session有什么作用?
Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。
客户端在第一次访问服务端的时候,服务端会响应一个sessionId并且将它存入到本地cookie中,在之后的访问会将cookie中的sessionId放入到请求头中去访问服务器,
如果通过这个sessionId没有找到对应的数据,那么服务器会创建一个新的sessionId并且响应给客户端。
二、分布式Session有什么问题?
单服务器web应用中,session信息只需存在该服务器中,这是我们前几年最常接触的方式
但是近几年随着分布式系统的流行,单系统已经不能满足日益增长的百万级用户的需求,集群方式部署服务器已在很多公司运用起来
当高并发量的请求到达服务端的时候通过负载均衡的方式分发到集群中的某个服务器,这样就有可能导致同一个用户的多次请求被分发到集群的不同服务器上,就会出现取不到session数据的情况,于是session的共享就成了一个问题。
三、服务做集群一般是怎么样做的?
SpringBoot项目,那么只要改下端口号启动几个,然后用nginx统一做反向代理。
SpringCloud微服务项目,那么这个时候,可以使用ribbon本地负载均衡。
四、nginx负载均衡和ribbon负载均衡的区别
nginx做负载均衡是服务器端的负载均衡,统一访问一个地址,根据负载均衡算法访问决定访问那一个服务器。
ribbon负载均衡,这是本地负载均衡(客户端负载均衡),把提供服务的客户端地址都缓存记录下来,根据本地的算法实现负载均衡。
五、Session一致性解决方案
1. session复制(同步)
思路:多个服务端之间相互同步session,这样每个服务端之间都包含全部的session
优点:服务端支持的功能,应用程序不需要修改代码
缺点:
session的同步需要数据传输,占内网带宽,有时延
所有服务端都包含所有session数据,数据量受内存限制,无法水平扩展
2. 客户端存储法
思路:服务端存储所有用户的session,内存占用较大,可以将session存储到浏览器cookie中,每个端只要存储一个用户的数据了
优点:服务端不需要存储
缺点:
每次http请求都携带session,占外网带宽
数据存储在端上,并在网络传输,存在泄漏、篡改、窃取等安全隐患
session存储的数据大小和域名cookie个数都受限制的
注:该方案虽然不常用,但确实是一种思路。
3. 反向代理hash一致性
思路:服务端为了保证高可用,有多台冗余,反向代理层能不能做一些事情,让同一个用户的请求保证落在一台服务端上呢?
方案一:四层代理hash
反向代理层使用用户的ip来做hash,以保证同一个ip的请求落在同一个服务端上
方案二:七层代理hash
反向代理使用http协议中的某些业务属性来做hash,例如sid,city_id,user_id等,能够更加灵活的实施hash策略,以保证同一个浏览器用户的请求落在同一个服务器上
优点:
只需要改nginx配置,不需要修改应用代码
负载均衡,只要hash属性是均匀的,多台服务端的负载是均衡的
可以支持服务端水平扩展(session同步法是不行的,受内存限制)
缺点:
如果服务端重启,一部分session会丢失,产生业务影响,例如部分用户重新登录
如果服务端水平扩展,rehash后session重新分布,也会有一部分用户路由不到正确的session
session一般是有有效期的,所有不足中的两点,可以认为等同于部分session失效,一般问题不大。
对于四层hash还是七层hash,个人以上就是redis中分布式session不一致性怎么办的详细内容,更多请关注php爱好者其它相关文章!
-
永劫无间多少钱一个红 2024-12-20
-
永劫无间多少钱开一个箱子 2024-12-20
-
阿瑞斯病毒2火铳弹药怎么获得?阿瑞斯病毒2火铳弹药获得方法 2024-12-19
-
阿瑞斯病毒2哈士奇在哪?阿瑞斯病毒2哈士奇获得方法 2024-12-19
-
寻道大千反击流阵容推荐 2024-12-19
-
和平精英性别怎么换?和平精英性别转换方法 2024-12-19