热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WEB集群中常见的SESSION同步机制

WEB集群是我们在项目中常见的情况,但是通过负载均衡后,会造成session的不同步问题,最直观的现象就是用户登录以后,会出现已登录与未登录的状态的不断切换。这是因为同一个IP访问同一个页面会被随机分配到不同的服务器上。下面天涯PHP博客[http://blog.phpha.com/]根据网上的资料整理下一些最常规的解

WEB集群是我们在项目中常见的情况,但是通过负载均衡后,会造成session的不同步问题,最直观的现象就是用户登录以后,会出现已登录与未登录的状态的不断切换。这是因为同一个IP访问同一个页面会被随机分配到不同的服务器上。下面天涯PHP博客[http://blog.phpha.com/]根据网上的资料整理下一些最常规的解决方案。

一、利用数据库同步session
在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法:
1)用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。
2)这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。
说明:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担

二、利用COOKIE同步session
session是文件的形势存放在服务器端的,COOKIE是文件的形势存在客户端的,怎么实现同步呢?方法很简单,就是把用户访问页面产生的session放到COOKIE里面,就是以COOKIE为中转站。你访问web服务器A,产生了session把它放到COOKIE里面了,你访问被分配到web服务器B,这个时候,web服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的COOKIE里面有没有这个session,如果也没有,说明session真的不存,如果COOKIE里面有,就把COOKIE里面的sessoin同步到web服务器B,这样就可以实现session的同步了。
说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把COOKIE禁掉了的话,那么session就无从同步了,这样会给网站带来损失;COOKIE的安全性不高,虽然它已经加了密,但是还是可以伪造的。

三、利用memcache同步session
memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin都可以放到这个”内存池”中,其他的都可以使用。
优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用COOKIE大大的提高,把session放到内存里面,比从文件中读取要快很多。
缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

四、总结
上面三种方法都是可行的,
第一种方法,最影响系统速度的那种,不推荐使用;
第二种方法,效果不错,不过安全隐患一样的存在;
第三种方法,个人觉得第三种方法是最好的,推荐大家使用

五、web集群时利用memcache来同步session
1)模拟web集群
我启动了二个memcached进程,分别模拟二台服务器

  1. /usr/local/bin/memcached -d -m 1024 -c 3000 -u uenucom -p 12000 -P ./memcached.pid
  2. /usr/local/bin/memcached -d -m 1024 -c 3000 -u uenucom -p 13000 -P ./mem.pid

2)修改php的配置

			
  1. vi /usr/local/php/lib/php.ini
  2. session.save_handler = "memcache"
  3. memcache.hash_strategy = "consistent"
  4. session.save_path = "tcp://127.0.0.1:13000?weight=10,tcp://127.0.0.1:12000"

说明:第一行,session的储存方式是memcache;第二行,memcache的hash算法是consistent;第三行,session储存的地位;
3)重起apache
查看phpinfo

								
  1. session
  2. Session Supportenabled
  3. Registered save handlersfiles user sqlite memcache
  4. Registered serializer handlersphp php_binary

紧接着下面是

													
  1. session.save_pathtcp://127.0.0.1:13000,tcp://127.0.0.1:12000

4)做个简单测试
a)准备文件session.php

													
  1. php
  2. session_start();
  3. $_SESSION['username'] = "abcabc";
  4. echo session_id();
  5. ?>

b)显示session内容文件

																			
  1. php
  2. $mem = new Memcache;
  3. $mem->addServer("127.0.0.1″,12000) or die ("Could not add server 12000″);
  4. $mem->addServer("127.0.0.1″,13000) or die ("Could not add server 13000″);
  5. $val = $mem->get('qp0mrob2ovcqle3u4lbr4obsa5');
  6. echo $val;
  7. ?>

c)结果是

																											
  1. username|s:6:"abcabc";

推荐阅读
  • 大厂首发!思源笔记docker
    JVMRedisJVM面试内存模型以及分区,需要详细到每个区放什么?GC的两种判定方法GC的三种收集方法:标记清除、标记整理、复制算法的 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
  • 什么是网关服务器初学linux服务器开发时,我们的服务器是很简单的,只需要一个程序完成与客户端的连接,接收客户端数据,数据处理,向客户端发送数据。但是在处理量很大的情况下,一 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了python面试题——数据库和缓存(46题)相关的知识,希望对你有一定的参考价值。1、列举常见的关系型数据库和非关系型都有那些? ... [详细]
  • Nginx 中怎么实现动静分离与负载均衡
    本篇文章为大家展示了Nginx中怎么实现动静分离与负载均衡,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有 ... [详细]
  • 数据库基本介绍
    1、数据库基本知识概念:数据库:database(DB),是一种存储数据的仓库数据库是根据数据结构组织、存储和 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
author-avatar
桦7231227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有