Nginx + Memcached 實現Session共享的負載均衡

Session共享

  我們在做站點的時候,通常需要保存用戶的一些基本信息,比如登錄就會用到Session;當使用Nginx做負載均衡的時候,用戶瀏覽站點的時候會被分配到不同的服務器上,此時如果登錄後Session就在不同發服務器上,A記住了用戶的登錄狀態,可是下一次用戶請求被分配到B去了怎麼辦?不可能讓用戶再登陸一次,所以要讓session在不同的服務器上都能獲取到相同的內容。

方法思路

  1.  ip_hash,這是Nginx的輪詢方法,用戶登錄站點時,就會一直在這臺服務器上就不存在Session的問題;

    優點:不需要採用任何處理;

    缺點:當某臺服務器訪問的量大時,負載均衡就相當於沒用了

  2. 用Memcached或者redis緩存的方式;
  3. 使用數據庫直接存儲;
    1.   缺點:對數據庫要求高,當出現高訪問量時,需要不停的讀寫,數據庫壓力大,
  4. 用Memcached或者redis + DB異步存儲;

   

  這四點是實現Session共享的一種方案和思路,每種方法都有自己的優缺點,全部的優缺點我也無法描述,畢竟沒有具體的去實現和使用;使用哪種方式還需要看項目的情況和具體的解決方案;

  在自己的學習過程選擇第二種,Nginx + Memcached 實現Session共享的負載均衡;

  自己搞一臺服務器,Nginx和Memcached 在一臺服務器;

  在服務器我部署了相同的兩個站點,代碼相同,一個端口爲8080;另一個爲8090;

 1    private static readonly IMemcachedManager _memcachedManager = new MemcachedManager();
 2 
 3         public ActionResult Index()
 4         {
 5             Random rd = new Random();
 6             Session["Session"] = rd.Next(1, 100000);
 7 
 8             if (!_memcachedManager.IsExit("Session"))
 9             {
10                 _memcachedManager.SetValue("Session", Session["Session"]);               
11             }
12 
13             ViewBag.Message = "當前站點爲:8080;Session爲:" + _memcachedManager.GetValue<string>("Session") + "";
14 
15             return View();
16         }

 

運行結果:

  實現了我的目的,達到了均衡負載同時session共享的目的。

  Nginx除了Session共享的問題,還有一個共享資源的問題,比如上傳文件,這需要負載均衡需要解決的一個問題;

總結

  不管是安裝Nginx還是Memcached,在這個過程中,並沒有遇到比較深的坑,當然Memcached在網上也有很多的例子,一些基本的安裝都能夠很快的實現,部署起來相對於簡單畢竟只是一個Demo,不知道在實際的項目中將會是如何的,也會會有很大的不同;

  這只是自己學習的一個地方,當然這裏面還有更多東西需要去研究;

  共勉

 

 

發佈了0 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章