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

PHP memcached如何确定集群中存储密钥的节点?,php,memcached,libmemcached,Php,Memcached,Libmemcached,我有一些数据要存储在memcached中(使用PHP libmemcached客户端:)。这是在我的网络应用程序中被频繁点击的东西 为了减少单个memcached节点的通信量,我在密钥末尾添加了一个介于1和10之间的随机数,希望客户端不会将所有密钥存储在单个节点上 我假设分配密钥的过程是随机的,但在15个节点上,至少有一半的密钥属于同一节点。这使我认为,对于如何决定对给定密钥使用哪个节点,存在更具确定性的问题 有人知道它是怎么做的吗?它使用散列。在最简单的形式中,想象一下,如果您在一个键上运行像

我有一些数据要存储在memcached中(使用PHP libmemcached客户端:)。这是在我的网络应用程序中被频繁点击的东西

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

我假设分配密钥的过程是随机的,但在15个节点上,至少有一半的密钥属于同一节点。这使我认为,对于如何决定对给定密钥使用哪个节点,存在更具确定性的问题


有人知道它是怎么做的吗?

它使用散列。在最简单的形式中,想象一下,如果您在一个键上运行像MD5这样的散列函数,您可以使用第一个字节来确定它应该转到哪个服务器

这一点很重要,因为如果两个服务器与多个memcached服务器通信,它们需要为相同的密钥选择相同的服务器。Random是不好的,因为它意味着客户端可能会尝试从存储该项的不同服务器
get()

如果您有15个节点,并且有一半以上的项存储在1个节点中,则您是:1。极不走运或2。有些配置不正确,有些服务器被标记为脱机


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

啊,好的。这就是我所说的“随机”的意思(即,不是按字母顺序或其他类似的方式,这样会导致相似的名称被分组在一起)。我可以查看一下我们的配置,或者假设我需要更大的密钥分布,以减少它们分组的可能性。@ZacharyWright它使用的哈希应该具有良好的分布。即使键99%相同,排列也应在统计上均匀。