問題示例:
網(wǎng)站有千萬(wàn)個(gè)網(wǎng)頁(yè)文件需要存儲(chǔ),占用空間大約有300-400G,導(dǎo)致問題:
1 小文件太多,備份困難
2 空間增長(zhǎng)很難調(diào)整
3 前端做緩存,因?yàn)閛bject很高,效率很低,squid和lighttpd都不合適
解決方案說(shuō)明:
1 nginx+memcached接口
Nginx有一個(gè)模塊是可以讀取memcached的數(shù)據(jù)的,可以把網(wǎng)頁(yè)文件內(nèi)容保存到memcached里面,如果數(shù)據(jù)無(wú)效,則proxy到后端,后端服務(wù)器更新此數(shù)據(jù)
2 memcachedb接口
memcachedb是新浪的一個(gè)開源項(xiàng)目,用硬盤作為存儲(chǔ)空間,用的是Berkeley DB的存儲(chǔ)引擎,memcached的協(xié)議。
有memcached的方便性,同時(shí)有高效的讀寫性能,沒有內(nèi)存作為存儲(chǔ)空間的限制,數(shù)據(jù)永久保留,同時(shí)使用局域網(wǎng)的機(jī)器就可以處理并且很容易共享,不限制為本地文件,有自動(dòng)的備份機(jī)制。
3 php程序管理存儲(chǔ)
php處理memcached很容易,和前端約定相應(yīng)的key即可
4 計(jì)劃任務(wù)處理更新
由于memcachedb是永久保存,前端無(wú)法判斷是否過(guò)期,所以需要自己制定策略刪除過(guò)期的網(wǎng)頁(yè),以便前端獲取不到而自動(dòng)更新
5 magent作為memcachedb的代理接口,解決備份問題
memcachedb有備份方法,我碰到過(guò)出現(xiàn)無(wú)法同步的情況,magent也可以幫助解決此問題,它是為memcached設(shè)計(jì)的,但由于memcachedb使用memcached協(xié)議,所以也同樣適用
解決方案配置示例:
假設(shè)www.aslibra.com/article/xxx 地址需要使用此方案,那就可以用服務(wù)器A(2)和B(3)作為memcachedb服務(wù),可以在A(2)上跑magent,C(4)服務(wù)器是后端服務(wù)器,負(fù)責(zé)存入memcachedb數(shù)據(jù)
前端Nginx配置判斷:
定義了memcachedb的upstream,有一個(gè)是backup標(biāo)識(shí)的
/article/的請(qǐng)求會(huì)先查詢memcachedb,找不到再發(fā)送到后端服務(wù)器
注意 proxy_set_header memcached_key $memcached_key 這句,可以保持key值的一致性
對(duì)于中文出現(xiàn)在地址的情況很實(shí)用,后端使用$_SERVER['REQUEST_URI'] 會(huì)和 $uri 不一致
A和B緩存服務(wù)器:
如果配置主從,那可以啟用magent:
C服務(wù)器配置rewrite(lighttpd):
PHP代碼參考:
刪除文件:
如果有記錄日志(可以是web服務(wù)器日志或者php記錄的日志),可以根據(jù)保存的日志處理
需要?jiǎng)h除的 $m->delete($key) 即可
備份請(qǐng)參考memcachedb的操作指南。
此解決方案適合memcached的存儲(chǔ)方式,況且不用處理過(guò)期的問題,php可以解決過(guò)期時(shí)間
文章更新請(qǐng)關(guān)注本文更新:
http://www.aslibra.com/blog/post/memcachedb_cache_solution.php
參考資料:
1 Berkeley DB
2 memcachedb
3 magent
4 NginxModules
5 嵌入式數(shù)據(jù)庫(kù)系統(tǒng)Berkeley DB
6 memcached和magent的安裝
7 memcachedb的安裝
新聞熱點(diǎn)
疑難解答