NCache 卓越

NCache 是一款适用于 .NET、Java、Python 和 Node.js 的开源内存分布式缓存。它专为高事务负载而构建,提供极致速度和线性可扩展性,从而消除性能瓶颈,并支持极限事务处理 (XTP)。 NCache 还提供智能数据复制和自我修复、动态集群以实现高可用性。

 
 

动态集群(高可用性)

NCache 它采用基于对等架构的自愈式动态缓存集群,可确保 100% 正常运行时间。这些集群基于 TCP 协议;集群中的每个服务器都是一个对等节点。这使得在运行时无需停止缓存或应用程序即可扩展或移除集群中的服务器成员,从而实现零停机时间。

 

对等集群(自我修复)

NCache 集群采用对等集群架构。这意味着没有主/从节点,每个服务器都是对等的。但是,Custer 协调器是集群中最老的节点。如果它发生故障,下一个最老的节点将自动成为协调器。

此集群协调器管理所有集群操作以及其他缓存配置信息。它还管理集群健康,并强制移除与集群中其他服务器仅部分连接的缓存服务器。

NCache 动态集群架构,显示对等 TCP 连接、集群协调器和客户端分布图。
NCache 动态聚类和实时分布图传播。
 

动态聚类

核心 NCache 高可用性是指动态集群,它允许通过 TCP 实时传播成员变更,从而实现零停机时间的服务器添加或移除。正如前面讨论的, NCache 有一个 动态集群架构。 这允许 NCache 即使进行此类更改,也始终保持正常运行。

动态集群允许您执行以下操作:

  • - 在运行时添加/删除缓存服务器 无需停止缓存或您的应用程序。
  • - 集群成员资格 在运行时更新并传播到集群中的所有服务器和连接到集群的所有客户端。
 

裂脑集群处理

NCache 它利用智能检测算法解决脑裂问题,该算法能够自动协调不同的子簇,无需人工干预即可恢复数据完整性。另一部分 NCache 动态聚类是其 智能裂脑检测和恢复 功能。由于网络问题,缓存服务器之间的连接中断时,就会发生脑裂。这会导致多个独立的子集群形成,每个子集群都会假设其他集群已宕机,并且自己是唯一剩余的集群。

在这种情况下,当缓存服务器突然离开集群时,剩余的 NCache 服务器继续尝试重新连接。但在此过程中,每个子集群都会独立更新数据,从而创建多个不同步的数据版本。

网络问题解决后, NCache 自动触发脑裂。脑裂通过决定哪些缓存服务器可以保留其数据(胜出者),哪些服务器必须放弃其数据(失败者)来自动完成。这是必要的,因为失败集群中的服务器必须作为新节点重新加入成功集群。虽然会有一些数据丢失,但最终结果是缓存集群能够在无需任何人工干预的情况下快速恢复。

 

动态客户端连接

NCache 也让你 添加或删除 在运行时无需停止缓存或任何其他客户端即可连接客户端。添加客户端时,它只需要集群中的一台缓存服务器即可建立连接。连接到该服务器后,它会收到必要的集群成员资格和缓存拓扑信息。之后,它会决定连接到哪些其他服务器。

  • - 分区/分区副本缓存:客户端连接到所有缓存服务器分区(但不连接到副本服务器,因为副本服务器仅与其分区通信)。这允许客户端定位到合适的分区进行读写操作。并且,如果集群中添加了新服务器,客户端会收到更新的集群成员信息,并连接到新添加的服务器。
  • - 复制缓存:如果 复制缓存客户端只需连接到集群中的一台缓存服务器,但会以负载均衡的方式确保所有缓存服务器拥有相同数量的客户端。因此,所有读写操作都可以在一台缓存服务器上进行。当新的服务器添加到集群时,客户端会从缓存服务器获取此信息,并在必要时重新连接到新的服务器。
  • - 镜像缓存:如果 镜像缓存,客户端只会连接到此双节点集群中唯一的主动节点。如果客户端连接到被动节点,被动节点会告知客户端主动节点的信息,然后客户端会自动重新连接到主动节点。如果主动节点发生故障,被动节点变为主动节点,则所有客户端都会自动连接到新的主动节点。
NCache 动态集群,显示运行时服务器和客户端的添加和移除。
NCache 缓存服务器和客户端的运行时可扩展性。
 

动态配置

正如动态客户端连接和动态集群部分所述, NCache 提供缓存和客户端的动态配置。本节旨在向您介绍此运行时配置的工作原理。

  • - 缓存配置:通过管理工具创建缓存时,此配置信息会复制到当时已知的所有缓存服务器。同样,任何在运行时添加到集群的新服务器都会收到更新后的完整缓存配置,并将其复制到本地磁盘。
  • - 热应用配置更改:您可以通过“热应用”在运行时更改某些缓存配置。例如,当更改 缓存大小 或启用 压缩在这种情况下,更新后的配置信息会在运行时传播到所有缓存服务器并保存在其磁盘上。如有需要,部分信息也会发送给所有客户端。
  • - 分布图(分区/分区副本缓存):此分布图在缓存启动时创建,然后复制到所有缓存服务器和客户端。此分布图包含有关哪些存储桶(集群缓存中总共 1000 个存储桶)位于哪个分区的信息。
 

集群内的连接故障转移

集群中的所有缓存服务器都通过 TCP 连接。并且,每个缓存服务器都连接到集群中的所有其他缓存服务器,包括运行时添加的任何新服务器。 NCache 提供各种方法来确保集群内的任何连接 活着 尽管连接失败,仍然可以连接。这些故障通常是由于路由器、防火墙或网卡/网络驱动程序问题导致的网络故障而发生的。

  • - 连接重试:如果两个缓存服务器之间的连接断开, NCache 自动尝试多次重新建立此连接。这些 重试 在用户指定的超时时间内发生。
  • - 保持心跳: NCache 还具有一项功能,可以让每个缓存服务器持续向所有其他服务器发送一些小数据包作为心跳。这确保了如果出现网络套接字问题,缓存服务器能够检测到并通过重试进行修复。
  • - 部分连接的服务器:在某些情况下,网络问题可能会将集群拆分为子集群(“裂脑“)。 NCache 一旦网络恢复,就会自动检测并解决此问题,方法是决定哪个集群保留其数据并要求其他集群重新加入。
 

与客户端的连接故障转移

客户端中的连接故障转移类似于集群故障转移重试、心跳和自动重新连接到健康服务器。

  • - 连接重试:就故障转移而言,集群和客户端级别的连接重试是相同的。但是,如果客户端和缓存服务器之间的连接中断, NCache 客户端自动执行 多次连接重试 建立此连接。这些重试将在超时期限内进行。如果无法建立连接,则会向客户端应用程序抛出异常,以便其处理。
  • - 保持心跳:与集群内的连接故障转移相同。
  • - 部分连接的客户端(分区/分区副本缓存):有时,即使重试,连接也无法及时恢复,因此客户端会假设其他服务器无法访问,即使它们并非无法访问。因此,对于分区/分区副本缓存,即使其分布图显示无法通信的服务器拥有数据,客户端仍会与其他服务器交互以读取或写入所有数据。在这种情况下,其他缓存服务器充当了中介,以确保成功运行。
 
 

缓存拓扑(线性可扩展性)

NCache 提供多种缓存拓扑,以实现线性可扩展性,同时保持数据一致性和可靠性。其目标是支持从小型两台服务器缓存到拥有数百台服务器的大型集群的应用程序。缓存拓扑本质上是一种跨多台缓存服务器的集群缓存中的数据存储、数据复制和客户端连接策略。

 

参考数据与交易数据

参考数据变化不频繁,您可以缓存它以满足频繁的请求并避免昂贵的数据库访问,同时仅偶尔更新它。另一方面,事务数据变化非常频繁,您可以像读取它一样频繁地更新它。

早期,缓存主要用于存储参考数据,因为频繁更改的数据会变得陈旧,与数据库中的最新数据不同步。然而, NCache 现在提供了非常强大的功能,使缓存能够保持其缓存数据与数据库同步。

所有的 NCache的缓存拓扑结构适用于参考数据,但有些拓扑结构尤其适用于事务数据。因此,您需要确定读取和写入的次数,以确定哪种拓扑结构最适合您。此外,某些缓存拓扑的扩展性较差,尤其是在更新操作方面,因此也需要注意这一点。

下面是缓存拓扑列表及其对读取和写入的影响。

  • - 分区缓存(无复制):这是最快的拓扑,但它不复制数据,因此如果缓存服务器出现故障,就会丢失数据。
  • - 分区副本缓存 (最受欢迎):此拓扑结构读写速度极快。同时,它还能复制数据,确保可靠性,且不影响性能。速度/可扩展性和数据可靠性的最佳结合。
  • - 复制缓存:非常适合小型环境。每台服务器都保存缓存的完整备份,确保高数据可靠性和容错能力。读取速度超快,并可线性扩展。在双节点集群中写入速度中等,但随着服务器数量的增加,由于写入操作在所有缓存服务器上同步进行,因此无法扩展。
  • - 镜像缓存:此拓扑非常适合小型环境。对于双节点主动/被动模式,它的写入操作速度比复制缓存更快。但是,扩展性较差。
  • - 客户端缓存:非常适合所有缓存拓扑的读取密集型用例。让您通过分布式缓存实现 InProc 速度
