1. 程式人生 > >Memcache高可用共享session,容納100萬人同時線上 .

Memcache高可用共享session,容納100萬人同時線上 .

企業網站使用者數越來越多,同時線上人數越來越多,最大同時線上達100萬之多,由於session檔案是小檔案儲存,設想每個使用者大概2K左右資料,NFS頻繁讀取導致IO成為瓶頸,雖然可以更改配置以分級目錄的形式保持session但還是沒有達到最優設計,但如果把session放在記憶體中,記憶體存取快速,就再也不用擔心海量使用者的壓力了!

以下設計了以memcache為記憶體管理系統來設計的高可用,高負載,高效能的中央儲存區之session共享


memcache版本採用repcached

下載地址:http://sourceforge.net/projects/repcached/files/

它是一個單master單 slave的方案,但它的 master/slave都是可讀寫的,而且可以相互同步,

如果 master 宕機, slave偵測到連線斷了,它會自動 listen而成為 master;但當master重新修復後只能以slave方式啟動,表明master與slave之間相互不搶佔!

如果 slave壞掉, master也會偵測到連線斷,它就會重新 listen等待新的 slave加入。

安裝測試

VIP:192.168.3.10

master:192.168.3.11

slave:192.168.3.12

關於VIP(keepalived+lvs)的安裝方法請查詢相關資料

安裝PHP省略,自行查詢相關資料

修改php.ini配置檔案如下兩行:

session.save_handler = memcache

session.save_path = "tcp://192.168.3.10:11211"  #此處是VIP地址

安裝memcache,由於memcache依賴libevent庫,無阻塞socket通訊

安裝libevent

# wget -c http://soft.vpser.net/lib/libevent/libevent-2.0.13-stable.tar.gz
# tar zxvf libevent-2.0.13-stable.tar.gz
# cd libevent-2.0.13-stable/
# ./configure --prefix=/usr/local/libevent
# make&& make install


# echo "/usr/local/libevent/lib/" >> /etc/ld.so.conf
# ln -s /usr/local/libevent/lib/libevent-2.0.so.5  /lib/libevent-2.0.so.5
# ldconfig

安裝repcached  

# wget http://nchc.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz

# tar zxvf memcached-1.2.8-repcached-2.2.1.tar.gz

# cd memcached-1.2.8-repcached-2.2.1

# ./configure --prefix=/usr/local/repcached --enable-replication   

--enable-64bit 在64位系統下./configure  -h 檢視配置幫助

# make && make install

# ln /usr/local/repcached/bin/memcached /usr/bin/memcached  #硬連結

###安裝完畢#####

repcached深度相容memcache協議

[plain] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. 在 Memcached中可以儲存的item資料量是沒有限制的,只要記憶體足夠 。  
  2. Memcached以單程序多執行緒方式執行,32位中最大使用記憶體為2G,這個由於核心限制,在64位中取決於實體記憶體限制,  
  3. 在32位中要使用更多記憶體,可以分多個埠開啟多個Memcached程序   
  4. 最大30天的資料過期時間,設定為永久的也會在這個時間過期,常量REALTIME_MAXDELTA  60*60*24*30控制   
  5. 最大鍵長為250位元組,大於該長度無法儲存,常量KEY_MAX_LENGTH 250控制   
  6. 單個item最大資料是1MB,超過1MB資料不予儲存返回false,常量POWER_BLOCK 1048576進行控制,   
  7. 它是預設的slab大小 最大同時連線數是200,通過 conn_init()中的freetotal進行控制,最大軟連線數是1024,  
  8. 通過 settings.maxconns=1024 進行控制 ,需要說明的一點是memcache處理請求是以佇列形式處理的  
  9. 跟空間佔用相關的引數:settings.factor=1.25, settings.chunk_size=48, 影響slab的資料佔用和步長比  
  10. memcached是一種無阻塞的socket通訊方式服務,基於libevent庫,由於無阻塞通訊,對記憶體讀寫速度非常之快。  
  11. memcached分伺服器端和客戶端,可以配置多個伺服器端和客戶端,應用於分散式的服務非常廣泛。  
  12. memcached作為小規模的資料分散式平臺是十分有效果的。  
  13. memcached是鍵值一一對應,key預設最大不能超過128個字 節,value預設大小是1M,也就是一個slabs,如果要存2M的值(連續的),不能用兩個slabs,因為兩個slabs不是連續的,無法在記憶體中 儲存,故需要修改slabs的大小,多個key和value進行儲存時,即使這個slabs沒有利用完,那麼也不會存放別的資料。  
  14. memcache假定設定64m記憶體佔用,當記憶體已滿時採用LRU演算法(最近最少使用)進行剔除舊資料然後儲存新資料  
