热门标签 | 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";

推荐阅读
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 深入理解一致性哈希算法及其应用
    本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
  • 本文探讨了2012年4月期间,淘宝在技术架构上的关键数据和发展历程。涵盖了从早期PHP到Java的转型,以及在分布式计算、存储和网络流量管理方面的创新。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
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社区 版权所有