拓扑 读取性能。 写入性能。 可靠性 最佳用例
分区副本 极端 交易数据/电子商务
分区的 极端 极端 没有 瞬态数据/最大性能
已复制 极端 小型集群/读取密集型
镜像 双节点主动/被动配置
客户端缓存 进程内速度 高(同步) 读取密集型/本地 L1 缓存
 

分区缓存

分区缓存是读写速度最快、扩展性最强的缓存拓扑结构。它专为大型集群设计,即使在峰值负载下也能提供快速的读写性能。然而,它不复制数据。因此,如果服务器发生故障,则没有备份。

NCache 分区缓存拓扑结构,数据分布在多个服务器节点上。
NCache 分区缓存,实现线性可扩展性和分布式存储。

以下是分区缓存的一些特性。

  • - 动态分区:缓存在运行时被划分为多个分区,每个缓存服务器对应一个分区。每个集群缓存共有 1000 个 bucket,均匀分布到所有分区。本质上,添加/删除缓存服务器会导致运行时分区的创建/删除。分区 bucket 的分配在数据添加到缓存时不会发生变化。相反,只有在添加或删除分区,或者数据被删除时,分区 bucket 的分配才会发生变化。 负载均衡。此重新平衡是指将存储桶及其数据移动到目标分区的状态转移过程
  • - 分布图:缓存集群会创建一个分布图,其中包含哪些 bucket 位于哪些分区的信息。每当发生状态转移时,分布图都会更新。分布图会传播到所有服务器和客户端。客户端会根据此分布图来确定要与哪个缓存服务器进行读写操作。
  • - 动态数据平衡:由于所有 bucket 都是基于 HashMap 的,并且数据是根据应用于键的哈希算法进行存储的。这可能会导致某些 bucket 比其他 bucket 容纳更多的数据,具体取决于所使用的键。如果这种不平衡超过了可配置的阈值, NCache 自动移动存储桶来重新平衡负载。
  • - 客户端连接到所有分区:客户端连接到所有缓存服务器,以便它们可以通过一个请求直接读取或写入服务器数据。如果客户端与某个缓存服务器的连接断开,它会请求其他服务器之一读取或写入其无法访问的服务器上的缓存项。该服务器会帮助客户端实现此操作。
 

分区副本缓存

注意:分区缓存中提到的所有内容在这里也适用。

就像 分区缓存分区-副本缓存是一种极快且可线性扩展的缓存拓扑结构,适用于读写操作。它适用于更大规模的缓存集群,即使在峰值负载下也能保持出色的读写性能。此外,分区-副本缓存还会复制数据。因此,即使缓存服务器发生故障,也不会丢失数据。

分区副本缓存 我们最受欢迎的缓存拓扑 因为它为您提供了两全其美的效果,即性能/线性可扩展性和数据可靠性。

NCache 分区副本拓扑结构,显示活动分区和被动副本,以实现高可用性。
NCache 分区副本缓存,实现数据可靠性和线性可扩展性。

以下是 Partition-Replica Cache 的一些特性。

  • - 动态分区:与分区缓存相同。
  • - 动态副本:在运行时创建或删除分区时,其副本也会被创建或删除。副本始终位于不同的缓存服务器上,并且每个分区只有一个副本。
  • - 异步复制:默认情况下,从分区到副本的复制是异步的。客户端写入(添加/更新/删除)会命中分区,并排队等待异步批量复制到副本。这可以提高性能,但如果分区发生故障,导致并非所有更新都复制到副本,则存在轻微的数据丢失风险。不过,这种情况极其罕见。
  • - 同步复制:如果您的数据非常敏感(例如财务数据),并且您无法承受任何过时的数据,那么您可以在配置中选择“同步复制”选项。选择此选项后,所有写入操作都会在分区和副本上同步执行,直到被视为完成。这样,如果副本上的操作失败,则分区上的操作也会失败。因此,可以保证缓存中的所有数据(分区和副本中的数据)始终保持一致。但是,这会对性能产生影响,因为它比异步复制慢。
  • - 分布图:与分区缓存相同。
  • - 动态数据平衡(分区和副本):与分区缓存相同。然而,在分区-副本缓存中,当分区数据平衡时,副本中也会发生数据平衡。
  • - 客户端连接到所有分区:与分区缓存相同。然而,在分区-副本缓存中,客户端仅与分区通信,而不与其副本通信。这是因为副本是被动的,分区仅在向其副本复制数据时才会与其副本通信。
 

