分布式缓存概述
分布式缓存提供的数据内存缓存可以分布于大量单独的物理机器中。换句话说,分布式缓存所管理的机器实际上就是一个集群。它负责维护集群中成员列表的更新,并负责执行各种操作,比如说在集群成员发生故障时执行故障转移,以及在机器重新加入集群时执行故障恢复。
分布式缓存支持一些基本配置:重复(replicated)、分配(partitioned)和分层(tiered)。重复(Replication)用于提高缓存数据的可用性。在这种情况下,数据将重复缓存在分布式系统的多台成员机器上,这样只要有一个成员发生故障,其他成员便可以继续处理该数据的提供。另一方面,分配(Partitioning)是一种用于实现高可伸缩性的技巧。通过将数据分配存放在许多机器上,内存缓存的大小加随着机器的增加而呈线性增长。结合分配和重复这两种机制创建出的缓存可同时具备大容量和高可伸缩的特性。分层缓存也称作客户机-服务器(client-server)缓存,它是一种拓扑结构,在该结构中缓存功能将集中于一组机器上。缓存客户机通常并不会亲自执行任何缓存操作,而是连接到缓存并检索或更新其中的数据。分层缓存架构可以包含多层结构。
.NET 缓存属于分层缓存
oracle,jboss的缓存属于集群缓存
Oracle Coherence 使用复制、分发、分区和失效相结合的方式来可靠地维护集群中的数据。通过这种方式,无论进行处理的是哪台服务器,它从 Oracle Coherence 获得的数据都是相同的。换言之,Oracle Coherence 提供了一个分布式共享内存 实现,也称作单一系统映像 (SSI) 和一致的集群缓存。
任何时候,当应用程序能够从应用程序层获得所需数据时,它都会消除作为单点瓶颈 (SPOB) 的数据源。
为解决复制的缓存服务在内存和通信瓶颈方面的潜在伸缩性限制,Oracle Coherence 提供了一个分布式缓存服务。很多产品都使用分布式缓存这个术语来描述它们的功能,因此有必要在 Oracle Coherence 中澄清该术语的确切涵义。Oracle Coherence 将分布式缓存定义为一个数据集合,它分布(或分区)于任意数目的集群节点上。这样,集群中的一个具体节点负责缓存中的一段数据,而且责任也分布于集群节点上(或各个节点的负载均衡)。
分布式缓存有几个关键点要考虑:
- 分区:分布式缓存中的数据分散在所有服务器上,分布方式是不会有两台服务器会对同一段缓存数据负责。这意味着缓存大小和与缓存管理相关的处理能力可以随着集群的大小线性增长。这还意味着针对缓存中数据的操作可以通过“单跳”来完成,换言之,至多仅涉及另外一台服务器。
- 负载均衡:由于数据均匀分布在各台服务器上,因此管理数据的责任也就自动在集群内实现了负载均衡。
- 位置透明性:虽然数据散布于集群内各个节点上,但访问数据所用的 API 完全相同,而且每个 API 方法提供的行为也相同。这称为位置透明性,它意味着开发人员无须根据缓存的拓扑进行编码,这是因为 API 及其行为对于本地 JCache、复制缓存或分布式缓存都是相同的。
- 故障切换:所有 Oracle Coherence 服务都提供故障切换和故障恢复功能而不会导致数据丢失,这些服务包括分布式缓存服务。分布式缓存服务允许配置备份的数目。只要备份的数目为 1 或更高,任何集群节点在发生故障时都不会丢失数据。
JBoss Cache是针对Java应用的企业级集群解决方案,其目的是通过缓存需要频繁访问的Java对象,提高应用的可用性并大幅度提升应用的整体性能。
失败转移的关键是把数据复制到多个节点,在实际开发中有很多策略可供选择来复制数据。JBoss Cache支持的是哪种复制模式呢?
目前,我们支持两种方式——全局复制(total replication——TR)和buddy复制(buddy replication——BR)。全局复制将状态复制给小组中的所有成员。这种方式能够帮助成员间共享数据状态,保证在失败转移时可以转移到小组中的任何一个成员,但它限制了系统的伸缩性。Buddy复制则挑选特定成员担当备份数据的责任,数据状态相应地只会复制到这些特定节点上。也就是说直接转移到复制节点的失败转移效率非常高,但即使转移到任何非复制节点,失败转移也同样都顺利进行,因为数据状态会根据请求转移到相应的节点。BR最好用于session密切相关(session affinity)的情况下,因为数据状态的代价可能很高,所以应该尽量仅仅在发生失败转移的时候调用它。