PHP擴展Memcache分布式部署方案
基礎環(huán)境
其實基于PHP擴展的Memcache客戶端實際上早已經(jīng)實現(xiàn),而且非常穩(wěn)定。先解釋一些名詞,Memcache是danga.com的一個開源項目,可以類比于MySQL這樣的服務,而PHP擴展的Memcache實際上是連接Memcache的方式。
首先,進行Memcache被安裝具體可查看博客里的其它幾篇文章;
其次,進行PHP擴展的安裝,官方地址是http://pecl.php.net/package/memcache
最后,啟動Memcache服務,比如這樣,通過不同端口啟動多個進程模擬分布式:
/usr/local/bin/memcached -d -p 11213 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11214 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
啟動三個只使用10M內(nèi)存以方便測試。
參數(shù)說明:
-d選項是啟動一個守護進程,
-m 是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB,我這里是512MB,
-u是運行Memcache的用戶,我這里是root,
-l 是監(jiān)聽的服務器IP地址,如果有多個地址的話,我這里指定了服務器的IP地址192.168.0.1,
-p是設置Memcache監(jiān)聽的端口,我 這里設置了11211,最好是1024以上的端口,
-c選項是最大運行的并發(fā)連接數(shù),默認是1024,我這里設置了512,按照你服務器的負載量 來設定,
-P是設置保存Memcache的pid文件,我這里是保存
分布式部署
PHP的PECL擴展中的memcache實際上在2.0.0的版本中就已經(jīng)實現(xiàn)多服務器支持,現(xiàn)在都已經(jīng)2.2.5了。請看如下代碼
$memcache = new Memcache; $memcache->addServer('localhost', 11211); $memcache->addServer('localhost', 11213); $memcache->addServer('localhost', 11214); $memStats = $memcache->getExtendedStats(); print_r($memStats);
通過上例就已經(jīng)實現(xiàn)Memcache的分布式部署,是不是非常簡單。
分布式系統(tǒng)的良性運行
在Memcache的實際使用中,遇到的最嚴重的問題,就是在增減服務器的時候,會導致大范圍的緩存丟失,從而可能會引導數(shù)據(jù)庫的性能瓶頸。測試時可以通過關閉一個memcached進程,來測試數(shù)據(jù)是否存在,實例:
<?php //第一次設置值后再作注釋 $memcache = new Memcache; $memcache->addServer('localhost', 11211); //$memcache->set("mykey", "這個值在11213添加前添加的"); $memcache->addServer('localhost', 11213); if (!$memcache) echo "Connection to memcached failed"; /* $memcache->set("str_key", "String to store in memcached"); $memcache->set("num_key", 123); $object = new StdClass; $object->attribute = 'test'; $memcache->set("obj_key", $object); $array = Array('assoc'=>123, 345, 567); $memcache->set("arr_key", $array); */ var_dump($memcache->get('mykey')); var_dump($memcache->get('str_key')); var_dump($memcache->get('num_key')); var_dump($memcache->get('obj_key')); $memStats = $memcache->getExtendedStats(); var_dump($memStats); ?>
測試時關閉其中一臺,可能會導致數(shù)據(jù)丟失:
string '這個值在11213添加前添加的' (length=35) string 'String to store in memcached' (length=28) boolean false boolean false
為了避免出現(xiàn)這種情況,請先看Consistent hashing算法,中文的介紹可以參考memcached全面剖析--4. memcached的分布式算法,通過存取時選定服務器算法的改變,來實現(xiàn)。
memcached雖然稱為“分布式”緩存服務器,但服務器端并沒有“分布式”功能。
修改PHP的Memcache擴展memcache.c的源代碼中的
"memcache.hash_strategy" = standard
為
"memcache.hash_strategy" = consistent
重新編譯,這時候就是使用Consistent hashing算法來尋找服務器存取數(shù)據(jù)了。
有效測試數(shù)據(jù)表明,使用Consistent hashing可以極大的改善增刪Memcache時緩存大范圍丟失的情況。
NonConsistentHash: 92% of lookups changed after adding a target to the existing 10 NonConsistentHash: 90% of lookups changed after removing 1 of 10 targets ConsistentHash: 6% of lookups changed after adding a target to the existing 10 ConsistentHash: 9% of lookups changed after removing 1 of 10 targets
安全配置
Memcache服務器端都是直接通過客戶端連接后直接操作,沒有任何的驗證過程,這樣如果服務器是直接暴露在互聯(lián)網(wǎng)上的話是比較危險,輕則數(shù)據(jù)泄露被其他無關人員查看,重則服務器被入侵,因為Mecache是以root權限運行的,況且里面可能存在一些我們未知的bug或者是緩沖區(qū)溢出的情況,這些都是我們未知的,所以危險性是可以預見的。
內(nèi)網(wǎng)訪問
最好把兩臺服務器之間的訪問是內(nèi)網(wǎng)形態(tài)的,一般是Web服務器跟Memcache服務器之間。普遍的服務器都是有兩塊網(wǎng)卡,一塊指向互聯(lián)網(wǎng),一塊指向內(nèi)網(wǎng),那么就讓Web服務器通過內(nèi)網(wǎng)的網(wǎng)卡來訪問Memcache服務器,我們Memcache的服務器上啟動的時候就監(jiān)聽內(nèi)網(wǎng)的IP地址和端口,內(nèi)網(wǎng)間的訪問能夠有效阻止其他非法的訪問。
Memcache服務器端設置監(jiān)聽通過內(nèi)網(wǎng)的192.168.0.200的ip的11211端口,占用1024MB內(nèi)存,并且允許最大1024個并發(fā)連接
設置防火墻
防火墻是簡單有效的方式,如果卻是兩臺服務器都是掛在網(wǎng)的,并且需要通過外網(wǎng)IP來訪問Memcache的話,那么可以考慮使用防火墻或者代理程序來過濾非法訪問。 一般我們在Linux下可以使用iptables或者FreeBSD下的ipfw來指定一些規(guī)則防止一些非法的訪問,比如我們可以設置只允許我們的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規(guī)則就是只允許192.168.0.2這臺Web服務器對Memcache服務器的訪問,能夠有效的阻止一些非法訪問,相應的也可以增加一些其他的規(guī)則來加強安全性,這個可以根據(jù)自己的需要來做。
- 基于php使用memcache存儲session的詳解
- PHP中使用memcache存儲session的三種配置方法
- 利用Memcached在php下實現(xiàn)session機制 替換PHP的原生session支持
- php將session放入memcached的設置方法
- 在php中設置session用memcache來存儲的方法總結
- thinkPHP多域名情況下使用memcache方式共享session數(shù)據(jù)的實現(xiàn)方法
- PHP保存session到memcache服務器的方法
- Ubuntu server 11.04安裝memcache及php使用memcache來存儲session的方法
- nginx+apache+mysql+php+memcached+squid搭建集群web環(huán)境
- thinkPHP實現(xiàn)MemCache分布式緩存功能
- PHP實現(xiàn)分布式memcache設置web集群session同步的方法
相關文章
PHP訪問MYSQL數(shù)據(jù)庫封裝類(附函數(shù)說明)
MYSQL 數(shù)據(jù)訪問方式,php4支持以mysql_開頭的過程訪問方式,php5開始支持以mysqli_開頭的過程和mysqli面向?qū)ο笤L問方式,本封裝類以mysql_封裝2010-12-12php通過asort()給關聯(lián)數(shù)組按照值排序的方法
這篇文章主要介紹了php通過asort()給關聯(lián)數(shù)組按照值排序的方法,實例分析了php中asort()函數(shù)的功能與使用技巧,需要的朋友可以參考下2015-03-03PHP mysqli_free_result()與mysqli_fetch_array()函數(shù)詳解
這篇文章主要介紹了PHP mysqli_free_result()與mysqli_fetch_array()函數(shù)詳解的相關資料,需要的朋友可以參考下2016-09-09《Head First 設計模式》代碼之PHP版(面向?qū)ο髮W習)
《Head First 設計模式》是本不錯的講解設計模式的書,不像F4寫的那么枯燥,應該算是比較容易理解的好書。2010-06-06php獲得網(wǎng)站訪問統(tǒng)計信息類Compete API用法實例
這篇文章主要介紹了php獲得網(wǎng)站訪問統(tǒng)計信息類Compete API用法,實例分析了php使用curl獲取Compete統(tǒng)計網(wǎng)站信息的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04