维护不同服务器的缓存状态

时间:2013-08-28 09:47:25

标签: java caching

这可能是一个愚蠢的问题,但我甚至没有得到什么谷歌。 我有一个服务器从DB获取一些数据,缓存这些数据,当任何请求涉及这些数据时,然后从缓存而不是DB中获取数据。通过减少服务请求所花费的时间。 可以修改此缓存,即可以将某些密钥添加到其中或删除或更新。 高速缓存中发生的任何更改也将在DB上发生。 问题现在是由于我们想要在我的服务器前面添加负载均衡器的流量急剧增加。假设我再添加一台服务器。然后两台服务器将有两个不同的缓存。如果在第一个服务器缓存中添加了一些东西,我应该如何通知第二个服务器缓存以使其刷新?

2 个答案:

答案 0 :(得分:2)

如果您最终决定将缓存移到主Web服务器流程之外,那么您还可以查看consistent hashing。这将是复制缓存的替代方案。

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

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

一致性哈希的“一致”部分是指您的哈希函数如何处理添加到群集或从群集中删除的新服务器:需要在服务器之间重新分配密钥,但该功能旨在最小化数量这种破坏。

实际上,您实际上并不需要专用的缓存集群,因为您的缓存可以在Web服务器中进行进程;每个Web服务器都能够确定应存储密钥缓存数据的其他Web服务器。

大规模使用一致的散列。在这个阶段你可能有点矫枉过正了。但请注意O(N)消息传递体系结构中固有的可伸缩性瓶颈。复制缓存可能是开头的好主意。

编辑:看看Infinispan,这是一个分布式缓存,确实使用了一致的哈希开箱即用。

答案 1 :(得分:1)

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