青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

利用memcached構(gòu)建高性能的Web應(yīng)用程序

轉(zhuǎn)載自:http://it.dianping.com/use-memcached-to-build-high-performance-web-application.htm

面臨的問題

對于高并發(fā)高訪問的Web應(yīng)用程序來說,數(shù)據(jù)庫存取瓶頸一直是個令人頭疼的問題。特別當(dāng)你的程序架構(gòu)還是建立在單數(shù)據(jù)庫模式,而一個數(shù)據(jù)池連接數(shù)峰值已經(jīng)達(dá)到500的時候,那你的程序運行離崩潰的邊緣也不遠(yuǎn)了。很多小網(wǎng)站的開發(fā)人員一開始都將注意力放在了產(chǎn)品需求設(shè)計上,缺忽視了程序整體性能,可擴展性等方面的考慮,結(jié)果眼看著訪問量一天天網(wǎng)上爬,可突然發(fā)現(xiàn)有一天網(wǎng)站因為訪問量過大而崩潰了,到時候哭都來不及。所以我們一定要未雨綢繆,在數(shù)據(jù)庫還沒罷工前,想方設(shè)法給它減負(fù),這也是這篇文章的主要議題。

大家都知道,當(dāng)有一個request過來后,web服務(wù)器交給app服務(wù)器,app處理并從db中存取相關(guān)數(shù)據(jù),但db存取的花費是相當(dāng)高昂的。特別是每次都取相同的數(shù)據(jù),等于是讓數(shù)據(jù)庫每次都在做高耗費的無用功,數(shù)據(jù)庫如果會說話,肯定會發(fā)牢騷,你都問了這么多遍了,難道還記不住嗎?是啊,如果app拿到第一次數(shù)據(jù)并存到內(nèi)存里,下次讀取時直接從內(nèi)存里讀取,而不用麻煩數(shù)據(jù)庫,這樣不就給數(shù)據(jù)庫減負(fù)了?而且從內(nèi)存取數(shù)據(jù)必然要比從數(shù)據(jù)庫媒介取快很多倍,反而提升了應(yīng)用程序的性能。

因此,我們可以在web/app層與db層之間加一層cache層,主要目的:1. 減少數(shù)據(jù)庫讀取負(fù)擔(dān);2. 提高數(shù)據(jù)讀取速度。而且,cache存取的媒介是內(nèi)存,而一臺服務(wù)器的內(nèi)存容量一般都是有限制的,不像硬盤容量可以做到TB級別。所以,可以考慮采用分布式的cache層,這樣更易于破除內(nèi)存容量的限制,同時又增加了靈活性。

Memcached 介紹

Memcached是開源的分布式cache系統(tǒng),現(xiàn)在很多的大型web應(yīng)用程序包括facebook,youtube,wikipedia,yahoo等等都在使用memcached來支持他們每天數(shù)億級的頁面訪問。通過把cache層與他們的web架構(gòu)集成,他們的應(yīng)用程序在提高了性能的同時,還大大降低了數(shù)據(jù)庫的負(fù)載。
具體的memcached資料大家可以直接從它的官方網(wǎng)站[1]上得到。這里我就簡單給大家介紹一下memcached的工作原理:

Memcached處理的原子是每一個(key,value)對(以下簡稱kv對),key會通過一個hash算法轉(zhuǎn)化成hash-key,便于查找、對比以及做到盡可能的散列。同時,memcached用的是一個二級散列,通過一張大hash表來維護。

Memcached有兩個核心組件組成:服務(wù)端(ms)和客戶端(mc),在一個memcached的查詢中,mc先通過計算key的hash值來確定kv對所處在的ms位置。當(dāng)ms確定后,客戶端就會發(fā)送一個查詢請求給對應(yīng)的ms,讓它來查找確切的數(shù)據(jù)。因為這之間沒有交互以及多播協(xié)議,所以memcached交互帶給網(wǎng)絡(luò)的影響是最小化的。

