2013-10-28 78 views
4

我的理解是在「一致哈希」模式下使用memcached時,當一個節點關閉時,客戶端將用算法重新映射密鑰。Memcached一致性哈希&網絡分區,如何解決?

考慮我有2個客戶端(A,B)和兩個服務器(C,d)

如果客戶A認爲服務器C是下跌,而B認爲C還活着?

所以A會繼續使用C & D,但B只會用D.如何解決這種情況下產生的數據不一致?

回答

1

您必須確保服務器A和B看到Memcached實例的狀態相同。我認爲可以在代理緩存實例(C & D)隱藏在代理後面(moxitwemproxy)時實現。代理將負責維護memcached實例的狀態。應用程序服務器(A & B)應該只連接到代理服務器。

0

我使用一箇中央「可用性」服務器,它運行自己的memcached守護進程,並提供一個名爲「avail_servers」的密鑰,該密鑰返回所有可用的memcached服務器的數組。這是不斷刷新。

我的web服務器首先連接到這個中央服務器,從中獲取可用服務器的列表,然後用它來存儲/檢索值。您可以編寫一些額外的檢查,以便如果您的「A」服務器仍然將「可用」列表中的服務器視爲關閉,它將停止提供服務,直到問題解決。

+0

好,但這樣做,你已經引入了單點故障。那麼你是如何解決這個問題的? –

+0

你可以使用類似Zookeeper的東西,而不是一個集中的服務器來保持活着的服務器的映射。所有服務器將不得不定期檢查以維持其「租賃」。 – Dimos