分布式session
为了解决单点问题,现在很多的大型网站都用的是分布式集群来进行项目搭建的,但是分布式集群会出现很多的分布式问题,这篇文章说的是分布式session问题
分布式session是指的当一个带有session标识的HTTP请求到了web服务器后,需要在http请求的处理过程中找到对应的会话数据,但是有一个问题,会话数据是需要保存在服务器上的,如果每次访问的服务器不同的话,如何获取到session呢,这里给大家说几种解决的思路
第一种:保证相同session的请求都使用同一个服务器处理
这种方式其实就是在负载均衡上做手脚了,在负载均衡时让同样session的请求每次都分发到同一个服务器处理,但是这种方式存在几个问题
- 如果一台服务器宕机或者重启,那么这台机器上的会话数据就会丢失
- 会话标识是应用层的信息,负载均衡要将同一个会话的请求都分发到同一个服务器的话,需要进行应用层(第7层)的解析,这个开销比第4层大
第二种:session复制
在web服务器之间进行会话数据的同步,通过同步保证了不同的web服务器之间的session数据一致,不过这种方式也存在部分问题
- 同步session数据造成了网络带宽的开销,只要session数据有变化,就需要将数据同步到其他所有的机器
- 每台web服务器都要保存所有的session数据,如果整个集群的session数据很多,那么会浪费内存
第三种:session数据集中存储
这种方式就可以解决session复制的重复存储的问题了,而且对于网络带宽,也比session复制要好得多,那这种方案就没有任何问题吗?当然不是
- 读写session数据需要网络操作,相对于本机来说,还是有消耗的,最好是放在内网
- 如果存储session的机器或集群有问题,会影响到应用
第四种:基于cookie
这个是之前看一本书上说的,之前还真没想到过用这种方式来解决分布式session,通过cookie来传递session数据,这样就不存在依赖外部存储系统、以及从外部存储系统获取造成的网络延迟了,但是依然存在一些问题
- cookie长度的限制
- 安全性
- 带宽消耗
- 性能影响