Memcache基礎

Memcache是什麼

Memcached是一個自由開源的,高性能,分佈式內存對象緩存系統。php

本質上,它是一個簡潔的 key-value 存儲系統。它能夠應對任意多個鏈接,使用非阻塞的網絡IO。因爲它的工做機制是在內存中開闢一塊空間,而後創建一個HashTable,Memcached自管理這些HashTable。html

Memcache官方網站:http://www.danga.com/memcached,更多詳細的信息能夠來這裏瞭解 :)java

(圖片來源:菜鳥教程)node

爲何會有Memcache和memcached兩種名稱?mysql

Memcache是該系統的項目名稱,Memcached是該系統的主程序文件(字母d能夠理解爲daemon),以守護程序方式運行於一個或多個服務器中,隨時接受客戶端的鏈接操做,使用共享內存存取數據。linux

基本命令算法

存儲命令:set、add、replace、append、prepend、CAS(Check-And-Set 或 Compare-And-Swap)sql

查找命令:get、gets、delete、incr/decr數據庫

統計命令:stats、flush_all 等api

 

Memcache的安裝
分爲兩個過程:memcache服務器端的安裝和memcached客戶端的安裝。
所謂服務器端的安裝就是在服務器(通常都是linux系統)上安裝Memcache實現數據的存儲
所謂客戶端的安裝就是指php(或者其餘程序,Memcache還有其餘不錯的api接口提供)去使用服務器端的Memcache提供的函數,須要php添加擴展。

 

 

Java 鏈接 Memcached 服務

 

 

Memcache 分佈式應用

memcached雖然稱爲「分佈式」緩存服務器,但服務器端並無「分佈式」功能。memcached的分佈式,徹底由客戶端程序庫實現的。這種分佈式是memcached的最大特色。
將不一樣的鍵保存到不一樣的服務器上,就實現了memcached 的分佈式。 memcached 服務器增多後,鍵就會分散,即便一臺memcached服務器發生故障沒法鏈接,也不會影響其餘的緩存,系統依然能繼續運行。
Memcached的分佈式方法
(1)根據餘數計算分佈  Hash() mod n
根據服務器臺數的餘數進行分散。求得鍵的整數哈希值,再除以服務器臺數,根據其他數來選擇服務器。
缺點:
餘數計算的方法簡單,數據的分散性也至關優秀,但也有其缺點。那就是當添加或移除服務器時,緩存重組的代價至關巨大。添加服務器後,餘數就會產生鉅變,這樣就 沒法獲取與保存時相同的服務器 ,從而影響緩存的命中率。
(2)一致性哈希算法 
把每臺server分紅v個虛擬節點,再把全部虛擬節點(n*v)隨機分配到一致性哈希的圓環上,這樣全部的用戶從本身圓環上的位置順時針往下取到第一個vnode就是本身所屬節點。當此節點存在故障時,再順時針取下一個做爲替代節點。 
從上圖的狀態中添加一臺memcached服務器。餘數分佈式算法因爲保存鍵的服務器會發生巨大變化而影響緩存的命中率,但Consistent Hashing中,只有在continuum上增長服務器的地點逆時針方向的第一臺服務器上的鍵會受到影響。 
更多關於一致性哈希算法,參看《一致性 hash 算法( consistent hashing )》
 
Memcached 與數據庫同步
Mysql經過觸發器把表數據更改自動同步到memcached,並且能夠實現對mysql表原有數據進行初始化到memcached下.

Memcache的安全
咱們上面的Memcache服務器端都是直接經過客戶端鏈接後直接操做,沒有任何的驗證過程,這樣若是服務器是直接暴露在互聯網上的話是比較危險,輕則數據泄露被其餘無關人員查看,重則服務器被入侵,由於Mecache是以root權限運行的,何況裏面可能存在一些咱們未知的bug或者是緩衝區溢出的狀況,這些都是咱們未知的,因此危險性是能夠預見的。爲了安全起見,我作兩點建議,可以稍微的防止黑客的入侵或者數據的泄露。

內網訪問
最好把兩臺服務器之間的訪問是內網形態的,通常是Web服務器跟Memcache服務器之間。廣泛的服務器都是有兩塊網卡,一塊指向互聯網,一塊指向內網,那麼就讓Web服務器經過內網的網卡來訪問Memcache服務器,咱們Memcache的服務器上啓動的時候就監聽內網的IP地址和端口,內網間的訪問可以有效阻止其餘非法的訪問。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache服務器端設置監聽經過內網的192.168.0.200的ip的11211端口,佔用1024MB內存,而且容許最大1024個併發鏈接

 

設置防火牆
防火牆是簡單有效的方式,若是倒是兩臺服務器都是掛在網的,而且須要經過外網IP來訪問Memcache的話,那麼能夠考慮使用防火牆或者代理程序來過濾非法訪問。
通常咱們在Linux下可使用iptables或者FreeBSD下的ipfw來指定一些規則防止一些非法的訪問,好比咱們能夠設置只容許咱們的Web服務器來訪問咱們Memcache服務器,同時阻止其餘的訪問。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT
上面的iptables規則就是隻容許192.168.0.2這臺Web服務器對Memcache服務器的訪問,可以有效的阻止一些非法訪問,相應的也能夠增長一些其餘的規則來增強安全性,這個能夠根據本身的須要來作。

 

本文章是整理收集而來,主要來源是:http://blog.csdn.net/heiyeshuwu/archive/2006/11/13/1380838.aspx

 

 

 

 

Reference:



相關文章
相關標籤/搜索