雲計算openstack共享組件——Memcache 緩存系統(4)


一、緩存系統

一、靜態web頁面:
1、在靜態Web程序中,客戶端使用Web瀏覽器(IE、FireFox等)經過網絡(Network)連接到服務器上,使用HTTP協議發起一個請求(Request),告訴服務器我現在需要得到哪個頁面,所有的請求交給Web服務器,之后WEB服務器根據用戶的需要,從文件系統(存放了所有靜態頁面的磁盤)取出內容。之后通過Web服務器返回給客戶端,客戶端接收到內容之后經過瀏覽器渲染解析,得到顯示的效果。
2、為了讓靜態web頁面顯示更加好看,使用javascript/VBScript/ajax(AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML),是指一種創建交互式網頁應用的網頁開發技術。)但是這些特效都是在客戶端上借助於瀏覽器展現給用戶的,所以在服務器上本身並沒有任何的變化。
3、靜態web無法連接數據庫;
4、靜態web資源開發技術:HTML;
5、由於現在的web頁面中,大量使用JS,導致瀏覽器打開頁面,就會占用大量的內存,服務端的壓力是減輕了,但壓力轉移到了客戶端。
 
 
二、動態web頁面:
1、動態WEB中,程序依然使用客戶端和服務端,客戶端依然使用瀏覽器(IE、FireFox等),通過網絡(Network)連接到服務器上,使用HTTP協議發起請求(Request),現在的所有請求都先經過一個WEB Server來處理。
如果客戶端請求的是靜態資源(*.htm或者是*.htm),則將請求直接轉交給WEB服務器,之后WEB服務器從文件系統中取出內容,發送回客戶端瀏覽器進行解析執行。
2、如果客戶端請求的是動態資源(*.jsp、*.asp/*.aspx、*.php),則先將請求轉交給WEB Container(WEB容器),在WEB Container中連接數據庫,從數據庫中取出數據等一系列操作后動態拼湊頁面的展示內容,拼湊頁面的展示內容后,把所有的展示內容交給WEB服務器,之后通過WEB服務器將內容發送回客戶端瀏覽器進行解析執行。

 

在大型海量並發訪問網站及openstack等集群中,對於關系型數據庫,尤其是大型關系型數據庫,如果對其進行每秒上萬次的並發訪問,並且每次訪問都在一個有上億條記錄的數據表中查詢某條記錄時,其效率會非常低,對數據庫而言,這也是無法承受的。

緩沖系統的使用可以很好的解決大型並發數據訪問所帶來的效率低下和數據庫壓力等問題,緩存系統將經常使用的活躍數據存儲在內存中避免了訪問重復數據時,數據庫查詢所帶來的頻繁磁盤i/o和大型關系表查詢時的時間開銷,因此緩存系統幾乎是大型網站的必備功能模塊。

緩存系統可以認為是基於內存的數據庫,相對於后端大型生產數據庫而言基於內存的緩存數據庫能夠提供快速的數據訪問操作,從而提高客戶端的數據請求訪問反饋,並降低后端數據庫的訪問壓力。

二、Memcached概念

Memcached 是一個開源的、高性能的分布式內存對象緩存系統。通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高網站訪問速度,加速動態WEB應用、減輕數據庫負載。

Memcached是一種內存緩存,把經常需要存取的對象或數據緩存在內存中,內存中,緩存的這些數據通過API的方式被存取,數據經過利用HASH之后被存放到位於內存上的HASH表內,HASH表中的數據以key-value的形式存放,由於Memcached沒有實現訪問認證及安全管理控制,因此在面向internet的系統架構中,Memcached服務器通常位於用戶的安全區域。

當Memcached服務器節點的物理內存剩余空間不足,Memcached將使用最近最少使用算法(LRU,LastRecentlyUsed)對最近不活躍的數據進行清理,從而整理出新的內存空間存放需要存儲的數據。

Memcached在解決大規模集群數據緩存的諸多難題上有具有非常明顯的優勢並且還易於進行二次開發,因此越來越多的用戶將其作為集群緩存系統,此外,Memcached開放式的API,使得大多數的程序語言都能使用Memcached,如javac、C/C++C#,Perl、python、PHP、Ruby 各種流行的編程語言。

由於Memcached的諸多優勢,其已經成為眾多開源項目的首選集群緩存系統。如openstacksd的keystone身份認證項目。就會利用Memcached來緩存租戶的Token等身份信息,從而在用戶登陸驗證時無需查詢存儲在MySQL后端數據庫中的用戶信息,這在數據庫高負荷運行下的大型openstack集群中能夠極大地提高用戶的身份驗證過程,在如web管理界面Horizon和對象存儲Swift項目也都會利用Memcached來緩存數據以提高客戶端的訪問請求響應速率。

三、Memcached緩存流程

1. 檢查客戶端請求的數據是否在 Memcache 中,如果存在,直接將請求的數據返回,不在對數據進行任何操作。

2. 如果請求的數據不在 Memcache 中,就去數據庫查詢,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份 Memcache 中

3. 每次更新數據庫的同時更新 Memcache 中的數據庫。確保數據信息一致性。

4.  當分配給 Memcache 內存空間用完后,會使用LRU(least Recently Used ,最近最少使用 ) 策略加到其失效策略,失效的數據首先被替換掉,然后在替換掉最近未使用的數據。

四、Memcached功能特點

1.  協議簡單
     其使用基於文本行的協議,能直接通過 telnet 在Memcached 服務器上存取數據

2.  基於 libevent 的事件處理
     libevent 利用 C 開發的程序庫,它將 BSD 系統的kqueue,Linux 系統的 epoll 等事件處理功能封裝成為一個接口,確保即使服務器端的鏈接數。加也能發揮很好的性能。      Memcached 利用這個庫進行異步事件處理。

3.  內置的內存管理方式
     Memcached 有一套自己管理內存的方式,這套方式非常高效,所有的數據都保存在Memcached內置的內存中,當存入的數據占滿空間時,使用 LRU 算法自動刪除不使用的緩存,即重用過期的內存空間。Memecached 不考慮數據的容災問題,一旦重啟所有數據全部丟失。

4.  節點相互獨立的分布式
     各個 Memecached 服務器之間互不通信,都是獨立的存取數據,不共享任何信息。通過對客戶端的設計,讓 Memcached 具有分布式,能支持海量緩存和大規模應用。

五、使用Memcached應該考慮的因素

1. Memcached服務單點故障
    在Memcached集群系統中每個節點獨立存取數據,彼此不存在數據同步鏡像機制,如果一個Memcached節點故障或者重啟,則該節點緩存在內存的數據全部會丟失,再次訪問時數據再次緩存到該服務器

2. 存儲空間限制
    Memcache緩存系統的數據存儲在內存中,必然會受到尋址空間大小的限制,32為系統可以緩存的數據為2G,64位系統緩存的數據可以是無限的,要看Memcached服務器物理內存足夠大即可

3. 存儲單元限制
    Memcache緩存系統以 key-value 為單元進行數據存儲,能夠存儲的數據key尺寸大小為250字節,能夠存儲的value尺寸大小為1MB,超過這個值不允許存儲

4. 數據碎片
    Memcache緩存系統的內存存儲單元是按照Chunk來分配的,這意味着不可能,所有存儲的value數據大小正好等於一個Chunk的大小,因此必然會造成內存碎片,而浪費存儲空間

5. 利舊算法局限性
    Memcache緩存系統的LRU算法,並不是針對全局空間的存儲數據的,而是針對Slab的,Slab是Memcached中具有同樣大小的多個Chunk集合

6.數據訪問安全性
    Memcache緩存系統的慢慢Memcached服務端並沒有相應的安全認證機制通過,通過非加密的telnet連接即可對Memcached服務器端的數據進行各種操作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM