文档章节

集群环境下的用户会话方案

南湖船老大
 南湖船老大
发布于 2016/10/02 11:52
字数 1422
阅读 79
收藏 1
点赞 0
评论 0

集群环境下,必然需要考虑用户和会话的问题,如果不加处理的话,由于每一个会话cookies是对应服务器后端的一个session(Java是jsessionid,PHP是PHPSESSID),也就是说session是和具体的服务器绑定的,一旦后端IP轮询切换,会话cookies找不到对应的session,会话也就断了。在这种场景下,就存在5种处理方案。下文主要讨论的是Java和PHP的处理,对于其他语言一样适用。

    1、依然使用集群,但集群的轮训策略使用hash ip,将每一个客户和后端服务器绑定,这样一来,用户的会话始终落在一台固定的服务器上,这也是成本最小的方案。如果是很老的架构的话,这种方案是改造成本最小的。

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server.backend3.example.com;
}

但这样存在一个问题,就是一旦某台服务器挂了,切换到另外一台服务器后,对应的会话也就丢了。还存在一个情况就是如果前端是CDN的话,客户端IP可能变化的频率是很高的,有可能是一个小时或更短就变一次,在校园网这种网络环境下也容易产生这种情况。

2、使用session复制方案。这是早期tomcat采用的方案。

    session复制模式就可以很好的解决failureover的问题,即某一台web服务器挂掉后,用户的请求还会被负载到其他的web服务器上,而且由于session也被复制了,这样对用户而言就像是在同一台机器上操作一样。不好的地方就是session复制需要系统资源和网络的开销,也就是所谓的“网络风暴”,尤其是当web服务器多的时候或session里存储的数据量大的时候,这点将会比较的明显。
  session复制本身的操作还是比较复杂的,但是对于服务器来说,配置也算简单,但性能是个很大的问题。当处于一个大于两台服务器的集群中时,复制就比较吃力了。这种方案现在一般不使用了。

3、Nginx的sticky方案。

    其实sticky方案和方案一类似,但是sticky能做到把会话死死的粘滞在其中一台服务器上,算是方案一的补充,可以避免CDN网络下的客户端IP突变。很明显,方案1和方案3都存在failover的问题。

4、方案4,NoSQL的集中存储方案

    基于Redis等NoSQL的session集中存储。这种是目前最流行的方案,早期的方案是用MySQL来存储。但仍然存在以下问题:

(1)redis有单点,并且redis的引入增加了系统复杂度,要解决这个单点就得使用redis集群方案,比如codis。

(2)用户量大的情况下,用来连接redis的类库可能存在瓶颈,比如有部分用户反应jedis性能不稳定,高并发下容易挂。

但是就配置而言,不论是PHP还是Java都相对很简单,例如对于PHP而言,只需要安装predis扩展,在php.ini里配置下session存储方案即可

vi /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://192.168.1.102:6379?timeout=15"

注意注释掉/etc/php-fpm.d/www.conf里session的配置,以免配置被覆盖而无效。

对于Java而言,只需要引入一个jar包(https://github.com/jcoleman/tomcat-redis-session-manager),配置server.xml即可。

    不过,对于tomcat而言,tomcat在启动时就会创建一个session,当会话越多的时候,session也就越多。而session在tomcat中属于重量级对象。一个没有任何内容的空session就需要消耗1.5K的内存存储空间。当然,使用redis都是默认内存足够大。

5、放弃session,使用纯cookies

    纯cookies,不使用session,天然分布式。存在的问题:

(1)cookies需要加解密,性能消耗要考虑,而且不能存太多东西,如果cookies存放了一些复杂的数据时,序列化本身消耗也不少。

(2)对于浏览器而言,每次请求都会带上cookies,包括JS和CSS等请求,浪费宽带,除非部署了CDN或专用服务器。这时就需要为静态文件配置一个独立的域名了。其实这个问题,前面几个方案同样存在。

  另外也可以转用token与openid等方式验证用户。

    我个人所使用的方案是方案5+方案4的结合,即仅使用cookies来存储会话标记,不使用应用服务器本身自带的session方案,对于会话信息,不使用session存储,而是直接存放到Redis中。本质上就是方案4的基础上,自己实现一套session机制。这种实现要看具体的语言而定。对于PHP而言,这种做法是多此一举。而对于Java而言,由于tomcat的session实现比较重量级,这种做法能提高一些性能。针对这种方案,我实现了一个自定义的session管理器,用来替代tomcat的默认session管理器,达到节省内存,提高性能的目的。地址在此:

https://github.com/iminto/tomcat-no-session

    需要注意的是:对于方案5,存在一个问题就是如果应用需要考虑“禁止同时登录”的时候,用cookies的解决方案就麻烦很多了。

      如果有更好的方案,也希望你能提供给我。

© 著作权归作者所有

共有 人打赏支持
南湖船老大
粉丝 676
博文 11
码字总数 10246
作品 0
深圳
其他
session会话-nginx-mysql-tomcat

一、如何保持session会话 目前,为了使web能适应大规模的访问,需要实现应用的集群部署。集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这...

柴鑫旺 ⋅ 2017/09/11 ⋅ 0

集群环境下session方案好还是no session方案好

集群环境下,必然需要考虑用户和会话的问题,如果不加处理的话,一旦后端IP轮询切换,session也就断了。所以就有了4种方案。先说下session的问题,tomcat在启动时就会创建一个session,当会话...

南湖船老大 ⋅ 2016/03/04 ⋅ 18

Nginx反向代理,负载均衡+Tomcat实现Session共享

Nginx反向代理,负载均衡+Tomcat实现Session共享 防伪码:学而不思则罔,思而不学则殆。 作者:何小帅 博客URL:http://hexiaoshuai.blog.51cto.com 一、如何保持session会话 目前,为了使w...

何小帅 ⋅ 2017/01/14 ⋅ 0

分布式session共享常用的几种方式

tomcat session共享常用的几种方式 1、请求精确定位 粘性会话:session sticky 例如基于访问ip的hash策略,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登...

啃不动地大坚果 ⋅ 06/14 ⋅ 0

用Spring Web Flow和Terracotta搭建Web应用

Spring Web Flow 是Spring Framework 中的web应用组件,它提供了一种编写有状态和基于会话的web应用的简便手段。Spring Web Flow 使得逻辑流程成为Web应用中的一等公民,它能让你定义为自包含...

红薯 ⋅ 2009/04/24 ⋅ 1

LVS负载均衡之session解决方案

LVS负载均衡之session解决方案 1. 持久连接是什么? 1.1 在LVS中,持久连接是为了用来保证当来自同一个用户的请求时能够定位到同一台服务器。 2. 为什么会用到持久连接? 2.1 cookie/session...

余二五 ⋅ 2017/11/14 ⋅ 0

负载均衡集群中的session解决方案

前言 在我们给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP、Python、Ruby还是Java,只要使用服务器保存Session,在做负载均衡时都需要考虑Session的问...

a928154159 ⋅ 2017/09/13 ⋅ 0

基于apache对tomcat做负载均衡与DeltaManager(会话保持)的使用

一、实验环境 此实验是基于上篇博客来进行的http://584014981.blog.51cto.com/8605371/1414644 ,这里只需要安装配置下tomcatB,(tomcat安装步骤不在演示),然后修改下tomcatB的站点目录文件...

鱼在天上游 ⋅ 2014/05/21 ⋅ 0

Httpd+Tomcat+memcached实现session server

何为会话保持 会话保持是负载均衡最常见的问题之一,也是一个相对比较复杂的问题。会话保持有时候又叫做粘滞会话(Sticky Sessions)。会话保持是指在负载均衡器上的一种机制,可以识别客户端与...

择一城 ⋅ 2017/11/09 ⋅ 0

redis介绍及保持session会话

█Redis介绍 ●redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(...

Cherry_liang ⋅ 2017/07/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Netweaver和SAP云平台的quota管理

Netweaver 以需要为一个用户上下文(User Context)能够在SAP extended memory区域中分配内存尺寸创建quota为例。 对于Dialog工作进程,使用事务码修改参数 ztta/roll_extension_dia. 对于非D...

JerryWang_SAP ⋅ 15分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 24分钟前 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 48分钟前 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 54分钟前 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

Yii2中findAll()的正确使用姿势/返回为空的处理办法

从一次错误的操作开始 $buildingObject = Building::findAll("status=1"); 1 这个调用看着没有任何毛病,但是在使用时返回的结果却是一个空数组。再回过头来看看数据表中: 按照套路来讲,查...

dragon_tech ⋅ 今天 ⋅ 0

如何优雅的编程——C语言界面的一点小建议

我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则。我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化。可是,如果不是直到现在把它们写在纸上,长久以...

柳猫 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部