在 Memcached中可以儲存的item資料量是沒有限制的,只要記憶體足夠 。
Memcached以單程序多執行緒方式執行,32位中最大使用記憶體為2G,這個由於核心限制,在64位中取決於實體記憶體限制,
在32位中要使用更多記憶體,可以分多個埠開啟多個Memcached程序 
最大30天的資料過期時間,設定為永久的也會在這個時間過期,常量REALTIME_MAXDELTA  60*60*24*30控制 
最大鍵長為250位元組,大於該長度無法儲存,常量KEY_MAX_LENGTH 250控制 
單個item最大資料是1MB,超過1MB資料不予儲存返回false,常量POWER_BLOCK 1048576進行控制, 
它是預設的slab大小 最大同時連線數是200,通過 conn_init()中的freetotal進行控制,最大軟連線數是1024,
通過 settings.maxconns=1024 進行控制 ,需要說明的一點是memcache處理請求是以佇列形式處理的
跟空間佔用相關的引數:settings.factor=1.25, settings.chunk_size=48, 影響slab的資料佔用和步長比
memcached是一種無阻塞的socket通訊方式服務,基於libevent庫,由於無阻塞通訊,對記憶體讀寫速度非常之快。
memcached分伺服器端和客戶端,可以配置多個伺服器端和客戶端,應用於分散式的服務非常廣泛。
memcached作為小規模的資料分散式平臺是十分有效果的。
memcached是鍵值一一對應,key預設最大不能超過128個字 節,value預設大小是1M,也就是一個slabs,如果要存2M的值(連續的),不能用兩個slabs,因為兩個slabs不是連續的,無法在記憶體中 儲存,故需要修改slabs的大小,多個key和value進行儲存時,即使這個slabs沒有利用完,那麼也不會存放別的資料。
memcache假定設定64m記憶體佔用,當記憶體已滿時採用LRU演算法(最近最少使用)進行剔除舊資料然後儲存新資料


####################################################################

memcache 如果分配2G記憶體,以每個使用者2K資料計算,512*2048≈100萬人線上,由於memcache自身也點用一定記憶體,

實際2G記憶體可能只有80%利用1.6G,如果分配2G記憶體,基本可以保持100萬人線上,session存在memcache的另一個好處是

不用擔心過期session過多的刪除問題,memcache自動過期,自動LRU剔除

啟動master (192.168.3.11)

# memcached -u root -p 11211 -m 2048 -d -c 1024  ###memcached -h 檢視引數文件

啟動slave (192.168.3.12)

# memcached -u root -p 11211 -m 2048 -d -c 1024  -x 192.168.3.11 -X 11212

### -x master主機IP,-X是與master複製埠相匹配11212(重點),11212埠是master啟動偵聽slave通訊的預設埠

測試讀取

telnet 192.168.1.11 11211 ##telnet 方式連線

set key 0 0 3

aaa

STORED

get key
VALUE key 0 3
aaa
END

####master 成功

telnet 192.168.1.12 11211

get key
VALUE key 0 3
aaa
END

####slave資料同步成功

###可停止master試試,slave會自動升級為master

####PHP測試

<?php

$m=new memcache();

$m->connect('192.168.1.10',11211); ##此處連線VIP地址

$m->set('key1','value',0,3600);

$m->set('key2',array(1,2,3),0,3600);

####################################

memcache預設連線1秒超時,設定過大失去快取意義,資料最大1M也是基於此點考慮,當記憶體使用超過1G後資料太大導致超時無法命中繼而導致快取刺穿壓到後方的DB

memcache只能儲存字串與陣列,字串直接儲存,陣列自動序列化後儲存

檔案,圖片,視訊需要打成二進位制後再儲存, 資源連線不能儲存,如mysqli連線,fopen指標

#######################################

$data=$m->get('key1');

echo $data;

?>

以上設計了100萬人同時線上高速方案(新浪微博),可防止單點故障,快取刺穿,由於大資料流通普通的100M網絡卡可能承受不住,建議換千兆網絡卡