web集群中经常使用的session同步解决方式及对照
随着站点的功能越来越多,用户量越来越庞大,单节点模式已经严重不能支撑整个系统的正常运作,轻则用户页面訪问时间越来越慢。重则就会导致整个系统瘫痪。这时候
就须要优化或调整眼下的架构,大部分人就会採用各种负载均衡软件比如nginx、hproxy、LVS等,也有的採用分布式的方式把系统依据功能拆分成非常多系统,也有的依据地域
和网络不同来实现訪问不同节点部署的系统。也有的大型高流量、高负载的系统把负载均衡、分布式及依据地域、网络等这些方式都整合在一起来实现系统的正常执行。
採用负载均衡软件是眼下大家採取的比較多的方式。可是在採用负载均衡软件时将会面临session同步的问题。
下面是解决这个问题的几种方式。
1. clientcookie加密的方式
把session数据存放在cookie中,当请求过来时。从cookie中获取session数据。这样的方式不须要不论什么的存储系统。也不会出现读写session数据带来的网络操作延时和不稳定性。
可是有下面缺点:
* Cookie有长度限制,这会影响session数据的长度。
* 安全性。
session数据本来存储在服务端的,而这个方法是让session数据转到外部网络或client中。所以会有安全性问题。只是能够对写入Cookie的session 数据做加密。
* 带宽消耗。因为加了session数据。带宽当然也会添加一点。
* 性能消耗。每次Http请求和响应都带有Session数据。对于Webserver来说,在相同的处理情况下,响应的结果输出越少,支持的并发请求越。
2. web server的session复制方式
大部分应用server都提供了session复制的功能来实现集群。tomcat、jboss、was都提供了这种功能。session复制就是每台应用服务。都保存会话session数据。
长处:
靠应用容器来完毕session共享,并不依赖应用。假设应用服务数量并非非常多,能够考虑。
缺点:
* 同步session数据带来都网络开销。
仅仅要session数据变化,就须要同步到全部机器上,机器越多,网络开销越大。
* 因为每台server都保存session数据,假设集群的session数据非常多。比方90万人在訪问站点。每台机器用于保存session数据的内容占用非常严重。
3. 使用关系数据库保存session
用mysql、sqlserver等数据库保存session,就算服务器宕机了也没事,session照样在。
缺点:
*程序须要定制。
*每次请求都进行数据库读写开销不小(使用内存数据库能够提高性能,宕机就会丢失数据。
可供选择的内存数据库有BerkeleyDB,Mysql的内存表);
4.使用nosql数据库保存session
採用redis、mongodb、memcached等非关系数据库来实现session的共享。这些非关系数据库响应数据非常的快,并且支持的訪问量也比較大。系统资源消耗也比較少。这也是非常多系统所採用的方式。
可是也有缺点:
* 读写session引入了网络操作。相对于本机读写session,带来了延时和不稳定性。
* 如Session集中服务有问题,会影响应用。
5.採用Session Stick
在单机情况。session保存在单机上,请求也是到这台单机上,不会有问题。变成多台后,假设能保障每次请求都到同一台服务。那就和单机一样了。 这须要在负载均衡设备上改动。这就是Session Stick。这样的方式也会有问题:
* 假设某一台server宕机或重新启动。那么这台server上的session数据就丢失了。假设session数据中还有登录状态信息。那么用户须要重现登录。
* 负载均衡要处理详细的session到server的映射。
6.使用terracotta来保存session
跟memcached类似,可是数据不须要序列化。并且是Find-Grained Changes。性能更好。
配置对原来的应用全然透明,原有程序差点儿不用做不论什么改动。并且terracotta本身支持HA。
综上所述。我个人推荐使用第4、6种方式来解决session共享的问题。
web集群中经常使用的session同步解决方式及对照的更多相关文章
- 关于WEB集群中文件服务器的讨论
原文地址: http://blog.itpub.net/29806344/viewspace-1364778/ 在WEB集群中一般都要上传和删除图片.小规模的时候,图片放在本地,再通过同步方式来保持一 ...
- spring 整合redis集群中使用@autowire无效问题的解决办法
1.视频参考黑马32期宜立方商城第6课 redis对于的代码 我们先变向一个redis客户端的接口文件 package com.test; public interface JedisClient { ...
- 使用port-forward访问集群中的应用程序,以Redis 为例
为Redis创建Deployment和Service 创建 Redis Deployment,YAML文件如下: apiVersion: apps/v1 kind: Deployment metada ...
- nginx负载均衡集群中的session共享说明
在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...
- 【转】web集群时session同步的3种方法
转载请注明作者:海底苍鹰地址:http://blog.51yip.com/server/922.html 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问 ...
- 关于 tomcat 集群中 session 共享的三种方法
前两种均需要使用 memcached 或redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单 ...
- 负载均衡集群中的session解决方案
前言 在我们给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP.Python.Ruby还是Java,只要使用服务器保存Session,在做负载均衡时都需要考 ...
- 集群中几种session同步解决方案的比较
1. 客户端cookie加密 .比较好的方法是自己采用cookie机制来实现一个session,在应用中使用此session实现. 问题:session中数据不能太多,最好只有个用户id. Sessi ...
- Apache shiro集群实现 (八) web集群时session同步的3种方法
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
随机推荐
- 【 【henuacm2016级暑期训练】动态规划专题 K】 Really Big Numbers
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现如果x是reallynumber那么x+1也会是reallynumber.... (个位数+1,各位数的和+1了但是整个数也+ ...
- 【hihocoder 1519】 逃离迷宫II
[题目链接]:http://hihocoder.com/problemset/problem/1519?sid=1098756 [题意] Chinese [题解] bfs题; 根据bfs的性质; 第一 ...
- Springboot2本地锁实践
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交…. 下面我们利用 ...
- Java7的那些新特性
本文介绍的java 7新特性很多其它的感觉像是语法糖.毕竟java本身已经比較完好了.不完好的非常多比較难实现或者是依赖于某些底层(比如操作系统)的功能. 不过java7也实现了类似aio的强大功能. ...
- MySQL5.7 的 错误堆栈缓冲
什么是错误缓冲堆栈呢? 举个非常简单的样例,比方运行以下一条语句:mysql> INSERT INTO t_datetime VALUES(2,'4','5');ERROR 1292 (2200 ...
- SQL学习之使用order by 依照指定顺序排序或自己定义顺序排序
我们通常须要依据客户需求对于查询出来的结果给客户提供自己定义的排序方式,那么我们通常sql须要实现方式都有哪些,參考很多其它资料总结例如以下(不完好的和错误望大家指出): 一.假设我们仅仅是对于在某个 ...
- PHP编译时错误解决:Don't know how to define struct flock on this system, set --enable-opcache=no
在编辑PHP5.6.1时出现了这个错误: Don't know how to define struct flock on this system, set --enable-opcache=no 解 ...
- Woody的Python学习笔记2
Python多行语句 Python语句中一般以新行作为语句的结束符.但我们能够使用斜杠(\)将一行的语句分为多行显示,例如以下所看到的: total = item_one+\ item_two + \ ...
- HDU 2841 Visible Trees(容斥定理)
Visible Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- Hive编程指南_学习笔记01
第四章: HQl的数据定义 1:创建数据库 create database financials; create database if not exists financials; 2: ...