2010-05-27 33 views
4

如何處理生產應用程序中的替換/添加/刪除memcached節點? 由於每個客戶都需要在同一個網絡服務器上運行,我將擁有許多克隆和定製的應用程序,因此我猜測會有一天某些節點將會更改。Memcached - 如何處理添加/部署服務器

下面介紹如何Memcached是通過正常的填充:

$m = new Memcached(); 

$servers = array(
    array('mem1.domain.com', 11211, 33), 
    array('mem2.domain.com', 11211, 67) 
); 
$m->addServers($servers); 

我最初的想法,是使$服務器陣列從數據庫中,也緩存被填充,但基於文件的,每天進行一次或可以選擇強制執行保存$ addservers調用的函數的下一次運行更新。然而,我猜測,因爲磁盤是相當慢的存儲,這可能增加一些額外的開銷......

你覺得呢?

+0

賞金已開啓!希望能得到一些很好的答案! – Industrial 2010-05-31 17:05:22

+0

工業,我很想知道你的最終解決方案/實施是什麼。 – 2011-04-28 02:36:39

回答

2

在源代碼中定義類似的東西總是更好。當然,你可以使用parse_ini_file()或類似的東西來讀取配置文件。真的,它屬於源頭。但是,如果在INI文件中定義,那麼與在PHP中定義條目相比,並不存在很多安全問題,例如代碼注入等。

因爲有可能被讀取相同的INI文件的幾個應用程序,你可以把它放在一個公共場所,所有的應用程序可以訪問(使用組權限,例如)。其實這並不是真正的建議。

+0

嗨!不過這是一個很好的選擇。我有點擔心更新ini文件的數量與更改數據庫中的某些值以進行全局更改有關,但再次,ini文件也可能是全局的... – Industrial 2010-05-28 09:03:04

+2

不要放置memcache服務器列表進入數據庫!這將需要額外的查詢來獲取它們,這不符合使用memcache數組加速應用程序的邏輯。如果你不想ini,使用純文本文件並用爆炸或任何東西解析它們。 – 2010-05-31 11:06:56

+0

就像你說的那樣,需要一個查詢來獲取它們,但會被存儲在磁盤上的序列化文件中。考慮到緩存數據的TTL類似於60分鐘左右,我不知道這與明文相比是否會有很大的區別。 – Industrial 2010-05-31 17:07:25

1

根據您的要求我會使用支持後,一些TTL(被動模式)自動驅逐列表或某種監聽器模式,如果你想這個被更新立即(主動模式)。只要必要時可以訪問並且TTL足夠大(正如您在評論中提到的那樣),無論您保留主要來源(屬性文件,數據庫等)的位置都不重要。

爲了把你的服務器列表進入緩存下一些已知的關鍵被動的方式,你可以重用使用支持TTL一些其他的本地緩存庫(例如Java中的EHCache)。例如,對於主動方法,Java有java.util.EventListener。幸運的是,我在PHP中做了很多年,所以不能就此提出建議。

我會強烈建議不要將配置數據到代碼中。在世界上,我活着的硬編碼是一個嚴重的罪過。

您可能還想看看how last.fm is using consistent hashing algorithm能夠在不導致完全重新映射所有密鑰的情況下向/從memcached池添加/移除服務器。

+1

php memcached擴展已經實現了一致的哈希算法。 – zerkms 2010-06-03 05:09:52

+0

嗨Mindas。我們已經實現了libketama和一個方法來處理應用程序中的離線服務器,所以基本上,這是關於如何以最少的工作替換所有應用程序的memcached集羣中的節點,並影響應用程序...... – Industrial 2010-06-03 08:55:48

2

使用配置文件 - 無論它從parse_ini_file或其他一些配置解析方案。如果你擔心解析的時候,你可以把這些CONFIGS在PHP INI負載路徑http://brian.moonspot.net/using-ini-files-for-php-application-settings - 這種預解析所有你需要的增值經銷商,但是你需要重啓apache加載任何變化。

一旦文件被讀出足夠(只要你沒有你的機器上太多顛簸)的配置文件會在內存映射緩存無論如何,所以這將是非常快。您可以使用加載速度很快的php序列化表單進行優化,甚至可以通過使用APC用戶緩存進一步優化。

最後,使用最新的內存緩存客戶端庫 - 他們現在使用的一致性哈希算法,它會幫助添加/刪除單個服務器。

+0

使用最新的庫 - 檢查。 APC cache-nope,由於缺陷而無法在我們的服務器上運行。我有點擔心不得不重新啓動apache來替換memcached集羣中的一個節點。它更糟,然後把它全部放在代碼中:) – Industrial 2010-06-03 08:58:05

+0

使用parse_ini_file()讀取配置文件速度非常快,它的速度非常快,以至於緩存它會造成非常小的差異。 – Datageek 2011-12-24 01:39:52

1

據我瞭解,這裏主要關心的是如何緩存配置,使其在更改時保持最新狀態。

那麼,這裏最好的選擇顯然是存儲在數據庫中,並從數據庫中刷新,比如每15秒刷新一次。在應用程序上負擔很重,在15秒內查詢數據庫不會改變任何事情。從數據庫本身加載數據非常快,因爲您只需要幾個字段。

另一個可能在這裏工作的選項 - 使用單獨的memcached :)嚴重的是,只緩存從DB加載的配置,在配置更新時清除緩存鍵。

總結:任何基於時間的到期計劃都可以工作。最簡單的解決方案 - 自行維護(存儲上次刷新時間並在每次函數調用時檢查它);更高級一些 - 使用類似memcached的東西。

更新:DB是最好的解決方案,因爲它可以很好地擴展:每次配置更新時,您不必在20臺服務器上覆制配置。

0
  • 使用服務定位器,如 - https://www.consul.io/。添加或刪除服務,消費者可以實時獲得領事的服務信息。
  • 如果consul在管理一個新的軟件時花費更多的開銷,請將信息移動到集中配置中。在更新時重新加載配置或觸發器更新事件。消費者傾聽事件並更新信息。