复制缓存

复制缓存通过在两台或多台缓存服务器上进行复制来提供数据可靠性。它的读取速度非常快,并且可扩展。但它的写入速度无法扩展,因为写入操作会同步到集群中的所有服务器。对于双节点集群,写入速度比数据库快,但不如分区副本缓存快。对于三台或更多服务器的集群,写入性能会下降,最终导致成本高昂。

NCache 采用复制缓存拓扑结构,所有活动节点之间同步更新。
NCache 复制缓存可实现高数据可靠性和读取可扩展性。

以下是复制缓存的一些特性。

  • - 动态复制节点:您可以在运行时向现有缓存添加或移除缓存服务器,而无需停止缓存或应用程序。新添加的服务器会将整个缓存复制到自身(副本)。并且,被移除的服务器会更新集群成员资格,其所有客户端都会迁移到其他服务器。
  • - 每个节点上的整个缓存:整个缓存被复制到集群中的每个服务器。
  • - 读取是可扩展的:即使添加更多服务器,读取速度也会变得非常快,并且可扩展。但是,添加更多服务器并不会增加缓存大小,因为新添加的服务器只是整个缓存的另一个副本。
  • - 写入是同步的:对于双节点集群来说,写入速度非常快,甚至比数据库还要快。但写入是同步的,这意味着每个写入操作只有在所有缓存服务器同步更新后才能完成。因此,写入速度不如其他拓扑结构快。
  • - 客户端仅连接到一台服务器:每个缓存客户端仅根据缓存服务器确定的负载均衡算法连接到集群中的一台服务器。如果这台缓存服务器发生故障,客户端将连接到列表中的下一台服务器。如果您不想使用负载均衡,也可以在缓存配置文件中手动指定要连接的服务器。
 

镜像缓存

镜像缓存是一个双节点主动/被动缓存集群,适用于小型环境。它通过从主动节点到被动节点的异步复制/镜像来提供数据可靠性。它的读写速度都非常快(实际上,它的写入操作比复制缓存更快),但无法扩展到双节点主动/被动集群之外。

NCache 采用主备节点和异步镜像的镜像缓存拓扑结构。
NCache 镜像缓存,实现双节点主备高可用性。

以下是镜像缓存的一些特性。

  • - 1 个主动服务器和 1 个被动服务器:镜像缓存只有两台服务器。一台是主动服务器,另一台是被动服务器。它们都拥有整个缓存的副本。如果主动服务器宕机,被动服务器将自动变为主动服务器。并且,如果之前宕机的主动服务器恢复正常,它将被视为被动服务器,除非您在运行时通过管理工具更改此指定。
  • - 支持故障转移的客户端连接:每个缓存客户端仅连接到集群中的活动服务器执行读写操作。如果此活动服务器发生故障,所有客户端将自动连接到此时已变为活动状态的被动服务器。此故障转移支持可确保即使服务器发生故障,镜像缓存也能始终正常运行。
  • - 异步镜像:在活动服务器上执行的任何写入操作都会异步镜像/复制到无源服务器。这可确保在活动服务器发生故障且无源服务器必须转为活动服务器的情况下,无源服务器始终与最新数据同步。异步镜像还意味着更快的性能,因为多个写入操作在无源服务器上以批量操作的形式执行。
特性 分区的 分区副本 已复制 镜像
最大簇大小 数百个节点 数百个节点 较小的集群 双节点(主动/被动)
复制类型 没有 异步/同步 Synchronous 异步
资料安全 低(无备用) 高(复制品) 高(完全备份) 高(镜面)
主要好处 最高性能 可扩展性 + 可靠性 读取密集型扩展 小规模可用性
 

客户端缓存(InProc 速度)

客户端缓存位于您的 Web/应用服务器本地,并且非常靠近您的应用程序,允许您缓存从分布式缓存读取的数据(无论缓存拓扑如何)。虽然客户端缓存位于您的应用程序本地,但它并非独立存在。相反,它始终与集群缓存同步。这确保了客户端缓存中的数据永远不会过时。

您可以将其视为“缓存之上的缓存”,它进一步提升了应用程序的性能和可扩展性。如果您在 InProc 模式下使用 Client Cache,则可以达到 InProc 速度。 NCache 提供两种客户端缓存:常规客户端缓存和全数据客户端缓存。每种缓存都旨在通过减少网络调用来提升性能,同时保持与集群缓存的同步。

常规客户端缓存