舉例說明:考慮以下這個場景,有三個mc分別是X,Y,Z,還有三個ms分別是A,B,C:

設(shè)置kv對
X想設(shè)置key=”foo”,value=”seattle”
X拿到ms列表,并對key做hash轉(zhuǎn)化,根據(jù)hash值確定kv對所存的ms位置
B被選中了
X連接上B,B收到請求,把(key=”foo”,value=”seattle”)存了起來

獲取kv對
Z想得到key=”foo”的value
Z用相同的hash算法算出hash值,并確定key=”foo”的值存在B上
Z連接上B,并從B那邊得到value=”seattle”
其他任何從X,Y,Z的想得到key=”foo”的值的請求都會發(fā)向B

Memcached服務(wù)器(ms)

內(nèi)存分配

默認(rèn)情況下,ms是用一個內(nèi)置的叫“塊分配器”的組件來分配內(nèi)存的。舍棄c++標(biāo)準(zhǔn)的malloc/free的內(nèi)存分配,而采用塊分配器的主要目的是為了避免內(nèi)存碎片,否則操作系統(tǒng)要花費更多時間來查找這些邏輯上連續(xù)的內(nèi)存塊(實際上是斷開的)。用了塊分配器,ms會輪流的對內(nèi)存進行大塊的分配,并不斷重用。當(dāng)然由于塊的大小各不相同,當(dāng)數(shù)據(jù)大小和塊大小不太相符的情況下,還是有可能導(dǎo)致內(nèi)存的浪費。

同時,ms對key和data都有相應(yīng)的限制,key的長度不能超過250字節(jié),data也不能超過塊大小的限制 --- 1MB。
因為mc所使用的hash算法,并不會考慮到每個ms的內(nèi)存大小。理論上mc會分配概率上等量的kv對給每個ms,這樣如果每個ms的內(nèi)存都不太一樣,那可能會導(dǎo)致內(nèi)存使用率的降低。所以一種替代的解決方案是,根據(jù)每個ms的內(nèi)存大小,找出他們的最大公約數(shù),然后在每個ms上開n個容量=最大公約數(shù)的instance,這樣就等于擁有了多個容量大小一樣的子ms,從而提供整體的內(nèi)存使用率。

緩存策略

當(dāng)ms的hash表滿了之后,新的插入數(shù)據(jù)會替代老的數(shù)據(jù),更新的策略是LRU(最近最少使用),以及每個kv對的有效時限。Kv對存儲有效時限是在mc端由app設(shè)置并作為參數(shù)傳給ms的。

同時ms采用是偷懶替代法,ms不會開額外的進程來實時監(jiān)測過時的kv對并刪除,而是當(dāng)且僅當(dāng),新來一個插入的數(shù)據(jù),而此時又沒有多余的空間放了,才會進行清除動作。

緩存數(shù)據(jù)庫查詢
現(xiàn)在memcached最流行的一種使用方式是緩存數(shù)據(jù)庫查詢,下面舉一個簡單例子說明:

App需要得到userid=xxx的用戶信息,對應(yīng)的查詢語句類似:

“SELECT * FROM users WHERE userid = xxx”

App先去問cache,有沒有“user:userid”(key定義可預(yù)先定義約束好)的數(shù)據(jù),如果有,返回數(shù)據(jù);如果沒有,App會從數(shù)據(jù)庫中讀取數(shù)據(jù),并調(diào)用cache的add函數(shù),把數(shù)據(jù)加入cache中。

當(dāng)取的數(shù)據(jù)需要更新,app會調(diào)用cache的update函數(shù),來保持?jǐn)?shù)據(jù)庫與cache的數(shù)據(jù)同步。

從上面的例子我們也可以發(fā)現(xiàn),一旦數(shù)據(jù)庫的數(shù)據(jù)發(fā)現(xiàn)變化,我們一定要及時更新cache中的數(shù)據(jù),來保證app讀到的是同步的正確數(shù)據(jù)。當(dāng)然我們可以通過定時器方式記錄下cache中數(shù)據(jù)的失效時間,時間一過就會激發(fā)事件對cache進行更新,但這之間總會有時間上的延遲,導(dǎo)致app可能從cache讀到臟數(shù)據(jù),這也被稱為狗洞問題。(以后我會專門描述研究這個問題)

數(shù)據(jù)冗余與故障預(yù)防

從設(shè)計角度上,memcached是沒有數(shù)據(jù)冗余環(huán)節(jié)的,它本身就是一個大規(guī)模的高性能cache層,加入數(shù)據(jù)冗余所能帶來的只有設(shè)計的復(fù)雜性和提高系統(tǒng)的開支。

當(dāng)一個ms上丟失了數(shù)據(jù)之后,app還是可以從數(shù)據(jù)庫中取得數(shù)據(jù)。不過更謹(jǐn)慎的做法是在某些ms不能正常工作時,提供額外的ms來支持cache,這樣就不會因為app從cache中取不到數(shù)據(jù)而一下子給數(shù)據(jù)庫帶來過大的負(fù)載。

同時為了減少某臺ms故障所帶來的影響,可以使用“熱備份”方案,就是用一臺新的ms來取代有問題的ms,當(dāng)然新的ms還是要用原來ms的IP地址,大不了數(shù)據(jù)重新裝載一遍。

另外一種方式,就是提高你ms的節(jié)點數(shù),然后mc會實時偵查每個節(jié)點的狀態(tài),如果發(fā)現(xiàn)某個節(jié)點長時間沒有響應(yīng),就會從mc的可用server列表里刪除,并對server節(jié)點進行重新hash定位。當(dāng)然這樣也會造成的問題是,原本key存儲在B上,變成存儲在C上了。所以此方案本身也有其弱點,最好能和“熱備份”方案結(jié)合使用,就可以使故障造成的影響最小化。

Memcached客戶端(mc)

Memcached客戶端有各種語言的版本供大家使用,包括java,c,php,.net等等,具體可參見memcached api page[2]。
大家可以根據(jù)自己項目的需要,選擇合適的客戶端來集成。

緩存式的Web應(yīng)用程序架構(gòu)
有了緩存的支持,我們可以在傳統(tǒng)的app層和db層之間加入cache層,每個app服務(wù)器都可以綁定一個mc,每次數(shù)據(jù)的讀取都可以從ms中取得,如果沒有,再從db層讀取。而當(dāng)數(shù)據(jù)要進行更新時,除了要發(fā)送update的sql給db層,同時也要將更新的數(shù)據(jù)發(fā)給mc,讓mc去更新ms中的數(shù)據(jù)。

假設(shè)今后我們的數(shù)據(jù)庫可以和ms進行通訊了,那可以將更新的任務(wù)統(tǒng)一交給db層,每次數(shù)據(jù)庫更新數(shù)據(jù)的同時會自動去更新ms中的數(shù)據(jù),這樣就可以進一步減少app層的邏輯復(fù)雜度。如下圖:

不過每次我們?nèi)绻麤]有從cache讀到數(shù)據(jù),都不得不麻煩數(shù)據(jù)庫。為了最小化數(shù)據(jù)庫的負(fù)載壓力,我們可以部署數(shù)據(jù)庫復(fù)寫,用slave數(shù)據(jù)庫來完成讀取操作,而master數(shù)據(jù)庫永遠(yuǎn)只負(fù)責(zé)三件事:1.更新數(shù)據(jù);2.同步slave數(shù)據(jù)庫;3.更新cache。如下圖:

以上這些緩存式web架構(gòu)在實際應(yīng)用中被證明是能有效并能極大地降低數(shù)據(jù)庫的負(fù)載同時又能提高web的運行性能。當(dāng)然這些架構(gòu)還可以根據(jù)具體的應(yīng)用環(huán)境進行變種,以達(dá)到不同硬件條件下性能的最優(yōu)化。

