负载均衡中关于session共享的问题

--------------------------------------------------------

做负载均衡时访问页面会把访问分发到不同的服务器,session是存在服务器端,如果首次访问被分发到A服务器,那么session就会被存到A服务器,再次访问时负载均衡会分发到B服务器那么第一次访问的session信息就会获取不到之前的session信息。解决方法有以下几种:

--------------------------------------------------------

(一)用nginx做负载均衡时可以配置ip_hash来解决,ip_hash技术能够将某个ip的请求定向到同一台后端应用服务器。

这样同一个ip请求时会分发到同一台后端的服务器。

缺点 :假如被分的服务器down掉的话,映射到这台的服务器的用户就郁闷了。

(二)利用数据库同步session

这个方法不可取,主要是把session放到数据库里,这样会加大数据库的负担。暂时不再赘述。。。

(三)利用cookie同步session数据原理如下

代码如下:

A服务器

<?php
    session_start();
 if(isset($_SESSION[‘username‘])){
         echo ‘ok you can go next‘;
     }else if(isset($_COOKIE[‘username‘])){
         echo ‘session is not in this server but cookie is exist‘;
         $_SESSION[‘username‘]=$_COOKIE[‘username‘];
     }else{
        echo ‘cookie and session does\‘t in this server‘;
        $_SESSION[‘username‘]=‘lampol‘;
        setCookie(‘username‘,‘lampol‘,time()+30*24*60*60);
     }
echo ‘</br>‘;
echo ‘this is A server‘;
echo ‘</br>‘;
var_dump($_SESSION);

B服务器

<?php
    session_start();
 if(isset($_SESSION[‘username‘])){
         echo ‘ok you can go next‘;
     }else if(isset($_COOKIE[‘username‘])){
         echo ‘session is not in this server but cookie is exist‘;
         $_SESSION[‘username‘]=$_COOKIE[‘username‘];
     }else{
        echo ‘cookie and session does\‘t in this server‘;
        $_SESSION[‘username‘]=‘lampol‘;
        setCookie(‘username‘,‘lampol‘,time()+30*24*60*60);
     }
echo ‘</br>‘;
echo ‘this is B server‘;
echo ‘</br>‘;
var_dump($_SESSION);

然后开始访问

第一次访问发到B服务器 没有session和cookie数据  然后会存到session和本地cookie

刷新第二次访问分发到A服务器  session不存在但是cookie再本地存在 此时会把本地的cookie同步到B服务器的cookie中

缺点  如果禁用cookie那就完蛋了。。

(四)memcache或者redis存session(以memcache为例)

安装memcache及客户端和服务端,然后

<?php

ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "192.168.1.142:11211");

//以上配置可以再php.ini中配置
session_start();
$_SESSION[‘username‘]=‘lampol‘;

这样就把session信息存到了memache中 (redis同理)

然后在运行

<?php
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "192.168.1.142:11211");
session_start();
$mem = new Memcache;

$mem->connect(‘192.168.1.142‘,11211);

$id=session_id();

echo $mem->get($id);

获取到了session存在memcache中的数据

另外其实如果考虑到session共享的问题,完全没有必要存到session直接把数据存到memcache中即可

分布式中直接存到同一个memcache服务器中就可以了,另外memcache可以做主从,以后的文章中再继续探讨此问题。

时间: 2024-11-01 23:57:53

负载均衡中关于session共享的问题的相关文章

Nginx反向代理,负载均衡,redis session共享,keepalived高可用

相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群. redis服务器一台,用于session的分离共享. nginx主服务器:192.168.50.133 nginx备服务器:192.168.50.135 tomcat项目服务器1:192.168.50.137 tomcat项目服务器2:192.168.50.139 redis服

如何运用PHP+REDIS解决负载均衡后的session共享问题

一.为什么要使用Session共享? 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的各个模块中都是可以登录使用的.各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可.但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个

nginx tomcat负载均衡 使用redis session共享

环境准备 1.准备一台nginx服务器 ip192.168.1.133 端口81 安装过程: #首先安装依赖: yum -y install gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-devel yum -y install openssl openssl-devel #注意 : 安装nginx必须使用 root 用户安装 #创建一个nginx目录 mkdir /usr/local/src/nginx #进入到

使用nginx做负载均衡造成的session共享问题

PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决session共享的问题: 1.不使用session,换用cookie session是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站.你访问web服务器A,产生了session然后把它放到cookie里面,当你的

Nginx+Tomcat7+Memcached负载均衡集群+session共享

Nginx+Tomcat7+Memcached负载均衡集群服务搭建 操作系统:CentOS6.5     本文档主要讲解,如何在CentOS6.5下搭建Nginx+Tomcat7+Memcached负载均衡集群服务器,Nginx负责负载均衡,Tomcat7负责实际服务,Memcached负责同步Tomcat7的Session,达到Session共享的目的.1.安装NginxNginx官网:http://nginx.org/下载最新稳定版本.在安装Nginx之前,需要先安装gcc. openssl

负载均衡下 tomcat session 共享

概述 在分布式部署的情况下,每台tomcat 都会有自己的session ,这样如果 用户A 在tomcat1 下登录,在tomcat2 下并没有session信息.如果 tomcat1宕机,tomcat2 将会变成非登录状态.可以将tomcat的session信息放到 redis上,通过redis统一管理,因为 tomcat1.tomcat2 都在 同一个域名下面,那么即使tomcat1宕机,tomcat 2 还是可以保持登录状态. 部署步骤 1.使用 nginx 配置好负载均衡. 部署两个t

Lvs + Ngnix + Haproxy + Keepalived + Tomcat 实现三种HA软负载均衡和Tomcat Session共享

环境准备: 一.11台测试机器 hostname:v1 ~ v10   (10台测试机) ip:192.168.33.81(v1) ~ 192.168.33.90(v101) 由于在内网测试,需要搭建个内网yum源,方便安装软件.yum所在机器为192.168.33.101 二.待实现功能 下面分别使用haproxy/nginx/lvs实现HA + 负载均衡,软件环境如下: v1:33.81 nginx v2:33.82 nginx v3:33.83 tomcat v4:33.84 tomcat

部署tomcat负载均衡集群,实现节点之间内存中的Session共享。

在实验之前先来了解下tomcat会话管理器(Manager) Manger对象用于实现HTTP会话管理的功能,介绍下几种常见的: 1.StandardManager(标准会话管理器) 用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理.当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件.如果tomcat正常关闭会话不会丢失,如果是tomcat主机崩溃或者进程崩溃那会话是一定会丢失的. 2.Persist

nginx负载均衡集群中的session共享说明

在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡中session同步的方式 1)不使用session,换用cookiesession是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站.你访问web服务器A,产生了session然后把它放到cookie里面,当