程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> memcached在大負載高並發網站上的應用(一)---簡介

memcached在大負載高並發網站上的應用(一)---簡介

編輯:關於JAVA

大家可能對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位系統上。

本文出自 “網站架構之家” 博客,請務必保留此出處http://wangzebin.blog.51cto.com/653300/128235

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved