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

牽著老婆滿街逛

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

利用memcached構建高性能的Web應用程序

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

面臨的問題

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

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

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

Memcached 介紹

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

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

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

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

設置kv對
X想設置key=”foo”,value=”seattle”
X拿到ms列表,并對key做hash轉化,根據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”的值的請求都會發向B

Memcached服務器(ms)

內存分配

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

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

緩存策略

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

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

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

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

“SELECT * FROM users WHERE userid = xxx”

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

當取的數據需要更新,app會調用cache的update函數,來保持數據庫與cache的數據同步。

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

數據冗余與故障預防

從設計角度上,memcached是沒有數據冗余環節的,它本身就是一個大規模的高性能cache層,加入數據冗余所能帶來的只有設計的復雜性和提高系統的開支。

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

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

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

Memcached客戶端(mc)

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

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

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

不過每次我們如果沒有從cache讀到數據,都不得不麻煩數據庫。為了最小化數據庫的負載壓力,我們可以部署數據庫復寫,用slave數據庫來完成讀取操作,而master數據庫永遠只負責三件事:1.更新數據;2.同步slave數據庫;3.更新cache。如下圖:

以上這些緩存式web架構在實際應用中被證明是能有效并能極大地降低數據庫的負載同時又能提高web的運行性能。當然這些架構還可以根據具體的應用環境進行變種,以達到不同硬件條件下性能的最優化。

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

