大型網站的分散式資料處理與效能的提升 Memory Cache
這篇文章主要說明大型或是數萬人存取的網站,
如何可以在不修改程式架構下就可以達到分散式資料處理並且提升網站效能?
我們主要介紹的就是 Memory Cache,記憶體快取。
為什麼這是大型網站必備的要素、程式設計要注意什麼、佈署的時候要注意什麼才會達到最佳效能?
這些議題就是這篇文章要討論的範圍。
“memcached”
memcached主要用在增加應用系統的存取速度。
傳統應用程式存取資料庫的設計是存取資料庫,資料庫的存取往往會受到isolcation level 的影響,回覆時間比較慢。
因此,我們可以透過 Memory Cached 快取已經存取過的資料,如果資料已經在 memory Cached 中,直接就可以回覆使用者該資訊。
透過記憶體快取伺服器的資料存取,可以大幅減少對資料庫的存取與資料庫伺服器的CPU/Access等。
因此memcached非常適合在 Read-Intensive的應用程式!
Memcached對於Write-intensive應用程式來說,其實不會有大多的幫助。
另外,可以利用”memcached”建立起多台快取記憶體伺服器群組,未來的延展性,也只要增加快取記憶體伺服器即可。不需要增加資料庫伺服器。
如下圖所示:
使用 memCached的情況
1. 請問資料是否有在快取記憶體伺服器中? 如果有,直接讀取快取記憶體的資料
2. 如果沒有,讀取資料庫資料,並且將該資料寫一份到快取記憶體
[pastacode lang=”java” message=”” highlight=”” provider=”manual”]
function get_foo(int userid) {
/* first try the cache */
data = memcached_fetch("userrow:" + userid);
if (!data) {
/* not found : request database */
data = db_select("SELECT * FROM users WHERE userid = ?", userid);
/* then store in cache until next get */
memcached_add("userrow:" + userid, data);
}
return data;
}
[/pastacode]
keyword/value pair
Memory Cached 使用 Key/Value pair 的方式來儲存資料。
除了下列情況外,資料會被儲存在 Memory Cache 中。
1.記憶體不足。這時候memcached會使用 uses a least-recently used (LRU),將最不常用到的資料從記憶體先移除。
2. 程式指定要移除
3.該資料時間過期
是否要從記憶體移除可以根據應用程式使用需求決定
規劃哪些資料要存放到快取記憶體時,可以思考
- Key /Value 如何定義。通常會用 Hash value 來定義一組 Key 對應到相對應的 Data/value
- (註: 如果是使用 Java。可以利用 HashMap,而不要用 HashTable。因為HashMap 沒有 Syncrnonized,就讀取資料來說效能會更好)
- 哪些資料要 Cache並且可以讓未來應用程式存取,哪些資料不需要 Cache
Memory Cached由於支援的語言廣泛安裝容易,所以成為大型網站或是分散式處理的必備
Memory Cached掛掉怎麼辦?
因為Memory Cached的定位是快取記憶體,所以
1. 當沒有快取記憶體時,應用程式應該還是要可以正常的存取資料庫,而不受到影響。
2. 當快取伺服器恢復正常上線時,應用程式又可以自動存取快取記憶體。
將快取記憶體伺服器分散式處理
當要佈署多台快取記憶體伺服器的時候,必須要做到”分散式”的資料處理,才可以發揮快取記憶體伺服器分散負擔
我們相看看幾種錯誤的佈署:
這樣的佈署方式也表示應用程式只能夠有 1G的快取記憶體,未來沒有辦法擴充
錯誤佈署
正確的佈署方式
這樣的佈署方式可以讓前端每組應用程式能夠有 3共享的快取記憶體,
未來如果不夠用還可以擴充快取記憶體。
這邊有個技術上的問題要解決,
就是如何將應用程式的資料平均分佈到各個快取記憶體伺服器? 做到 Load Balancing?
簡單一點的作法是可以將該 Hash Value 取餘數,例如三台快取記憶體伺服器就取3的餘數,
來決定資料要存放在哪一台快取記憶體伺服器
(圖檔引用IBM技術文件)
Memcached的限制
- MemCached 並不是資料庫!!也不是永久性儲存資料的用途。儲存資料還是要回到資料庫本身。
- MemCached 主要的目的還是”快取”,讓資料讀取的時間縮短、更有效率、避免增加資料庫讀取的負擔。
- MemCached本身並沒有太多的安全性設計。還是要回歸到應用程式本身。MemCached僅僅提供資料的快取。
- MemCached每一筆Key/Value資料最大只能夠存放1MB.
- MemCached目前只能夠在 Unix/Linux執行