常规客户端缓存充当客户端计算机上的本地 (L1) 缓存,将频繁访问的数据子集保存在靠近应用程序的位置。这减少了对集群缓存 (L2) 的重复网络访问。为了保持一致性,客户端缓存通过接收更改通知与集群缓存保持同步。由于它不保存完整的数据集,因此所有查询仍针对集群缓存 (L2) 执行。

全数据客户端缓存

完整数据客户端缓存更进一步,将整个数据集缓存在客户端计算机上。它提供以下优势和选项:

  • - 在本地缓存完整的数据集:缓存选定的 .NET 类的所有条目,使完整的数据集可立即使用。
  • - 接近进程内速度:全数据客户端缓存提供更快的读取操作,并允许 SQL 查询完全在客户端缓存上运行,因为完整的数据集存在于本地。
  • - 与集群缓存同步:它与集群缓存保持完全同步以确保一致性。
  • - 严格查询执行:此强制措施可确保仅当完整数据集在本地可用时才运行查询。如果数据集仅部分加载,查询将立即失败,而不会回退到集群缓存。
  • - 严格的本地读取:强制所有读取操作严格从客户端缓存中获取。如果本地找不到某个键,则会返回缓存未命中,而不是从集群缓存中获取。

在您的应用程序本地时,客户端缓存不是独立的。 相反,它始终与集群缓存同步。 这可确保客户端缓存中的数据永远不会过时。

NCache 客户端缓存(L1)与集群缓存(L2)同步,以实现进程内速度。
NCache 客户端缓存,实现亚毫秒级进程内性能。

以下是镜像缓存的一些特性。

  • - 适合阅读密集型案例:客户端缓存非常适合读取密集型用例。但是,如果写入次数与读取次数相同,则客户端缓存实际上会更慢,因为写入操作需要更新两个位置的数据
  • - 像本地缓存一样更快的速度(InProc / OutProc):客户端缓存可以存在于应用程序进程内(InProc 模式),也可以存在于 Web/应用服务器本地(OutProc 模式)。无论哪种情况,与直接从集群缓存中获取数据相比,它都能显著提升应用程序性能。InProc 模式允许您将对象缓存在“应用程序堆”中,从而实现任何分布式缓存都无法比拟的“InProc 速度”。
  • - 不是独立的缓存:客户端缓存可能是本地缓存,但它不是独立的缓存。它与集群缓存同步。这意味着,如果另一个客户端更新了您客户端缓存中的集群缓存数据,集群缓存会通知客户端缓存使用该数据的最新副本进行更新。并且,此操作是异步但即时完成的。
  • - 乐观/悲观同步:默认情况下,客户端缓存使用乐观同步,这意味着 NCache 客户端假定客户端缓存中的所有数据都是最新副本。如果客户端缓存中没有任何数据,客户端会从集群缓存中获取数据,将其放入客户端缓存中,然后返回给客户端应用程序。悲观同步意味着缓存客户端首先检查集群缓存中是否有缓存项的更新版本。如果有,则客户端会获取该缓存项,将其放入客户端缓存中,然后返回给客户端应用程序。否则,客户端将返回客户端缓存中的所有内容。
  • - 无需更改任何代码的插件:使用客户端缓存无需更改应用程序代码。只需进行简单的配置更改即可。

接下来做什么?

常见问题

NCache 通过使用 1000 桶分布图将数据分区到多个服务器节点上,实现了线性可扩展性,从而使集群能够在运行时随着新硬件的添加而处理不断增加的事务负载。

NCache 采用 100% 对等架构,其中每个服务器都是对等节点;如果任何节点(包括集群协调器)发生故障,其余节点会自动选举一个新的协调器,并通过基于 TCP 的心跳重新平衡集群,以保持 100% 的正常运行时间。

虽然两者都提供线性可扩展性,但分区缓存提供最高速度,却没有数据冗余;而分区副本缓存是最受欢迎的选择,因为它通过创建每个分区的被动副本,在极致性能和高可用性之间取得了平衡。

NCache 它利用智能检测和恢复算法解决脑裂问题,该算法可以自动协调不同的子簇并恢复数据完整性,而无需人工干预。

An NCache 客户端缓存(L1)通过将频繁访问的数据子集直接存储在应用程序服务器上,提供亚毫秒级的进程内速度,从而大幅降低到集群缓存(L2)的网络延迟。

是的, NCache 支持动态集群,可通过实时自动更新集群分布图并将其传播到所有客户端,实现零停机时间的服务器成员扩展或删除。

联系我们

联系电话

+1 214-619-2601 (美国)

+44 20 7993 8327 (英国)

©版权所有 Alachisoft 2002 - 版权所有。 NCache 是 Diyatech Corp. 的注册商标。