<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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


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

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

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

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

       我們舉了幾個例子來說明memcached的應用場景,似乎都局限于小數據服務,那是不是就不能用于較大數據的緩沖了?那絕不是,memcached能夠 用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等等,而且生產環境中就這么跑過,只不過讓大數據量使用緩沖的話,有點太浪費了,同樣 數量的內存存不了幾條數據,所以會明顯的降低命中率。

    待續...




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


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

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一区二区三区免费视频观看| 久久国产高潮流白浆免费观看 | 日韩成人免费在线| 一个人看的www免费高清| 99久久亚洲综合精品成人网| 久久精品网站免费观看| 免费人成动漫在线播放r18| 亚洲第一中文字幕| 国产免费牲交视频| 91精品国产免费久久国语麻豆| 亚洲精品国产精品| 亚洲av激情无码专区在线播放| 我想看一级毛片免费的| 99在线视频免费观看| 国产亚洲中文日本不卡二区| 国产午夜亚洲精品理论片不卡| 免费人成网站在线观看10分钟| 一级片在线免费看| 亚洲乱码无人区卡1卡2卡3| 亚洲成AV人片一区二区密柚| 日韩a在线观看免费观看| 少妇太爽了在线观看免费视频| 精品特级一级毛片免费观看| 亚洲精品免费在线视频| 自拍偷自拍亚洲精品被多人伦好爽| 成年女性特黄午夜视频免费看| a级黄色毛片免费播放视频| WWW亚洲色大成网络.COM| 亚洲最大中文字幕| 亚洲成A∨人片在线观看不卡| 又粗又硬又黄又爽的免费视频 | 亚洲色偷偷综合亚洲AV伊人| 青春禁区视频在线观看直播免费| a在线观看免费网址大全| 香蕉视频免费在线播放| 亚洲国产日韩综合久久精品| 亚洲视频免费在线播放| 亚洲国产精品VA在线看黑人| 亚洲综合久久夜AV | 国产成人免费A在线视频| 成人免费无码大片a毛片|