国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 服務(wù)器 > 管理維護(hù) > 正文

memcachedb的緩存解決方案

2024-09-10 14:19:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

問題示例:
網(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配置判斷:

 

upstream backend {
  server 192.168.1.4;
}
upstream memcachedb {
  server 192.168.1.2:11212;
  server 192.168.1.3:11212 backup;
}
server {
  server_name  www.aslibra.com;
  location / {
    proxy_pass http://backend;
  }
  location ~* ^/article/ {
    set $memcached_key $host$uri;
    default_type       text/html;
    memcached_pass     memcachedb;
    error_page         404 = /fallback;
  }
  location = /fallback {
    internal;
    proxy_set_header  memcached_key $memcached_key;
    proxy_pass http://backend;
  }
}



定義了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ù)器:

 

memcachedb -p 11212 -l 0.0.0.0 -u root -d -r -N -H /data/aslibra.com/article/



如果配置主從,那可以啟用magent:

 

magent -s 192.168.1.2:11212 -b 192.168.1.3:11212
#默認(rèn)監(jiān)聽 0.0.0.0:11211,提供給PHP使用
#比如這里是在192.168.1.2上運(yùn)行



C服務(wù)器配置rewrite(lighttpd):

 

$HTTP["host"] == "www.aslibra.com" {
        server.document-root = "/data/www.aslibra.com/"
        url.rewrite-once = (
                "^/article" => "/php/cache.php"
        )
}



PHP代碼參考:

 

<?
//do sth to build html
echo $html;

//如果有傳遞memcached_key值就把結(jié)果存入memcachedb
//不需要設(shè)置緩存時(shí)間,因?yàn)闆]有用 :)
//有需要更新,那就記錄一下日志
if($_SERVER['HTTP_MEMCACHED_KEY']){
  $m = new Memcache;
  if($m->connect('192.168.1.2', 11211) ){
    $key = $_SERVER['HTTP_MEMCACHED_KEY'];
    $m->set($key, $html);
    //有必要就記日志
    //log to file...
  }
}
?>



刪除文件:

如果有記錄日志(可以是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的安裝

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 康保县| 响水县| 安阳县| 济源市| 孟连| 荣昌县| 防城港市| 祁门县| 金塔县| 平江县| 汤阴县| 界首市| 海原县| 灵山县| 天镇县| 阜康市| 九寨沟县| 阿拉善左旗| 会昌县| 台中市| 西吉县| 曲水县| 驻马店市| 安达市| 庆安县| 夏津县| 崇信县| 肇东市| 普宁市| 永州市| 孝义市| 屯留县| 丹巴县| 新宁县| 乌苏市| 砚山县| 博罗县| 清丰县| 邵阳县| 中卫市| 梅河口市|