什么是分布式缓存?

Posted

技术标签:

【中文标题】什么是分布式缓存?【英文标题】:What is a distributed cache? 【发布时间】:2013-03-05 16:09:09 【问题描述】:

我对分布式缓存的概念感到困惑。我有点知道它是从谷歌搜索。分布式缓存可以跨越多个服务器,因此它的大小和事务容量可以增长。但是,我并不真正了解它是如何工作的或如何分发数据的。

例如,假设我们有 数据 1、2、3、4、5、6、7、8、9、102 个缓存服务器 A 和 B。如果我们使用分布式缓存,那么一种可能的解决方案是数据 1、3、5、7、9 存储在缓存服务器 A 中,数据 2、4、6、8、10 存储在缓存服务器 B 中。

那么这是正确的还是我误解了?

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

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

【问题讨论】:

相关阅读8bitmen.com/… 【参考方案1】:

我使用分布式缓存解决方案已经有一段时间了(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 的所有数据的备份。这对您的应用程序是无缝的,并由缓存自动管理系统。

【讨论】:

【参考方案2】:

    是的,服务器 a 上的一半数据和服务器 b 上的一半数据将是分布式缓存。分发数据的方法有很多种,尽管某种形式的键散列似乎是最流行的。

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

    如果服务器出现故障,并且它是缓存服务器,则数据必须来自其原始来源。 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 仅用于备份吗? IE。对于数据 1,我将其放在服务器 A 上,然后在 C 和 D 上进行复制。对于数据 2,我将其放在服务器 B 上,然后在 E 和 F 上进行复制。因此,仅当 A 或 B 出现故障时才使用 C D E F。这种方式看起来更有条理。是您在第 3 点中的意思吗? 为了更清楚,不同之处在于您在所有服务器中混合数据及其副本。例如,您说将数据 1 放在服务器 A 上,副本放在 B 和 C 上,数据 2 放在服务器 B 上,副本放在 C 和 D 上。那么服务器 B 既有数据 2 的“原始数据”,又有数据 1 的副本。是如果我将所有“原始数据”和副本分开并将它们放在不同的服务器中会更好吗? 嗯,听起来您正在编写自己的软件,因此您当然可以做任何您想做的事情。但是在设计这类系统时,您必须注意故障模式和服务器管理成本,尤其是当您拥有包含许多服务器的复杂系统时。 您所描述的是一个“热故障转移”系统,其中服务器 A 和 B 是主服务器,其余的只是空闲直到需要它们。这更昂贵,因为您的服务器可以提供的负载只有 2 个服务器值 -A 和 B。我描述了一个完全分布式的系统,其中所有服务器都可以回答对某些数据的查询,这将允许您处理更多负载给定数量的服务器,因为没有一个是空闲的。 最后,Couchbase 2.0 基本上提供了我所描述的系统。每台服务器上的内存 RAM 缓存,所有数据都保存在磁盘上,所有数据都分布在集群周围。除非您出于学习目的而解决此问题,否则您可以使用 Couchbase 来提供此功能以及更多功能(例如增量索引、热故障转移和数据的自动重新平衡。)这是一件很难完全做好的事情,这是为什么我不自己做。 :-)

以上是关于什么是分布式缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Redis——缓存穿透缓存击穿缓存雪崩分布式锁

什么是分布式缓存?

分布式缓存Redis高级应用实战:为什么要用缓存机制

分布式缓存Redis高级应用实战:为什么要用缓存机制

深入分布式缓存-缓存为王

高级程序员面试:什么是分布式之缓存击穿