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