php专区

 首页 > php专区 > PHP进阶 > 负载均衡 > 网络负载平衡系统使用memcache同步session的方法

网络负载平衡系统使用memcache同步session的方法

分享到:
【字体:

 前面讲了如何配置Windows Server 2003网络负载平衡系统,那么在web架构中配置好Server群集后,我们肯定会考虑session共享和同步的问题。试想下,同一个IP访问负载平衡系统中的同一个网页会被分配到不同的服务器上,而如果session不同步,那么对于同一个登录用户,就会出现一会是登录状态一会又不是登录状态的问题。

       下面就这个问题给出了三种解决思路,供大家参考:

  一、利用数据库同步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

  觉得用memcache来同步session是最好的,下面是我的设置过程

  1、模拟web集群

  我启动了二个memcached进程,分别模拟二台服务器

  /usr/local/bin/memcached-d-m1024-c3000-uuenucom-p12000-P./memcached.pid

  /usr/local/bin/memcached-d-m1024-c3000-uuenucom-p13000-P./mem.pid

  2、修改php的配置

  vi/usr/local/php/lib/php.ini

  session.save_handler=“memcache”

  memcache.hash_strategy=“consistent”

  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

  session

  SessionSupportenabled

  Registeredsavehandlersfilesusersqlitememcache

  Registeredserializerhandlersphpphp_binary

  紧接着下面是

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

  4、做个简单测试

  a)准备文件session.php

PHP代码
  1.   session_start();  
  2.   $_SESSION['username']=“abcabc”;echosession_id();  
  3. ?>  

  b)显示session内容文件

PHP代码
  1.   $mem=newMemcache;  
  2.   $mem->addServer(“127.0.0.1″,12000)ordie(“Couldnotaddserver12000″);  
  3.   $mem->addServer(“127.0.0.1″,13000)ordie(“Couldnotaddserver13000″);  
  4.   $val=$mem->get(‘qp0mrob2ovcqle3u4lbr4obsa5′);  
  5.   //echosession_id();  
  6.   echo$val;  
  7. ?>  

  c)结果是username|s:6:”abcabc”;

分享到:
ApacheTomcat负载平衡设置方法具体解析
一、简介: 每个Tomcat worker是一个服务于web server、等候履行servlet的Tomcat实例。例如我们经常应用像Apache之类的web server转发sevlet恳求给位于其后面的一个Tomcat过程(也就是前面所说的worker)。本文具体先容了如何配置各种类型worker和loadbalance,并阐明了各种类型worker的特征和loadbalance配置的原理。 ...
谈谈大型网站架构系列:负载均衡详解(1...
面对大量用户访问、高并发请求,海量数据,可以使用高性能的服务器、大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比如(Go,Scala)等,当单机容量达到极限时,我们需要考虑业务拆分和分布式部署,来解决大型网站访问量大,并发量高,海量数据的问题。 从单机网站到分布式网站,很重要的区别是业务...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……