2008-12-09 48 views
8

我正在研究使用MemCached来开发我正在开发的Web应用程序,并且在过去几天研究了MemCached之后,我遇到了一个我找不到答案的问题。如何将MemCached服务器连接在一起?

如何将Memcached服务器连接在一起,或者如何在MemCached服务器之间复制数据?

此外:是否由服务器或客户端控制此功能,以及如何?

回答

5

我已经使用了BeITMemcached,并且您创建了MemcacheClient的实例并设置了您想要使用的服务器,就像字符串一样。

在这一点上,客户端自己确定哪些服务器可用来放入不同的项目。你永远不知道哪一个项目将在。

检查here to see how the servers handle failover

最简单的事情是有一个重新填充机制。就我而言,我将数百个对象存储在来自数据库的memcache中。我可以调用重新填充并将它们全部放回原处。每当我添加,更新或删除它们到数据库时,我都会对这些memcache进行相同的调用。

7

当您设置多个服务器时,客户端库使用第一个散列来选择存储每个键/数据对的位置。这意味着没有复制,并且每个客户端都必须使用同一组服务器。

优点:

  • 几乎为零开销,存储和带宽线性增长。
  • 服务器代码保持简单可靠。

缺点:

  • 在一组服务器中的任何改变(一个出现故障,或者添加一个新的)突然失效(几乎)所有缓存。
  • 您必须确保在每个客户端上使用相同的算法。

如果您控制客户端的代码,您可以简单地将每个密钥/数据对存储在两台服务器上两次。在从不同的客户端阅读时,一定要在相同的地方进行搜索。

+0

当然,这不是唯一的方法吗? – 2008-12-09 13:35:31

+1

Consistant散列可以显着限制由于重新散列到另一个服务器而失效的密钥数量。这也取决于您拥有的服务器数量。 – 2009-01-16 15:00:20

1

这听起来像你希望有缓存,可以用机器重启等如果是这样应付...

在很多情况下(假设你是不是写Facebook)的关系数据库管理系统是缓存不够快。只需创建一个包含密钥和blob列的表。如果RDBS服务器有足够的内存,所有的数据都将在RAM中并保存到磁盘以便恢复。

请记住,这可能是与主数据库服务器分开的服务器。

如果您希望获得更多的乐趣并使用高端RDMS,则可以对用于构建删除过期行的“缓存数据”的查询设置更改通知从缓存中。

有人可以设置触发器来清除缓存中的无效行,但这可能非常快速非常复杂。

0

Memcached不提供复制属性。为此,需要将服务器添加到memcached客户端服务器列表中,然后点击数据库以将数据存储在该特定服务器中。

0

您应该认真考虑CouchBase。它使用memcached协议,提供几乎相同的速度,并提供您正在寻找的自动复制。它也坚持磁盘,所以你的缓存永远不会冷。