什么是分布式缓存?

Joe*_*oey 50 caching concept

我对分布式缓存的概念感到困惑.我有点知道谷歌搜索是什么.分布式缓存可以跨越多个服务器,以便它可以在大小和事务容量上增长.但是,我真的不明白它是如何工作的或如何分配数据.

例如,让我们说,我们有数据1,2,3,4,5,6,7,8,9,10二级缓存服务器A和B.如果我们使用分布式缓存,那么可能的解决方案之一是数据1,3,5,7,9存储在缓存服务器A中,并且2,4,6,8,10存储在缓存服务器B中.

这是正确的还是我误解了它?

第二个问题是我经常听到服务器节点这个词.它是什么?在上面的例子中,服务器A是服务器节点,对吗?

第三个问题,如果服务器(假设服务器A)出现故障,我们可以做些什么呢?我的意思是如果上面的例子是正确的,当服务器A关闭时,我们无法从缓存中获取数据1,3,5,7,9,那么在这种情况下缓存服务器可以做什么?

nir*_*ana 39

  1. 是的,服务器a上的一半数据,服务器b上的一半数据是分布式缓存.有许多分发数据的方法,尽管某些键的散列似乎最受欢迎.

  2. 术语服务器和节点通常是可互换的.节点通常是某个集合的单个单元,通常称为集群.服务器通常是单件硬件.在erlang中,您可以在单个服务器上运行erlang运行时的多个实例,因此您将拥有多个erlang节点...但通常您希望每个服务器有一个节点以实现更优化的调度.(对于非分布式语言和平台,您必须根据需要管理流程.)

  3. 如果服务器出现故障,并且它是缓存服务器,则数据必须来自其原始源.EG:缓存通常是基于内存的数据库,专为快速检索而设计.高速缓存中的数据只有在经常使用时才会保留,最终将被清除.但对于需要持久性的分布式系统,常见的技术是拥有多个副本.EG:您有服务器A,B,C,D,E和F.对于数据1,您可以将其放在A上,然后在B和C上使用副本.Couchbase和Riak执行此操作.对于数据2,它可以在B上,然后在C和D上复制.这样,如果任何一台服务器出现故障,您仍然有两个副本.

  • 首先,感谢您快速回复并且非常清楚.我真的很感激.关于第3点,我可以将服务器A,B用于实时缓存,服务器C,D,E,F仅用于备份吗?即.对于数据1,我将其放在服务器A上,然后在C和D上复制.对于数据2,我将其放在服务器B上,然后在E和F上复制.因此,仅当A或B关闭时才使用CDEF.这种方式看起来更有条理.这是你在第3点的意思吗? (3认同)
  • 您所描述的是一个"热故障转移"系统,其中服务器A和B是主服务器,其余服务器在需要时只是空闲.这是更昂贵的,因为您的服务器可以提供的负载只有2个服务器--A和B.我描述了一个完全分布式系统,其中所有服务器都可以回答一些数据的查询,这将允许您处理更多的负载给定服务器数量,因为没有服务器空闲. (3认同)

小智 6

我使用分布式缓存解决方案已经有一段时间了(NCache、AppFabric 等),我将根据我在分布式缓存方面的经验来回答所有三个问题。

1:分布式缓存解决方案允许您通过创建缓存集群将数据保留在所有服务器上。假设您有 2 个缓存服务器(服务器节点)并且您在缓存中添加了 10 个项目。理想情况下,两个服务器节点中都应该有 5 个项目,因为数据负载会在缓存集群中的服务器数量之间分配。这通常是在散列和智能数据分发算法的帮助下实现的。因此,您的数据请求负载也会在所有缓存服务器之间分配,随着缓存集群中服务器数量的增加,您的跨国容量将实现线性增长。

2:一个缓存集群可以包含许多服务器机器,也称为服务器节点。是的,在您的示例中,服务器 A 是服务器节点或服务器机器。

3:典型的分布式缓存系统使用复制支持非常可靠。如果一台或多台服务器出现故障并且您打开了复制,则不会有数据丢失或停机。NCache 有不同的类型来解决这个问题,例如复制拓扑和副本拓扑分区,其中每个服务器的数据也被复制到另一个服务器。如果一台服务器出现故障,该服务器的复制数据将自动从幸存的服务器节点可用。

在您的示例中,服务器 A(1, 3, 5, 7, 9) 的数据被复制到服务器 B(2, 4, 6, 8, 10) ,反之亦然。如果服务器 A 出现故障,服务器 B 上存在的服务器 A 的数据将可用并从那里使用,因此不会发生数据丢失。因此,如果服务器 A 出现故障并且应用程序请求数据 (1),则该数据将从服务器 B 检索,因为服务器 B 包含服务器 A 的所有数据的备份。这与您的应用程序无缝连接,并由缓存自动管理系统。