2010-05-22 33 views
1

我想解決一個很好的方法來處理當前使用PHP構建的Web應用程序中的離線/向下memcached服務器。Memcache故障轉移和一致性散列

我剛剛發現這個鏈接,顯示對如何做我想做的做法,我認爲:http://web.archive.org/web/20090421075021/http://cmunezero.com/2008/08/11/consistent-memcache-hashing-and-failover-with-php/

總之,它讓我感到困惑,當我開始使用它,並閱讀與內存緩存故障PHP的機制的文檔。爲什麼離線memcache服務器與在線服務器一起添加到$realInstance服務器池中?

讀取內存緩存文件混淆我更: http://www.php.net/manual/en/memcache.addserver.php

狀態

控制服務器是否應被標記爲聯機。將此 參數設置爲FALSE並將retry_interval 設置爲-1允許保留在池中的故障服務器爲 ,以免影響 密鑰分配算法。 請求這臺服務器然後將 故障轉移或立即失敗,取決於 上的memcache.allow_failover 設置。默認爲TRUE,這意味着 服務器應該被視爲聯機。

感謝,

回答

4

基本上,memcache的方式分佈式存儲的作品,是你告訴它的所有服務器。然後,當你要求一個密鑰(要存儲或提取)時,它會創建該密鑰的散列。然後,該散列通過一個算法來確定池中哪個服務器應該去(這全部在客戶端完成)。如果您從池中刪除脫機服務器,那麼散列計算將會不同,並且您的整個商店可能會受到影響(數據仍然存在,但您可能無法訪問它)。

狀態標誌可讓您在相當大的應用程序中處理服務器故障(不僅僅是發生的故障)。所以,你可以做的是爲你的應用程序提供一個配置文件,列出所有服務器及其狀態。然後,如果您需要將其中一臺服務器脫機幾分鐘(或幾小時),則可以將該服務器的狀態標誌設置爲false。這樣,php不會嘗試去尋找它(並且超時),但哈希映射將保持不變(因此其他所有內容仍然可以訪問)。

有意義嗎?

+0

嗨!非常感謝您的回答! – Industrial 2010-05-22 17:56:00

+0

@ircmaxell因此,如果池中有2臺服務器,並且有一臺服務器脫機,那麼請求仍然會對脫機服務器發出請求?沒有其他方法可以從memcache中刪除脫機服務器? – 2012-08-02 13:51:34

+1

@Sonesh:您需要將其從池中刪除。但要小心,只要你改變池,緩存哈希映射就會改變(基本上是緩存刷新)... – ircmaxell 2012-08-02 13:55:23