分布式缓存是什么?

66

我对分布式缓存的概念感到困惑。从谷歌搜索中我大概知道它是什么。分布式缓存可以跨多个服务器,以便它在大小和事务容量方面都能够增长。然而,我并不真正理解它是如何工作的,也不知道它是如何分配数据的。

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

那么这样理解正确吗还是我误解了呢?

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

第三个问题,如果一个服务器(比如说A服务器)停机了,我们该怎么办呢?我的意思是,如果我的上面的例子是正确的,当A服务器挂掉时,我们无法从缓存中获取数据1、3、5、7、9,那么在这种情况下缓存服务器能做些什么呢?


相关阅读 https://www.8bitmen.com/distributed-cache-101-the-only-guide-youll-ever-need/ - underdog
2个回答

50
  1. 是的,将数据服务器a和服务器b上各一半的数据作为分布式缓存。有很多方法来分发数据,不过对键进行哈希似乎是最受欢迎的方法。

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

  3. 如果服务器宕机,并且它是缓存服务器,则数据将必须从其原始源获取。例如:缓存通常是基于内存的数据库,旨在快速检索。缓存中的数据仅在定期使用时保留,并最终将被清除。但对于需要持久性的分布式系统,常用技术是具有多个副本。例如:您有服务器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。这种方式看起来更加有结构性。这是你在第三点中所指的吗? - Joey
为了更清晰,区别在于您将数据及其副本混合在所有服务器中。例如,您说将数据1放在A服务器上,副本放在B和C服务器上,将数据2放在B服务器上,副本放在C和D服务器上。那么,B服务器既有数据2的“原始数据”,也有数据1的副本。如果我将所有“原始数据”和副本分开并放在不同的服务器上,会更好吗? - Joey
嗯,听起来你正在编写自己的软件,所以你当然可以做任何想做的事情。但是在设计这些类型的系统时,您必须注意故障模式和服务器管理成本,特别是如果您拥有许多服务器的复杂系统。 - nirvana
3
你所描述的是“热备份”系统,其中服务器 A 和 B 是主服务器,其余服务器则处于空闲状态,直到需要它们为止。这种系统更加昂贵,因为你的服务器可以提供的负载仅相当于 2 台服务器的能力 - A 和 B。我描述了一个完全分布式的系统,所有服务器都可以回答一些数据查询,这将使你能够处理更多的负载,而不必让任何服务器处于空闲状态,从而减少了服务器数量的要求。 - nirvana
最后,Couchbase 2.0 基本上提供了我所描述的系统。每个服务器都有一个内存 RAM 缓存,所有数据都持久化到磁盘,并且所有数据都分布在集群中。除非您是为了学习目的而解决此问题,否则您可以使用 Couchbase 提供此功能以及更多功能(例如增量索引、热故障转移和数据的自动重新平衡)。这是一件难以完全做好的事情,这就是为什么我不亲自去做它的原因。 :-) - nirvana
显示剩余3条评论

8
我已经使用分布式缓存解决方案(如NCache、AppFabric等)有一段时间了,基于我的经验,我将回答以下三个问题。
1:分布式缓存解决方案允许您通过创建缓存集群将数据保存在所有服务器上。假设您有2个缓存服务器(服务器节点),并且您在缓存中添加了10个项目。理想情况下,5个项目应该存在于两个服务器节点中,因为数据负载会被分配到缓存集群中的服务器数量之间。通常借助哈希和智能数据分配算法来实现此目标。因此,您的数据请求负载也会分别分配给所有缓存服务器,随着在缓存集群中添加更多服务器,您可以实现事务容量的线性增长。
2:缓存集群可以包含许多服务器机器,也称为服务器节点。是的,在您的例子中,Server A是一个服务器节点或服务器机器。
3:通常,分布式缓存系统都非常可靠,并提供了复制支持。如果一个或多个服务器崩溃,并且您已经打开了复制,则不会发生数据丢失或停机。 NCache具有不同的拓扑结构来解决这个问题,例如复制拓扑结构和副本分区拓扑结构,其中每个服务器的数据都被复制到其他服务器。如果一个服务器崩溃,该服务器的复制数据将自动从存活的服务器节点中提取并提供。在您的例子中,Server A(1,3,5,7,9)的数据被复制到Server B(2,4,6,8,10),反之亦然。如果服务器A崩溃,那么存在于Server B上的服务器A的数据将会被使用,以便不会发生数据丢失。因此,如果服务器A崩溃并且应用程序请求数据(1),则这些数据将从Server B中检索,因为Server B包含Server A的所有数据的备份。这对您的应用程序是无缝的,并由缓存系统自动管理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接