前面講了如何配置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. <?php  
  2.   session_start();  
  3.   $_SESSION['username']=“abcabc”;echosession_id();  
  4. ?>  

  b)顯示session內容文件

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

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

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.vkzldl.live/software/313.html
2013年4月1日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:6