交流
作者也是剛接觸memcached方面的內容,所以嚴格來說還只是個新手,班門弄斧地說了一大通,如果有不對的地方,還請各位大俠多多指正。當然,如果有什么和memcached方面有關的問題或建議,也歡迎和我聯系。
聯系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)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            欧美激情精品久久久久久免费印度| 另类尿喷潮videofree| 亚洲国产99| 麻豆精品传媒视频| 亚洲国产综合91精品麻豆| 欧美高清影院| 欧美日韩999| 亚洲综合成人在线| 亚洲欧美日韩精品久久奇米色影视| 国产精品一区二区你懂的| 欧美一区国产一区| 久久国产精品免费一区| 亚洲国产日韩一级| 一区二区三区.www| 国产酒店精品激情| 欧美黑人多人双交| 国产精品久久久久久五月尺| 久久精品女人天堂| 欧美成人免费在线观看| 亚洲欧美综合另类中字| 久久久久99| 亚洲视频欧洲视频| 久久精品国产成人| 一区二区国产日产| 欧美伊人久久久久久久久影院 | 亚洲视频专区在线| 国产美女诱惑一区二区| 欧美高清在线视频| 国产精品一区二区三区久久| 欧美成年人视频| 欧美午夜免费影院| 欧美成人精品不卡视频在线观看 | 欧美激情黄色片| 欧美综合激情网| 欧美大片网址| 欧美在线观看天堂一区二区三区| 鲁大师影院一区二区三区| 亚洲免费网址| 欧美黑人一区二区三区| 久久免费视频在线观看| 欧美日韩综合久久| 亚洲福利免费| 精品成人国产在线观看男人呻吟| 一二美女精品欧洲| 亚洲精品一区二区三区99| 欧美一区二区三区在线看| 亚洲视频你懂的| 欧美精品国产精品| 免费在线观看一区二区| 国产日韩欧美一区二区| 亚洲视频综合在线| 99国产精品一区| 免费亚洲网站| 欧美黄色一区二区| 亚洲第一在线视频| 久久久久九九九| 久久国产精品99久久久久久老狼 | 欧美二区在线观看| 久久亚洲精选| 激情一区二区| 久久精品99无色码中文字幕| 久久精品伊人| 国产私拍一区| 性久久久久久久| 久久国产欧美| 国产午夜精品在线观看| 午夜亚洲影视| 久久久久久日产精品| 韩国在线一区| 久久久综合视频| 免费观看日韩| 亚洲精品一区二区网址| 欧美激情第五页| 日韩一级成人av| 午夜精品久久久久久久| 国产精品日韩高清| 午夜免费在线观看精品视频| 久久久青草青青国产亚洲免观| 国产午夜精品在线观看| 久久精品一区四区| 欧美激情视频一区二区三区免费 | 久久精品国产免费| 国产日韩av高清| 久久视频在线免费观看| 亚洲电影免费观看高清完整版在线观看 | 国产精品日日摸夜夜摸av| 亚洲一区二区毛片| 久久久999精品免费| 激情欧美亚洲| 欧美高清视频免费观看| 99精品久久| 久久久国产一区二区三区| 精品动漫一区二区| 欧美极品一区二区三区| 亚洲婷婷免费| 欧美chengren| 亚洲欧美日韩在线观看a三区 | 欧美激情第10页| 亚洲视频一区二区免费在线观看| 久久久久久久久综合| 亚洲国产精品成人va在线观看| 欧美精品成人在线| 午夜国产精品视频免费体验区| 农村妇女精品| 午夜精品久久久久久久99樱桃 | 国产欧美精品在线播放| 另类激情亚洲| 午夜亚洲性色视频| 91久久久在线| 麻豆成人在线| 香蕉国产精品偷在线观看不卡 | 欧美视频中文字幕| 久久久99爱| 亚洲一级一区| 亚洲免费成人av| 免费观看一区| 欧美与黑人午夜性猛交久久久| 亚洲靠逼com| 国模精品一区二区三区| 欧美日韩综合在线免费观看| 久久久久久久网站| 亚洲欧美激情诱惑| 亚洲免费成人av电影| 欧美激情一区二区三区在线| 久久精彩视频| 亚洲欧美视频一区| 一区二区三区精品| 亚洲激情成人网| 国产综合18久久久久久| 国产精品入口日韩视频大尺度| 欧美日韩国产小视频在线观看| 久久综合九色九九| 久久精品72免费观看| 亚洲欧美清纯在线制服| 一区二区三区欧美成人| 亚洲欧洲精品一区二区| 亚洲第一视频| 欧美成人一区二区在线| 免费成人黄色| 欧美a级在线| 欧美高清自拍一区| 欧美成人一区二区在线| 欧美成人dvd在线视频| 久久天天躁狠狠躁夜夜爽蜜月| 欧美诱惑福利视频| 欧美一区二区三区精品 | 亚洲福利视频一区| 在线观看一区欧美| 亚洲国产婷婷香蕉久久久久久| 在线成人亚洲| 亚洲精品欧美日韩专区| 亚洲黄色精品| 一区二区三区毛片| 亚洲午夜电影网| 欧美一区二区精品久久911| 欧美在线视频观看免费网站| 久久xxxx| 欧美国产在线视频| 亚洲精品女人| 亚洲精品美女在线观看| 夜夜嗨一区二区三区| 亚洲自拍另类| 久久久久久黄| 欧美精品入口| 国产精品美女久久久久aⅴ国产馆| 国产精品一区二区欧美| 伊人天天综合| 一区二区三区毛片| 欧美自拍偷拍| 欧美成人午夜剧场免费观看| 亚洲日韩视频| 午夜精品视频网站| 欧美jizzhd精品欧美喷水| 欧美日韩激情网| 国产一区二区三区最好精华液| 亚洲国产欧美日韩另类综合| 一本一道久久综合狠狠老精东影业| 亚洲欧美国产另类| 欧美成人第一页| 亚洲天堂网在线观看| 久久综合久久综合久久综合| 欧美午夜无遮挡| 精品88久久久久88久久久| 中文亚洲字幕| 欧美va亚洲va香蕉在线| 亚洲小说春色综合另类电影| 久久综合一区| 国产欧美一区二区色老头| 亚洲日本电影在线| 久久精品国产精品| 日韩视频一区| 久久综合网hezyo| 国产精品一区免费视频| 亚洲美女视频在线观看| 久久久久一区二区| 亚洲视频1区2区| 欧美精品v日韩精品v韩国精品v | 久久久一本精品99久久精品66| 欧美日韩在线一区| 在线国产亚洲欧美|