所以我正在开发一个Web应用程序,这个应用程序必须为可扩展性而构build。 它将频繁的MySQL查询存储到caching中。 我几乎build立了所有的东西,并且准备好了,但我关心的是如何处理数据caching的最佳实践。 我已经和几个人谈过了,其中一个人build议将所有的memcache节点上的每个键/值分开。
意思是如果我存储这个例子:'somekey','这是值'
它会被拆分,让3个memcache服务器。
这是更好的方法吗? 或者是更多的memcachebuild立在1对1的关系上? 例如。
在服务器A上存储值,直到它发生故障 – 到服务器B并在那里存储。
这是我目前对我所做的研究以及与memcache合作的经验。
有人可以请指出我在这个正确的方向,让我知道哪种方式是最好的,或者如果我完全有这种混合起来。
谢谢
几乎所有的memcached的“分布式”部分都是在客户端处理的。
如果你的configuration中定义了多个memcached服务器(我在你的文章中看到了php标签,所以我猜你正在使用pecl / memcache,但是我认为pecl / memcached的语法是相似的)
<?php $mc = new Memcache() $mc->addServer('node1', 11211); $mc->addServer('node2', 11211); $mc->addServer('node3', 11211); ?>
客户端将使用密钥的散列来确定将数据放入哪个服务器。 有一个addServer方法的选项(retry_interval = -1),如果一个memcached服务器出现故障,你的PHP将不会继续尝试它。
有一些关于如何在Memcache中进行“复制”的信息,但是从我的经验来看,这并不是真正值得的努力或“浪费的”内存(您必须将所有的高速caching存储在所有的服务器上,如果您只是使用内置的分配机制,它只需要存储在一个。显然,如果你的一个服务器死亡,你会得到caching未命中,直到该数据存储在另一台服务器上,但你不应该无论如何,使用Memcache作为持久存储)。 Memcache客户端协议非常聪明。 ;)
原始链接https://blogs.oracle.com/trond/entry/replicate_your_keys_to_multiple删除,因为它不再存在。
memcached是一个caching机制,它不是为了永久存储数据,总是假定memcached应该帮助你加快速度,不做元数据的存储,有更好的select(比如看redis数据库)。
在memcached中,用来决定目标服务器的哈希键也非常重要,一旦你确定了一个哈希键的机制,它总是将存储的值映射到正确的服务器(这里有几个哈希机制的技术,非常有趣的主题),默认情况下,memcached哈希将正确地映射到服务器与服务于大多数情况下的散列键方法。
另外需要考虑的一点是,memcached由于slab分配机制而遭受碎片化,因此改变散列机制以避免slab导致降级也是一种很好的技术。
看看这里的一些不同的散列机制。