posts - 262,  comments - 221,  trackbacks - 0
          轉(zhuǎn)自:http://wangzebin.blog.51cto.com/653300/128235 原文作者:王澤賓


          大家可能對(duì)memcached這種產(chǎn)品早有了解,或者已經(jīng)應(yīng)用在自己的網(wǎng)站中了,但是也有一些朋友從來(lái)都沒(méi)有聽(tīng)說(shuō)過(guò)或者使用過(guò)。
          這都沒(méi)什么關(guān)系,本文旨在從各個(gè)角度綜合的介紹這種產(chǎn)品,盡量深入淺出,如果能對(duì)您現(xiàn)在或以后的工作有所幫助,筆者將感到無(wú)比榮幸。
          我要介紹的內(nèi)容包括以下幾個(gè)方面:
          1、memcached的簡(jiǎn)介
          2、memcached的應(yīng)用場(chǎng)景
          3、memcached的安裝
          4、memcached的使用
          5、memcached的部署架構(gòu)
          6、memcached的局限性
          7、memcached的改進(jìn)
           
          一、簡(jiǎn)介
            1.1 背景
              memcached是一個(gè)高性能、分布式的內(nèi)存對(duì)象緩存系統(tǒng)。
              memcached廣泛應(yīng)用在大負(fù)載高并發(fā)的網(wǎng)站上,是一種非常成熟的產(chǎn)品(稱為一項(xiàng)技術(shù)也未嘗不可)。像 facebook,youtube,yahoo,sina,sohu,netease,豆瓣等網(wǎng)站均或多或少使用了該項(xiàng)產(chǎn)品。memcached在以用戶 為中心的網(wǎng)站上,表現(xiàn)尤其突出,例如sns,blog等web2.0應(yīng)用的站點(diǎn)。這些站點(diǎn)一般來(lái)講,特別注重用戶體驗(yàn),用戶對(duì)服務(wù)器的響應(yīng)速度要求很高, 用戶數(shù)據(jù)相對(duì)比較復(fù)雜、關(guān)連度比較高,需要經(jīng)常對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新和檢索。
              memcache是danga.com幾個(gè)開(kāi)源項(xiàng)目中的一個(gè),最初是專門為livejournal.com站點(diǎn)而開(kāi)發(fā)的,當(dāng)時(shí)這個(gè)站點(diǎn)日pv達(dá)到了千萬(wàn) 級(jí),在使用過(guò)程中出現(xiàn)了很多的與負(fù)載和響應(yīng)速度相關(guān)的問(wèn)題,于是開(kāi)發(fā)了這個(gè)項(xiàng)目,旨在改善網(wǎng)站當(dāng)時(shí)的困境。memcache可以應(yīng)對(duì)任意多個(gè)連接,使用非 阻塞的網(wǎng)絡(luò)IO。它的使用非常簡(jiǎn)單和方便,最常用的功能不超過(guò)5個(gè)方法。
          memcache官方網(wǎng)站:http://www.danga.com/memcached。
            1.2 特點(diǎn)
              1、高性能
               無(wú)論哪一種數(shù)據(jù)庫(kù)dbms(mysql,oracle,mssql,db2,Postgres等等),再怎么優(yōu)化,最終也避不開(kāi)與慢速的存儲(chǔ)介質(zhì)(硬盤、 磁帶)進(jìn)行數(shù)據(jù)交換,但往往一旦涉及到了存儲(chǔ)介質(zhì)的io操作,存取性能就會(huì)急劇下降。memcached,顧名思義,它的全部操作自始至終都是在內(nèi)存中進(jìn) 行的,所以存取數(shù)據(jù)的效率非常高。
               當(dāng)然,通常情況下,大型網(wǎng)站對(duì)于數(shù)據(jù)庫(kù)的操作都會(huì)做優(yōu)化。通常的手段有兩種:
               a、讀寫數(shù)據(jù)分離,采用主/輔庫(kù)的方式,來(lái)分散數(shù)據(jù)庫(kù)的壓力,提高查詢速度。
               b、按照業(yè)務(wù)特點(diǎn)橫向或者縱向分割數(shù)據(jù)庫(kù)。簡(jiǎn)單來(lái)講,就是大庫(kù)變小庫(kù),大表變小表,來(lái)提高數(shù)據(jù)庫(kù)訪問(wèn)的效率。一般來(lái)講,一個(gè)數(shù)據(jù)庫(kù)具有很多表或者一張表有 N多的記錄,都會(huì)明顯的降低數(shù)據(jù)庫(kù)的服務(wù)能力,比如mysql數(shù)據(jù)庫(kù)單表記錄達(dá)到2000萬(wàn)條左右(筆者以前的工作經(jīng)驗(yàn)),性能會(huì)下降到幾乎無(wú)法忍受。關(guān) 于數(shù)據(jù)庫(kù)的設(shè)計(jì)和優(yōu)化,我們以后可以單獨(dú)做一個(gè)專題,這里不做太多的研究。
               數(shù)據(jù)庫(kù)會(huì)在以下情況下會(huì)出現(xiàn)訪問(wèn)瓶頸:
               a、事務(wù)操作
               企業(yè)級(jí)的數(shù)據(jù)庫(kù)(比如mysql的innodb模式)都支持事務(wù)操作。由于事務(wù)具有原子性,事務(wù)中涉及的數(shù)據(jù)表在運(yùn)行過(guò)程中將會(huì)加鎖。在這種情況下,訪問(wèn)這些表的數(shù)據(jù)會(huì)出現(xiàn)延遲。
               b、數(shù)據(jù)更新
               數(shù)據(jù)庫(kù)中任何的表在數(shù)據(jù)更新過(guò)程中,同樣會(huì)被加鎖。在這種情況下,也會(huì)出現(xiàn)上面同樣的結(jié)果。
               memcached的操作基本上就不會(huì)存在以上情況(實(shí)際上也有加鎖的情況,在后面再詳細(xì)探討),所以它的性能非常高。官方網(wǎng)站上對(duì)它的正式評(píng)價(jià)是very fast。事實(shí)上也是如此,相關(guān)的實(shí)驗(yàn)室測(cè)試對(duì)比結(jié)果,大家可以到網(wǎng)上搜索一下,比比皆是。
           
              2、分布式
              所謂分布式系統(tǒng)比較專業(yè)的解釋是:
              一種計(jì)算機(jī)硬件的配置方式和相應(yīng)的功能配置方式。它是一種多處理器的計(jì)算機(jī)系統(tǒng),各處理器通過(guò)互連網(wǎng)絡(luò)構(gòu)成統(tǒng)一的系統(tǒng)。系統(tǒng)采用分布式計(jì)算結(jié)構(gòu),即把原來(lái) 系統(tǒng)內(nèi)中央處理器處理的任務(wù)分散給相應(yīng)的處理器,實(shí)現(xiàn)不同功能的各個(gè)處理器相互協(xié)調(diào),共享系統(tǒng)的外設(shè)與軟件。這樣就加快了系統(tǒng)的處理速度,簡(jiǎn)化了主機(jī)的邏 輯結(jié)構(gòu)。
          memcache的分布式特性主要表現(xiàn)在兩個(gè)方面:
          a.memcache客戶端mc和服務(wù)器端ms可以單獨(dú)安裝在任何獨(dú)立server上。
            當(dāng)然部署在同一臺(tái)server上也沒(méi)問(wèn)題,甚至于一臺(tái)機(jī)器上可以部署n個(gè)memcached。
          b.memcache服務(wù)器端ms可以安裝在任意數(shù)量的server上,提供并行存儲(chǔ)和計(jì)算的能力。
            這是分布式特性的本質(zhì)體現(xiàn)。ms可以形成任意多臺(tái)server組成的集群,為mc提供服務(wù)。

            1.3 用途
              1、提高系統(tǒng)的并發(fā)能力
              2、減輕數(shù)據(jù)庫(kù)的負(fù)擔(dān)
              這兩種用途其實(shí)非常容易理解。由于memcached高性能,所以可以同時(shí)服務(wù)于更多的連接,大大提高了系統(tǒng)的并發(fā)處理的能力。另外,memcached 通常部署在業(yè)務(wù)邏輯層(前臺(tái)應(yīng)用)和存儲(chǔ)層(主指數(shù)據(jù)庫(kù))之間,作為數(shù)據(jù)庫(kù)和前臺(tái)應(yīng)用的數(shù)據(jù)緩沖,因此可以快速的響應(yīng)前端的請(qǐng)求,減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。
              以下是一個(gè)memcached部署的邏輯示意圖,其中mc是指memcached client,ms是指memcached server:
           
           
           
            1.4 工作機(jī)制
              Memcached 是以守護(hù)程序方式運(yùn)行于一個(gè)或多個(gè)服務(wù)器中,隨時(shí)接受客戶端的連接操作,客戶端可以由各種語(yǔ)言編寫,目前已知的客戶端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等??蛻舳耸紫扰c Memcached 服務(wù)建立連接,然后存取對(duì)象。每個(gè)被存取的對(duì)象都有一個(gè)唯一的標(biāo)識(shí)符 key,存取操作均通過(guò)這個(gè) key 進(jìn)行,保存的時(shí)候還可以設(shè)置有效期。保存在 Memcached 中的對(duì)象實(shí)際上是放置在內(nèi)存中的,而不是在硬盤上。Memcached 進(jìn)程運(yùn)行之后,會(huì)預(yù)申請(qǐng)一塊較大的內(nèi)存空間,自己進(jìn)行管理,用完之后再申請(qǐng)一塊,而不是每次需要的時(shí)候去向操作系統(tǒng)申請(qǐng)。Memcached將對(duì)象保存在 一個(gè)巨大的Hash表中,它還使用NewHash算法來(lái)管理Hash表,從而獲得進(jìn)一步的性能提升。所以當(dāng)分配給Memcached的內(nèi)存足夠大的時(shí)候, Memcached的時(shí)間消耗基本上只是網(wǎng)絡(luò)Socket連接了。
              Memcached按照LRU方式調(diào)度數(shù)據(jù)。LRU是Least Recently Used的縮寫,即最近最少使用頁(yè)面置換算法,是為虛擬頁(yè)式存儲(chǔ)管理服務(wù)的。LRU算法在實(shí)際的工作環(huán)境中會(huì)與操作系統(tǒng)相關(guān),比如32位的操作系統(tǒng),最大 的尋址空間是4G,如果當(dāng)前內(nèi)存的使用超過(guò)了這個(gè)限度,將被調(diào)出內(nèi)存,內(nèi)存中總維持最新最常用的數(shù)據(jù)。64位操作系統(tǒng)大大擴(kuò)展了內(nèi)存的尋址能力,所以現(xiàn)在 很memcached服務(wù)都是運(yùn)行在64位系統(tǒng)上。

          寫這篇文章之前,我也特意跟以前的同事做了一些交流,在此感謝sina xiangdong、kingsoft zhangyan和yahoo luke。另外,還有網(wǎng)上的朋友對(duì)我上一節(jié)的文章發(fā)表了許多有建設(shè)性評(píng)論,在這里一并感謝。
             
             memcached最吸引人的地方主要在于它的分布式。分布式對(duì)于互聯(lián)網(wǎng)應(yīng)用來(lái)講,按照用途基本上可劃分為三種方式:分布式計(jì)算、分布式存儲(chǔ)和兩者兼而有 之。memcached是分布式存儲(chǔ)的一種。我們常見(jiàn)的分布式存儲(chǔ)大多數(shù)是將N臺(tái)設(shè)備(server或者單獨(dú)的存儲(chǔ))構(gòu)建成盤陣,而memcached旨 在構(gòu)建一個(gè)高速的內(nèi)存池。更通俗一點(diǎn)來(lái)講:分布式計(jì)算是將N顆cpu組裝成一顆cpu,分布式慢速存儲(chǔ)是將N個(gè)硬盤組裝成一個(gè)大硬盤,memcached 是將N塊內(nèi)存組裝成一塊大內(nèi)存。
            
              有個(gè)朋友問(wèn):那是不是代價(jià)很昂貴啊。我的回答是肯定的。如果你的網(wǎng)站規(guī)模只有三兩臺(tái)服務(wù)器的話,我覺(jué)得你就不用考慮這樣的方案了,等你的網(wǎng)站做大了以后, 再參考這方面的資料即可。一般都是比較大的互聯(lián)網(wǎng)公司為了追求更好的用戶體驗(yàn),才進(jìn)行這方面的投資,對(duì)他們來(lái)講,用戶體驗(yàn)至上,money是小case。
          還有朋友問(wèn):有一些dbms提供內(nèi)存表的功能,比如mysql的內(nèi)存表,可以代替memcached。但我要建議你的是:mysql的內(nèi)存表確實(shí)起到同樣的作用,但它的局限也很多,往往不能讓你隨心所欲,所以建議你不要走彎路。

          二、memcached的應(yīng)用場(chǎng)景
          2.1 應(yīng)用范圍
              memcached產(chǎn)品或相關(guān)技術(shù)的應(yīng)用,我們?cè)谇懊嬉呀?jīng)提到了一些。其實(shí)它的應(yīng)用還是非常普遍的,應(yīng)用作為廣泛的領(lǐng)域:例如sns類網(wǎng)站、blog類網(wǎng)站、bbs類網(wǎng)站以及im后臺(tái)服務(wù)。
           
          2.2 sns類網(wǎng)站的應(yīng)用
              livejournal.com是99年始于校園中的項(xiàng)目,有點(diǎn)像中國(guó)的校內(nèi)網(wǎng)。幾個(gè)學(xué)生純屬出于愛(ài)好做了這樣一個(gè)網(wǎng)站,主要實(shí)現(xiàn)以下功能: sns、blog、bbs和rss等。livejournal從建立開(kāi)始就采用了大量的開(kāi)源軟件,到現(xiàn)在它本身也衍生了不少開(kāi)源軟件。 sns網(wǎng)站,現(xiàn)在比比皆是,規(guī)模比較大的象開(kāi)心、校內(nèi)、51,它們的頁(yè)面上往往需要引用大量的用戶信息、好友信息以及文章信息等,所以跨表或跨庫(kù)操作會(huì)相 當(dāng)多。如果這些功能全部直接操作數(shù)據(jù)庫(kù),顯然會(huì)帶來(lái)極大的效率損耗和系統(tǒng)負(fù)載。memcached在這樣的場(chǎng)景下就會(huì)發(fā)揮巨大的作用,它采用大內(nèi)存把這些 不變的數(shù)據(jù)全都緩存起來(lái),當(dāng)數(shù)據(jù)修改時(shí)就通知cache過(guò)期,這樣應(yīng)用層基本上就可以解決大部分問(wèn)題了,只有很小一部分請(qǐng)求穿透應(yīng)用層,用到數(shù)據(jù)庫(kù)。
           
          2.3 blog、bbs類網(wǎng)站的應(yīng)用
             象blog.sina.com.cn這些流量巨大的blog系統(tǒng),它需要頻繁讀寫的一些小數(shù)據(jù)。其中最典型的應(yīng)用,我們通常成為“數(shù)字類服務(wù)”,比如 blog中需要實(shí)時(shí)顯示的用戶點(diǎn)擊數(shù)和閱讀數(shù),bbs中需要記錄的在線人數(shù)、在線用戶等。這些小數(shù)據(jù)的處理非常繁瑣,你無(wú)論怎么去設(shè)計(jì)數(shù)據(jù)庫(kù),都很難避開(kāi) 跨表或者跨庫(kù)。有的朋友會(huì)說(shuō),可以在數(shù)據(jù)庫(kù)中增加冗余字段解決這類問(wèn)題,但事實(shí)上,這既不符合數(shù)據(jù)庫(kù)設(shè)計(jì)的范式規(guī)則,也很難做到數(shù)據(jù)的一致性,由此會(huì)引發(fā) 更為復(fù)雜的問(wèn)題。而且由于產(chǎn)品線的分散發(fā)展,數(shù)據(jù)已經(jīng)很難做到完全的統(tǒng)一規(guī)劃。memcached在這樣的場(chǎng)景下就會(huì)將這些小數(shù)據(jù)進(jìn)行緩存,定期持久化就 可以了,查詢操作一直都在內(nèi)存中運(yùn)行。說(shuō)到這里,有的朋友又會(huì)想到一些其它的問(wèn)題:“memcached server宕機(jī)了怎么辦,怎么保證與數(shù)據(jù)庫(kù)的數(shù)據(jù)一致”。我會(huì)對(duì)你說(shuō):“你的問(wèn)題非常好,我們將會(huì)在后面章節(jié)給出相應(yīng)的解決方案”。另外,其實(shí)這種小數(shù) 據(jù)并不是關(guān)鍵性數(shù)據(jù),即使偶爾發(fā)生點(diǎn)錯(cuò)誤,也沒(méi)太大的問(wèn)題。blog、bbs系統(tǒng)并不是嚴(yán)格的企業(yè)級(jí)系統(tǒng),假如你是為銀行業(yè)務(wù)提供解決方案的 話,memcached并不適合。
          2.4 im server的應(yīng)用
             前些時(shí)間, 有一些文章介紹memcached 在Jabber上應(yīng)用。寫累了,喝口水,讀者自己去找找資料吧,有時(shí)間的話,幫我補(bǔ)上吧,呵呵。

             我們舉了幾個(gè)例子來(lái)說(shuō)明memcached的應(yīng)用場(chǎng)景,似乎都局限于小數(shù)據(jù)服務(wù),那是不是就不能用于較大數(shù)據(jù)的緩沖了?那絕不是,memcached能夠 用來(lái)存儲(chǔ)各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫(kù)檢索的結(jié)果等等,而且生產(chǎn)環(huán)境中就這么跑過(guò),只不過(guò)讓大數(shù)據(jù)量使用緩沖的話,有點(diǎn)太浪費(fèi)了,同樣 數(shù)量的內(nèi)存存不了幾條數(shù)據(jù),所以會(huì)明顯的降低命中率。

          待續(xù)...




          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2010-04-08 01:08 Paul Lin 閱讀(4306) 評(píng)論(6)  編輯  收藏 所屬分類: 架構(gòu)與性能


          FeedBack:
          # re: 【轉(zhuǎn)】memcached在大負(fù)載高并發(fā)網(wǎng)站上的應(yīng)用
          2010-04-08 12:31 | 稅國(guó)政
          好文章, 幫頂下?。?!  回復(fù)  更多評(píng)論
            
          # re: 【轉(zhuǎn)】memcached在大負(fù)載高并發(fā)網(wǎng)站上的應(yīng)用
          2010-04-13 08:55 | 夢(mèng)源
          不錯(cuò)  回復(fù)  更多評(píng)論
            
          # re: 【轉(zhuǎn)】memcached在大負(fù)載高并發(fā)網(wǎng)站上的應(yīng)用
          2010-04-15 14:10 | 史前大草莓
          好文章   回復(fù)  更多評(píng)論
            
          # re: 【轉(zhuǎn)】memcached在大負(fù)載高并發(fā)網(wǎng)站上的應(yīng)用
          2010-11-17 23:21 | gad
          ,唉,新手,沒(méi)接觸過(guò)大用戶量的情況,找工作很多問(wèn)這方面的。  回復(fù)  更多評(píng)論
            
          # re: 【轉(zhuǎn)】memcached在大負(fù)載高并發(fā)網(wǎng)站上的應(yīng)用
          2010-12-17 18:32 | dengyuanyuan
          good article   回復(fù)  更多評(píng)論
            
          # re: 【轉(zhuǎn)】memcached在大負(fù)載高并發(fā)網(wǎng)站上的應(yīng)用[未登錄](méi)
          2011-12-28 17:28 | king
          謝謝了,不過(guò)有一點(diǎn)我想指正一下不然不感覺(jué)有點(diǎn)誤導(dǎo)大家,你說(shuō)的mysql 單表2000w條記錄查詢無(wú)法忍受,實(shí)際上mysql只要索引利用的好2000W條記錄做查找可以在0.0幾秒的數(shù)量級(jí)的。  回復(fù)  更多評(píng)論
            
          <2010年4月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點(diǎn)博客

          好友博客

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 建始县| 夏邑县| 疏附县| 永善县| 华池县| 巫溪县| 灌南县| 延边| 浮梁县| 安多县| 高邮市| 铜川市| 伊春市| 上思县| 邯郸县| 常州市| 怀化市| 务川| 淮阳县| 镇康县| 顺义区| 望奎县| 郧西县| 南城县| 衡山县| 武隆县| 遂昌县| 盐城市| 山东| 江华| 炎陵县| 平潭县| 乌苏市| 汕尾市| 和龙市| 永济市| 德昌县| 富裕县| 平度市| 锦屏县| 新巴尔虎左旗|