Memcache高可用共享session,容納100萬人同時線上 .
企業網站使用者數越來越多,同時線上人數越來越多,最大同時線上達100萬之多,由於session檔案是小檔案儲存,設想每個使用者大概2K左右資料,NFS頻繁讀取導致IO成為瓶頸,雖然可以更改配置以分級目錄的形式保持session但還是沒有達到最優設計,但如果把session放在記憶體中,記憶體存取快速,就再也不用擔心海量使用者的壓力了!
以下設計了以memcache為記憶體管理系統來設計的高可用,高負載,高效能的中央儲存區之session共享
memcache版本採用repcached
下載地址:http://sourceforge.net/projects/repcached/files/
它是一個單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?- 在 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演算法(最近最少使用)進行剔除舊資料然後儲存新資料
在 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網絡卡可能承受不住,建議換千兆網絡卡