簡體   English   中英

PHP memcached 如何確定集群中的哪個節點存儲密鑰?

[英]How does PHP memcached determine which node in a cluster to store a key on?

我有一些數據要存儲在 memcached 中(使用 PHP libmemcached 客戶端: https://www.php.net/manual/en/intro.memcached.ZE1BFD762.621E4093CEE4AC0841 這是在我的 web 應用程序中非常頻繁發生的事情。

為了減少單個memcached節點的流量我append一個1到10之間的隨機數以key結尾,希望客戶端不會把所有的key都存儲在單個節點上。

我曾假設分配密鑰的過程是隨機的,但在 15 個節點中,至少有一半的密鑰流向了同一個節點。 這讓我認為它如何決定將哪個節點用於給定密鑰有一些更具確定性的東西。

有誰知道它是怎么做的?

它使用 hash。 以最簡單的形式,想象一下如果您在密鑰上運行 hash function (如 MD5),您可以使用第一個字節來確定它應該從 Z34D1F91FB2E514B8576ZB1A75A89A 到哪個服務器。

這很重要,因為如果 2 台服務器與多個 memcached 服務器通信,它們需要為相同的密鑰確保所有 select 相同服務器的可靠性。 隨機會很糟糕,因為這意味着客戶端可能會嘗試從存儲項目的不同服務器get()

如果您有 15 個節點,並且超過一半的項目存儲在 1 個節點中,那么您是:1. 非常不幸或 2. 配置不正確並且您的某些服務器被標記為離線。

底層 hash 比簡單的“md5”更復雜,它使用“一致哈希”算法。 這意味着如果您有 15 個節點,並且丟失 1 個,大多數密鑰仍將解析到同一台服務器。 關於“一致哈希”的文章很長,因此應該很容易獲得技術細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM