PHP memcached 如何确定在集群中的哪个节点上存储密钥?

我有一些数据要存储在 memcached 中(使用 PHP libmemcached 客户端:https://www.php.net/manual/en/intro.memcached.php)。它在我的网络应用程序中出现得非常频繁。

为了减少单个 memcached 节点的流量,我在密钥末尾附加了一个 1 到 10 之间的随机数,希望客户端不会将所有密钥存储在单个节点上。

我曾假设分配密钥的过程是随机的,但在 15 个节点中,至少有一半的密钥进入了同一个节点。这让我觉得对于它如何决定将哪个节点用于给定密钥,有一些更具确定性的东西。

有谁知道它是怎么做到的?


富国沪深
浏览 101回答 1
1回答

慕桂英4014372

它使用哈希。以最简单的形式,想象一下,如果您在密钥上运行像 MD5 这样的哈希函数,您可以使用第一个字节来确定它应该去哪个服务器。这很重要,因为如果 2 个服务器与多个 memcached 服务器通信,它们需要可靠地为相同的密钥选择相同的服务器。随机是不好的,因为这意味着客户端可能会尝试get()从存储该项目的不同服务器进行访问。如果您有 15 个节点,并且超过一半的项目存储在 1 个节点中,则您是:1. 极度不走运或 2. 某些配置不正确并且您的某些服务器标记为离线。底层哈希比简单的“md5”更复杂,它使用“一致性哈希”算法。这意味着如果您有 15 个节点并丢失 1 个,大多数密钥仍将解析到同一台服务器。关于“一致性哈希”的文章很长,因此应该很容易获得技术细节。
打开App,查看更多内容
随时随地看视频慕课网APP