2

这可能是一个愚蠢的问题,但我什至没有得到什么谷歌。我有一个服务器,它从数据库中获取一些数据,缓存这些数据,当任何请求涉及这些数据时,然后从缓存而不是从数据库中获取数据。通过减少服务请求所需的时间。这个缓存是可以修改的,比如可以添加一些键或者删除或者更新。缓存中发生的任何更改也将发生在数据库上。现在的问题是由于流量激增,我们想在我的服务器前面添加一个负载均衡器。可以说我再添加一台服务器。那么两台服务器就会有两个不同的缓存。如果在第一个服务器缓存中添加了某些东西,我应该如何通知第二个服务器缓存以使其刷新?

4

2 回答 2

2

如果您最终决定将缓存移到您的主网络服务器进程之外,那么您还可以查看一致哈希。这将是复制缓存的替代方案。

复制缓存的问题在于,它们与参与缓存的节点数量成反比。即,当您添加其他节点时,它们的性能会降低。当节点数量较少时,它们可以正常工作。如果要在 N 个节点之间复制数据(或者您需要向 N 个节点发送驱逐消息),那么每次写入都需要对原始节点上的缓存进行 1 次写入,并向其他节点写入 N-1 次。

在一致散列中,您改为定义一个散列函数,它将您要存储或检索的数据的键作为输入,并返回集群中负责缓存该键的数据的服务器的 ID。因此,每个缓存服务器负责整体密钥的一小部分,客户端无需任何查找即可确定哪个服务器将包含所查找的数据,并且不需要在缓存服务器之间复制数据和驱逐消息。

一致哈希的“一致”部分是指您的哈希函数如何处理添加到集群或从集群中删除的新服务器:需要在服务器之间重新分配一些密钥,但该函数旨在最大限度地减少此类中断的数量.

在实践中,您实际上并不需要一个专用的缓存集群,因为您的缓存可以在您的 Web 服务器的进程中运行;每个网络服务器都能够确定另一个网络服务器应该存储一个键的缓存数据。

一致的散列被大规模使用。在这个阶段,这对你来说可能是矫枉过正。但请注意 O(N) 消息传递架构中固有的可扩展性瓶颈。复制缓存可能是一个好主意

编辑:看看Infinispan,一个分布式缓存,它确实使用开箱即用的一致散列。

于 2013-08-28T11:23:27.317 回答
1

任何你喜欢的方式 ;) 如果你不知道,我建议你看看或使用 ehcache 或 Hazelcast。它可能不是您的最佳解决方案,但它是一些使用最广泛的解决方案。(还有 CV++ ;)我建议你先了解它的作用。

于 2013-08-28T09:51:08.290 回答