多语言展示
当前在线:1041今日阅读:75今日分享:44

分布式系统session一致性的问题

单服务器web应用中,session信息只需存在该服务器中,分布式系统的流行,单系统已经不能满足日益增长的百万级用户的需求,集群方式部署服运用起来,当高并发量的请求到达服务端的时候通过负载均衡的方式分发到集群中的某个服务器,这样就有可能导致同一个用户的多次请求被分发到集群的不同服务器上,就会出现取不到session数据的情况,于是session的共享就成了一个问题。
工具/原料

电脑

Session一致性解决方案
1

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

2

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

3

反向代理hash一致性。思路:反向代理层使用用户ip来做hash,以保证同一个ip的请求落在同一个web-server上优点:1)只需要改nginx配置,不需要修改应用代码;2)负载均衡,只要hash属性是均匀的,多台web-server的负载是均衡的;3)可以支持web-server水平扩展(session同步法是不行的,受内存限制);不足:1)如果web-server重启,一部分session会丢失,产生业务影响,例如部分用户重新登录;2)如果web-server水平扩展,rehash后session重新分布,也会有一部分用户路由不到正确的session;3)让专业的软件做专业的事情,反向代理就负责转发,尽量不要引入应用层业务属性,除非不得不这么做(例如,有时候多机房多活需要按照业务属性路由到不同机房的web-server);

4

后端统一集中存储。思路:将session存储在web-server后端的存储层,数据库或者缓存优点:1)没有安全隐患;2)可以水平扩展,数据库/缓存水平切分即可;3)web-server重启或者扩容都不会有session丢失;不足:1)增加了一次网络调用,并且需要修改应用代码;对于db存储还是cache,个人推荐后者:session读取的频率会很高,数据库压力会比较大。如果有session高可用需求,cache可以做高可用,但大部分情况下session可以丢失。

总结

保证session一致性的架构设计常见方法:1)session同步法:多台web-server相互同步数据;2)客户端存储法:一个用户只存储自己的数据;3)反向代理hash一致性:四层hash和七层hash都可以做,保证一个用户的请求落在一台web-server上;4)后端统一存储:web-server重启和扩容,session也不会丢失;

注意事项
1

个人推荐方案4;

2

web层、service层无状态是大规模分布式系统设计原则之一,session属于状态,不宜放在web层;

3

让专业的软件做专业的事情,web-server存session?还是让cache去做这样的事情吧。

推荐信息