未來的憧憬
Memcached的出現(xiàn)可以說是革命性的,第一次讓我們意識到可以用內(nèi)存作為存儲媒介來大規(guī)模的緩存數(shù)據(jù)以提高程序的性能。不過它畢竟還是比較新的東西,還需要很多有待優(yōu)化和改進的地方,例如:
如何利用memcached實現(xiàn)cache數(shù)據(jù)庫,讓數(shù)據(jù)庫跑在內(nèi)存上。這方面,tangent software 開發(fā)的memcached_engine[3]已經(jīng)做了不少工作,不過現(xiàn)在的版本還只是處于實驗室階段。
如何能方便有效的進行批量key清理。因為現(xiàn)在key是散列在不同的server上的,所以對某類key進行大批量清理是很麻煩的。因為memcached本身是一個大hash表,是不具備key的檢索功能的。所以memcached是壓根不知道某一類的key到底存了多少個,都存在哪些server上。而這類功能在實際應(yīng)用中卻是經(jīng)常用到。

交流
作者也是剛接觸memcached方面的內(nèi)容,所以嚴(yán)格來說還只是個新手,班門弄斧地說了一大通,如果有不對的地方,還請各位大俠多多指正。當(dāng)然,如果有什么和memcached方面有關(guān)的問題或建議,也歡迎和我聯(lián)系。
聯(lián)系Email: rongwei.yang@dianping.com

參考
[1]. Memcached website: http://danga.com/memcached/
[2]. Memcached API Page: http://danga.com/memcached/apis.bml
[3]. memcached_engine: http://tangent.org/506/memcache_engine.html

