我有一些數(shù)據(jù)要存儲在 memcached 中(使用 PHP libmemcached 客戶端:https://www.php.net/manual/en/intro.memcached.php)。它在我的網(wǎng)絡(luò)應(yīng)用程序中出現(xiàn)得非常頻繁。為了減少單個 memcached 節(jié)點(diǎn)的流量,我在密鑰末尾附加了一個 1 到 10 之間的隨機(jī)數(shù),希望客戶端不會將所有密鑰存儲在單個節(jié)點(diǎn)上。我曾假設(shè)分配密鑰的過程是隨機(jī)的,但在 15 個節(jié)點(diǎn)中,至少有一半的密鑰進(jìn)入了同一個節(jié)點(diǎn)。這讓我覺得對于它如何決定將哪個節(jié)點(diǎn)用于給定密鑰,有一些更具確定性的東西。有誰知道它是怎么做到的?
1 回答

慕桂英4014372
TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個贊
它使用哈希。以最簡單的形式,想象一下,如果您在密鑰上運(yùn)行像 MD5 這樣的哈希函數(shù),您可以使用第一個字節(jié)來確定它應(yīng)該去哪個服務(wù)器。
這很重要,因?yàn)槿绻?2 個服務(wù)器與多個 memcached 服務(wù)器通信,它們需要可靠地為相同的密鑰選擇相同的服務(wù)器。隨機(jī)是不好的,因?yàn)檫@意味著客戶端可能會嘗試get()
從存儲該項目的不同服務(wù)器進(jìn)行訪問。
如果您有 15 個節(jié)點(diǎn),并且超過一半的項目存儲在 1 個節(jié)點(diǎn)中,則您是:1. 極度不走運(yùn)或 2. 某些配置不正確并且您的某些服務(wù)器標(biāo)記為離線。
底層哈希比簡單的“md5”更復(fù)雜,它使用“一致性哈希”算法。這意味著如果您有 15 個節(jié)點(diǎn)并丟失 1 個,大多數(shù)密鑰仍將解析到同一臺服務(wù)器。關(guān)于“一致性哈?!钡奈恼潞荛L,因此應(yīng)該很容易獲得技術(shù)細(xì)節(jié)。
- 1 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報
0/150
提交
取消