1. 程式人生 > >使用memcache實現單點登入(session共享)

使用memcache實現單點登入(session共享)

負載均衡

在大型應用中,基本上都要使用叢集或負載均衡來滿足大訪問量,但這樣一來,就會出現一個問題,當一個使用者登入之後,如果訪問的URL被定向到另外的伺服器上,那麼session就會丟失。這是一個很嚴重的問題。如何解決這樣一個問題呢?這裡有很多種方式,以下簡要說明:

1)     使用cookie代替session

這種方式比較簡單,但從安全性方面來說有所欠缺。

2)     使用nginx提供的ip_hash命令

這種方式很簡單,也很可靠。但這種方式有一個致命的問題,那就是會嚴重削弱負載均衡的效果。這種方式的原理是如果是一個Ip請求服務,那麼該IP的所有請求都將傳送到同一臺伺服器,這樣一來,就一定不會出現session的問題,但是因為同一ip的所有請求都只能由一臺伺服器來處理,負載均衡不理想。如以下的配置方式:

upstream sea1_server_pool{

         server 192.168.81.202:80 weight=10 max_fails=2 fail_timeout=30s;

    server 192.168.81.204:82 weight=5 max_fails=2 fail_timeout=30s;

         server 192.168.81.204:83 weight=6 max_fails=2 fail_timeout=30s;

         ip_hash;

 }

3)     使用memcache方式實現session共享

此種方式是通過將session儲存到單獨的快取伺服器中,所有的應用都可以從這裡讀取資料。所以,可以很好的保證負載均衡或者叢集的質量。

但不可忽視的是,如果只有一臺memcache伺服器,萬一這臺伺服器宕機,那麼所有的應用都將變得不可用。所以在實際應用中應有兩臺伺服器充當memcache伺服器,以保證高可用性。

Memcache的應用

Memcache簡介

         Memcached是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashmap。其守護程序(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護程序通訊。但是它並不提供冗餘(例如,複製其hashmap條目); 當某個伺服器停止執行或崩潰了,所有存放在伺服器上的鍵/值對都將丟失。

memcache配置

l       伺服器端配置

       安裝libevent

下載地址:http://www.monkey.org/~provos/libevent-1.3.tar.gz

./configure-prefix=/usr/local/libevent

make&& make install

       安裝memcache

                        下載地址:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz

                         ./configure-with-libevent=/usr/local/libevent

                         make && make install

           啟動memcache伺服器

命令:/usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000-c 256 -P /tmp/memcached.pid

說明:

■        -d選項是啟動一個守護程序

■        -m是分配給Memcache使用的記憶體數量,單位是MB,我這裡是10MB

■        -u是執行Memcache的使用者,我這裡是root

■        -l是監聽的伺服器IP地址,如果有多個地址的話,我這裡指定了伺服器的IP地址192.168.0.200,

■        -p是設定Memcache監聽的埠,我這裡設定了12000,最好是1024以上的埠,

■        -c選項是最大執行的併發連線數,預設是1024,我這裡設定了256,按照你伺服器的負載量來設定

■        -P是設定儲存Memcache的pid檔案,我這裡是儲存在/tmp/memcached.pid

railsmemcache客戶端安裝

l       下載地址:http://rubygems.org/downloads/memcache-client-1.8.5.gem

l       安裝:gem install memcache-client

l       簡單應用

require 'memcache'

require 'memcache_util' # 需要載入的模組

MEMCACHE_OPTIONS = {:debug => false,

  :namespace => 'kevin',

  :readonly => false} # 配置資訊

MEMCACHE_CONFIG = "172.19.0.234:11212" # 連結的伺服器地址以及埠

CACHE = MemCache.new MEMCACHE_OPTIONS

CACHE.servers = MEMCACHE_CONFIG

CACHE.set('name','QA') # 設定相應的值到記憶體中,已hash的形式儲存,可以儲存物件等

puts CACHE.get('name') # 獲取儲存中的相應值

CACHE.delete('name') # 刪除cache中的hash值

puts CACHE.get('name') # nil

l       使用memcache儲存session

       首先在environment.rb檔案中配置memcache相關連結引數 (如果是2.x,則在config/initializers/session_store.rb檔案中)

require 'memcache'

require 'memcache_util'

# memcache defaults, environments may override these settings

unless defined? MEMCACHE_OPTIONS then

  MEMCACHE_OPTIONS = {:debug => false,

    :namespace => "mem-#{RAILS_ENV}",

    :readonly => false}

end

# memcache configuration

unless defined? MEMCACHE_CONFIG then

  File.open "#{RAILS_ROOT}/config/memcached.yml" do |memcache|

    MEMCACHE_CONFIG = YAML::load memcache

  end

end

# Connect to memcache

unless defined? CACHE then

  CACHE = MemCache.new MEMCACHE_OPTIONS

  CACHE.servers = MEMCACHE_CONFIG[RAILS_ENV]

end

       在environment.rb的config中修改session的儲存方式為memcache,以及設定session的過期時間等配置(如果是2.x,則在config/initializers/session_store.rb檔案中)

 config.action_controller.session_store = :mem_cache_store

  config.action_controller.session = {

    :session_key => "mem-#{RAILS_ENV}",

    :secret      => 'someotherkindofsecretthatnooneknows',

    :cache       => CACHE,

    :expires=> 900  }

     步驟1中需要從memcached.yml檔案中載入伺服器資訊,需要在config目錄下新建memcached.yml檔案,內容如下 :

      

l        production:

l          192.168.81.204:12000

l        development:

l          192.168.81.204:12000

l        192.168.81.204:12000

注意:如果只是配置一個memcache,memcache伺服器down掉的話會導致應用全部是500錯誤,所以線上環境必須配置兩個 memcache保證線上應用的安全。