posted on 2012-05-03 14:41 楊粼波 閱讀(1344) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩亚洲天堂| 久久免费精品日本久久中文字幕| 久久久久综合| 9i看片成人免费高清| 精品成人a区在线观看| 国产精品久久91| 欧美精品二区| 美女诱惑一区| 久久精品免费看| 性色av一区二区怡红| 亚洲一区二区精品在线| 亚洲精品国产精品国自产观看浪潮| 久久久久99| 欧美影院精品一区| 亚洲综合视频1区| 亚洲一级高清| 一区二区高清视频| 99亚洲一区二区| 亚洲精品国精品久久99热| 影音先锋日韩有码| 韩国一区二区三区在线观看| 国产视频一区在线观看一区免费| 国产精品免费观看在线| 国产精品久久久久av免费| 欧美日韩另类一区| 欧美日韩一区二区在线观看| 欧美激情网友自拍| 欧美区二区三区| 欧美日韩福利| 欧美日韩中国免费专区在线看| 欧美激情中文字幕乱码免费| 欧美激情aaaa| 欧美日韩福利在线观看| 欧美三级电影一区| 国产精品www网站| 国产九九精品视频| 国产日韩精品在线观看| 国产主播一区二区| 一区视频在线看| 亚洲国产欧美一区| 日韩午夜在线观看视频| 中文欧美在线视频| 一区二区三区精密机械公司| 亚洲午夜日本在线观看| 亚洲欧美日本国产有色| 欧美在线啊v一区| 久久久久久一区二区| 免费不卡亚洲欧美| 亚洲国语精品自产拍在线观看| 亚洲日本欧美日韩高观看| 一区二区欧美激情| 欧美在线首页| 蜜桃av综合| 欧美性猛交99久久久久99按摩| 国产精品有限公司| 在线观看亚洲a| 亚洲伦理在线| 欧美一区二区三区视频在线 | 亚洲尤物在线视频观看| 午夜视频在线观看一区二区| 久久女同精品一区二区| 欧美激情第三页| 一本色道久久| 久久久久久久高潮| 欧美美女福利视频| 国产亚洲激情在线| 亚洲欧洲在线视频| 欧美一区2区三区4区公司二百| 久久一区二区三区超碰国产精品| 亚洲国产美女久久久久| 亚洲欧美日韩综合aⅴ视频| 狼人社综合社区| 国产精品久久午夜| 亚洲国产精品va在线看黑人| 亚洲午夜一区| 免费不卡视频| 亚洲一区在线看| 欧美成人一区二区三区片免费| 国产精品二区二区三区| 亚洲国产日韩一级| 欧美一级夜夜爽| 亚洲国产精品久久久久| 午夜视黄欧洲亚洲| 欧美日本一区二区三区| 激情成人中文字幕| 亚洲欧美成人在线| 亚洲国产精品精华液网站| 香蕉成人啪国产精品视频综合网| 欧美国产综合一区二区| 国产一区二区三区久久 | 一区二区三区欧美亚洲| 久久综合电影| 国产精品素人视频| 亚洲美女诱惑| 毛片av中文字幕一区二区| 亚洲视频网站在线观看| 欧美不卡激情三级在线观看| 国产丝袜一区二区三区| 亚洲午夜一级| 亚洲欧洲日本mm| 乱码第一页成人| 好吊妞**欧美| 久久精品99国产精品酒店日本| 日韩视频免费观看| 欧美第一黄色网| 在线国产精品播放| 久久久精品国产一区二区三区| 在线综合+亚洲+欧美中文字幕| 免费亚洲一区| 亚洲第一视频| 免费欧美在线| 久久激情视频久久| 国产日韩欧美一区二区| 校园激情久久| 亚洲网址在线| 国产精品久久久久天堂| 亚洲永久视频| 亚洲午夜国产成人av电影男同| 欧美日韩在线视频一区| 99成人精品| 亚洲美女福利视频网站| 欧美母乳在线| 亚洲少妇一区| 在线视频你懂得一区| 国产精品第2页| 午夜精品av| 午夜激情一区| 国产一区二区电影在线观看| 久久九九久久九九| 欧美在线一级视频| 一区二区在线看| 欧美成人午夜视频| 欧美成人午夜视频| 99在线视频精品| 亚洲视频www| 国产日韩专区在线| 久久综合久久综合这里只有精品| 久久成人18免费网站| 亚洲第一中文字幕| 欧美激情一区二区三区高清视频| 欧美黄色免费网站| 亚洲视频一区在线| 亚洲午夜高清视频| 国产真实久久| 亚洲国产精品传媒在线观看| 欧美日韩精品二区| 亚洲欧美日韩精品久久| 欧美一区二区三区日韩视频| 影音先锋久久精品| 91久久精品美女高潮| 欧美天堂亚洲电影院在线观看| 午夜电影亚洲| 久久精品一本久久99精品| 亚洲全黄一级网站| 一本色道久久88综合亚洲精品ⅰ | 欧美色图麻豆| 久久精品国产一区二区三区| 久久久久免费视频| 一本一本a久久| 欧美亚洲在线播放| 亚洲精品国产日韩| 亚洲在线观看视频网站| 亚洲大胆美女视频| av不卡免费看| 一区二区三区在线视频播放| 亚洲精品久久久久| 国产日韩亚洲欧美| 亚洲国产综合91精品麻豆| 国产精品美女久久久久av超清| 美女网站久久| 欧美午夜片在线观看| 免费成人在线视频网站| 欧美视频在线不卡| 欧美成人精品1314www| 国产精品捆绑调教| 亚洲第一页自拍| 国产美女精品一区二区三区 | 国产精品二区在线观看| 久久一区二区精品| 欧美三级视频在线| 欧美成人一区二区三区片免费 | 日韩图片一区| 欧美夜福利tv在线| 中国av一区| 久久中文字幕一区| 欧美一区2区三区4区公司二百 | 亚洲免费观看高清在线观看 | 一区二区三区黄色| 久久九九免费视频| 亚洲在线观看免费| 免费中文日韩| 久久久天天操| 国产精品女主播| 亚洲精品一区中文| 136国产福利精品导航网址应用 | 亚洲国产精品成人精品| 西西裸体人体做爰大胆久久久| 在线亚洲自拍| 欧美激情综合亚洲一二区| 两个人的视频www国产精品|