使用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 |