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.php)。它在我的网络应用程序中出现频率非常高。

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

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

有谁知道怎么做的吗?

它使用哈希。以最简单的形式,想象一下,如果您 运行 对密钥使用像 MD5 这样的哈希函数,您可以使用第一个字节来确定它应该去往哪个服务器。

这很重要,因为如果 2 个服务器与多个 memcached 服务器通信,它们需要确保所有 select 相同服务器的相同密钥。随机会很糟糕,因为这意味着客户端可能会尝试从存储该项目的不同服务器 get()

如果您有 15 个节点,并且超过一半的项目存储在 1 个节点中,则您是:1. 极不走运或 2. 某些配置不正确,您的某些服务器已标记为离线。

底层哈希比简单的'md5'更复杂,它使用'consistent hashing'算法。这意味着如果您有 15 个节点并丢失 1 个,大多数密钥仍将解析到同一台服务器。关于 'consistent hashing' 的文章很长,所以应该很容易获得技术细节。