NCache 建筑

NCache 是一个适用于 .NET、Java、Node.js 和 Python 的开源内存分布式存储。 NCache 非常适合高事务服务器应用程序,因为它速度极快且可线性扩展。 使用 NCache 消除性能瓶颈并将应用程序扩展到极限事务处理 (XTP)。 NCache 还提供智能数据复制和动态集群以实现高可用性。

NCache 自2005年以来一直非常受欢迎,全球数百名高端客户使用它。

 

动态集群(高可用性)

NCache 具有基于对等架构的自我修复动态缓存集群,可提供 100% 的正常运行时间。 这是一个基于 TCP 的集群,其中没有主/从节点,而是集群中的每个服务器都是对等点。 这允许您在运行时从集群中添加或删除任何缓存服务器,而无需停止缓存或您的应用程序。

 

点对点集群(自我修复)

NCache cluster 具有点对点的集群架构。 这意味着没有主/从节点,每个服务器都是对等节点。 有一个集群协调器节点,它是集群中最旧的节点。 如果集群协调器节点出现故障,下一个最早的节点将自动成为协调器。

集群协调器管理所有与集群相关的操作,包括添加或删除节点时的集群成员资格、节点的分布图 分区缓存 / 分区副本缓存 拓扑和其他缓存配置信息。 Cluster Coordinator 还管理集群运行状况,并强制删除与集群中所有其他服务器部分连接的任何缓存服务器。

 

动态聚类

NCache 有一个 动态集群架构. 这意味着你可以 or 去掉 集群中的任何缓存服务器,无需停止缓存或应用程序。 每当您添加或删除缓存服务器时,集群成员资格都会在运行时立即更新,并传播到集群中的所有服务器以及连接到集群的所有客户端。 这种运行时更新和传播允许 NCache 即使进行此类更改,也始终保持正常运行。

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

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

裂脑集群处理

的另一部分 NCache 动态集群是它的智能 裂脑检测和恢复 能力。 脑裂本质上是由于某些网络问题,这些缓存服务器之间的网络连接中断,从而导致多个独立的子集群,其中每个子集群假设所有其他缓存服务器都已关闭,并且它是正确的剩余集群。

在这种情况下, NCache 服务器意识到其他缓存服务器突然离开集群,因此它们不断尝试与它们重新连接。 然后,当网络问题消失后,这些 NCache 服务器能够与其他缓存服务器重新连接。 但是,现在每个子集群都并行更新缓存,而不与其他缓存服务器同步,因此跨子集群存在多个版本的数据。

NCache 提供了一种从这种“脑裂”中恢复的方法,通过自动决定哪些缓存服务器必须放弃其数据而其他缓存服务器可以保留其数据。 虽然存在一些数据丢失,但最终结果是在无需任何人为干预的情况下快速恢复缓存集群。

 

动态客户端连接

NCache 也让你 在运行时添加或删除缓存客户端 无需停止缓存或其他客户端。 当您添加客户端时,该客户端只需要知道集群中要连接的任何一台缓存服务器即可。 一旦连接到该服务器,它就会接收集群成员资格并缓存拓扑信息,并根据这些信息决定要连接到哪些其他服务器。

  • - 在运行时添加/删除客户端:无需停止缓存或您的应用程序。
  • - 分区缓存/分区副本缓存:客户端连接到所有缓存服务器中的所有分区(不是副本,因为分区与其副本通信)。 这允许客户端直接去数据所在的地方进行读写。 并且,如果将新服务器添加到集群中,则客户端会收到更新的集群成员资格信息,然后也连接到该新添加的缓存服务器。
  • - 复制缓存: 的情况下 复制缓存,客户端只连接到集群中的一个缓存服务器,但以负载平衡的方式确保所有缓存服务器具有相同数量的客户端。 客户端从该缓存服务器获取负载平衡信息,然后根据需要重新连接到适当的缓存服务器。 客户端只连接到一个缓存服务器,因为每个服务器都有整个缓存,所以所有的读取和写入都可以在那里进行。
  • - 镜像缓存: 的情况下 镜像缓存,客户端只连接到这个 2 节点集群中的活动节点。 如果客户端连接到被动节点,被动节点会告诉客户端主动节点,客户端会自动重新连接到主动节点。 如果主动节点宕机而被动节点变为主动节点,所有客户端都会自动连接到新的主动节点。
 

动态配置

NCache 还提供缓存和客户端的动态配置。 目的是允许您稍后在缓存运行时进行更改,而无需停止缓存或您的应用程序。

  • - 在运行时传播到所有服务器和客户端:这包括所有配置及其更改以及分布图。
  • - 缓存配置:当通过管理工具创建缓存配置时,此配置信息将复制到当时已知的所有缓存服务器。 并且,在运行时添加的任何新服务器都会接收整个缓存配置并将其复制到其本地磁盘。
  • - 热应用配置更改:您可以在运行时通过“更改一些缓存配置”热申请"的特点 NCache. 当您这样做时,更新的配置信息会在运行时传播到所有缓存服务器并保存在它们的磁盘上。 该信息的一部分也会发送给与其需求相关的所有客户。
  • - 分布图(分区/分区副本缓存):这是在缓存启动时创建的,然后复制到所有缓存服务器和缓存客户端。 此分布图包含有关哪些存储桶(集群缓存中总共 1000 个存储桶)位于哪个分区的信息。
 

集群内的连接故障转移

集群中的所有缓存服务器都通过 TCP 相互连接。 而且,每个缓存服务器都连接到集群中的所有其他缓存服务器,包括在运行时添加的任何新服务器。 NCache 提供各种方法来确保集群内的任何连接在连接中断的情况下仍保持活动状态。 连接中断通常是由于路由器或防火墙引起的网络故障或网卡或网络驱动程序的问题而发生的。

  • - 连接重试:如果两个缓存服务器之间的连接中断, NCache 服务器自动进行多次重试以建立此连接。 这些重试一直进行到“超时”时间用完为止。 在大多数情况下,这会重新建立连接。
  • - 保持心跳: NCache 还有一个功能是让每个缓存服务器不断向所有其他服务器发送一些小数据包作为心跳。 这确保了如果存在网络套接字损坏问题,缓存服务器将知道它并通过重试来修复它。
  • - 部分连接的服务器:尽管重试,有时连接在超时期限内仍未恢复,并且缓存服务器假定一个或多个其他缓存服务器已关闭。 因此,没有它们,它仍然可以继续工作。 但是,实际上其他服务器并没有关闭,并且实际上可以被集群中的其他一些服务器看到。 这称为部分连接的服务器。 发生这种情况时,集群协调器会记录下来并从集群中强制删除“部分连接”的服务器。 通过这样做,集群再次变得健康。 并且,被移除的服务器可以通过手动干预重新加入集群。
 

与客户端的连接故障转移

根据缓存拓扑,所有缓存客户端都通过 TCP 连接到集群中的一个或多个缓存服务器。 对于分区/分区副本缓存,每个客户端都连接到所有缓存服务器。 对于复制缓存,每个客户端通常通过缓存服务器使用的负载平衡算法仅连接到一个缓存服务器。 而且,对于镜像缓存,所有客户端仅连接到主动节点,并且仅在主动节点关闭并且被动节点变为主动节点时连接到被动节点。

  • - 连接重试:如果客户端和缓存服务器之间的连接中断, NCache 客户端自动执行 多次连接重试 建立这个连接。 这些重试一直进行到“超时”时间用完为止。 在大多数情况下,这会在客户端应用程序甚至没有注意到它的情况下重新建立连接。 如果无法建立连接,则会向客户端应用程序抛出异常,以便它可以处理它。
  • - 保持心跳: NCache 还有一个功能是让每个客户端不断发送一些小数据包作为 心跳 到它连接到的所有缓存服务器。 这确保了如果存在网络套接字损坏问题,客户端将知道它并通过连接重试来修复它。
  • - 部分连接的客户端(分区/分区副本缓存):尽管进行了重试,但有时连接在超时期限内仍未恢复,并且缓存客户端认为它无法到达一个或多个其他缓存服务器,即使它们可能没有关闭。 因此,在分区/分区副本缓存的情况下,它会与其他服务器交互以读取或写入所有数据,即使其分布图告诉它无法与之通信的服务器拥有数据。 在这种情况下,另一个缓存服务器充当中介来成功执行操作。
  • - 与服务器断开连接(复制/镜像缓存):在复制缓存的情况下,客户端仅与一台服务器连接,如果该连接中断,客户端会自动连接到其他缓存服务器之一。 在镜像缓存的情况下,如果客户端无法连接到主动节点,则它会假设它已关闭并尝试连接到被动节点。
 

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

NCache 提供多种缓存拓扑,以实现线性可扩展性,同时保持数据的一致性和可靠性。 这样做的目的是满足从非常小的两服务器缓存运行到由数十甚至数百个缓存服务器组成的非常大的缓存集群的应用程序的需求。 缓存拓扑本质上是跨多个缓存服务器的集群缓存中的数据存储、数据复制和客户端连接策略。

 

参考数据与交易数据

参考数据是不经常更改的数据,您可以将其缓存以一遍又一遍地访问并偶尔更新它。 另一方面,事务性数据是变化非常频繁的数据,您可以随时更新它。

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

所有缓存拓扑都适合参考数据,但只有某些缓存拓扑特别适合事务数据。 您需要确定要执行的读取次数与写入次数,以确定哪种拓扑最适合您。 此外,某些缓存拓扑的扩展性不那么大,尤其是对于更新而言,因此也请记住这一点。

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

  • - 分区缓存(无复制): 非常好. 读写速度超快,还可以通过添加服务器进行线性扩展。 最快的拓扑,但不复制数据,因此如果缓存服务器出现故障,则会丢失数据。
  • - 分区副本缓存 (最受欢迎): 非常好。 读取和写入速度超快,还可以通过添加服务器进行线性扩展。 第二快的拓扑,但可以在不影响线性可扩展性的情况下复制数据以提高可靠性。 速度/可扩展性和数据可靠性的最佳组合。
  • - 复制缓存: 非常适合较小的环境。 读取速度超快且可线性扩展。 在 2 节点集群中写入速度适中,但不会随着添加更多服务器而扩展,因为写入是在所有缓存服务器上同步完成的。
  • - 镜像缓存: 非常适合较小的环境。 读取速度超快。 对于 2 节点主动/被动,写入速度比复制缓存更快。 但是,不会超出此范围。
  • - 客户端缓存: 非常适合阅读密集型使用 与所有缓存拓扑。 允许您通过分布式缓存实现 InProc 速度。
 

分区缓存

分区缓存是读取和写入的最快和最具可扩展性的缓存拓扑。 它适用于更大的缓存集群,即使在峰值负载下,读取和写入的性能仍然非常好。 但是,它不会复制数据,因此如果缓存服务器出现故障,则会丢失数据。

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

  • - 动态分区:缓存在运行时被划分为多个分区,每个缓存服务器有一个分区。 每个集群缓存总共有 1000 个存储桶,均匀分布到所有分区。 添加/删除缓存服务器会导致在运行时创建/删除分区。 当数据添加到缓存时,分区的存储桶分配不会改变。 相反,它仅在添加或删除分区或发生数据平衡时发生变化(见下文)。
  • - 分布图:缓存集群创建一个分布图,其中包含有关哪些分区存在于哪些存储桶的信息。 每当添加或删除分区或发生数据平衡时(见下文),分布图都会更新。 分布图传播到所有服务器和客户端。 客户端使用它来确定与哪个缓存服务器通信以读取或写入某个缓存项。
  • - 动态数据平衡:由于所有存储桶实际上都是 HashMap 存储桶,其中数据基于键上的哈希算法存储,因此根据使用的键,某些存储桶可能比其他存储桶拥有更多数据。 如果这种不平衡超过了可配置的阈值, NCache 自动移动存储桶以平衡此负载。
  • - 客户端连接到所有分区:客户端连接到所有缓存服务器,以便它们可以在一次请求中直接从服务器读取或写入数据。 如果客户端与缓存服务器的连接断开,则它会要求其他服务器之一读取或写入它无法访问的服务器上存在的缓存项。 并且,该服务器可以帮助客户端实现这一目标。
 

分区副本缓存

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

就像 分区缓存, Partition-Replica Cache 是一种非常快速且线性可扩展的缓存拓扑,适用于读取和写入。 它适用于更大的缓存集群,即使在峰值负载下,读取和写入的性能仍然非常好。 最重要的是,分区副本缓存还复制数据,因此即使缓存服务器出现故障也不会丢失数据。

分区副本缓存是我们的 最流行的缓存拓扑 因为它为您提供了两全其美的性能/线性可扩展性和数据可靠性。

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

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

复制缓存

复制缓存通过在两个或多个缓存服务器上进行复制来提供数据可靠性。 它的读取速度非常快且可扩展。 但是,它无法针对写入进行扩展,因为它们与集群中的所有服务器同步。 对于 2 节点集群,写入速度比数据库快,但不如分区副本缓存快。 对于 3 个或更多服务器集群,写入性能会下降并最终变得没有吸引力。

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

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

镜像缓存

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

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

  • - 1 个主动服务器和 1 个被动服务器:镜像缓存只有两台服务器。 一种是主动的,另一种是被动的。 他们都有整个缓存的副本。 如果活动服务器出现故障,被动服务器会自动变为活动服务器。 而且,如果之前关闭的主动服务器重新启动,它将被视为被动服务器,除非您在运行时通过管理工具更改此指定。
  • - 具有故障转移支持的客户端连接:每个缓存客户端仅连接到集群中的Active Server 进行读写操作。 如果该主动服务器出现故障,所有客户端都会自动连接此时已变为主动的被动服务器。 这种故障转移支持可确保即使服务器出现故障,镜像缓存也始终正常运行。
  • - 异步镜像:在主动服务器上完成的任何写入都会异步镜像/复制到被动服务器。 这可以确保被动服务器始终与最新数据同步,以防主动服务器出现故障并且被动服务器必须变为主动服务器。 异步镜像还意味着更快的性能,因为多个写入在被动服务器上作为批量操作执行。
 

客户端缓存(InProc 速度)

客户端缓存位于您的 Web / 应用服务器本地,并且非常靠近您的应用程序,并允许您缓存从分布式缓存(任何缓存拓扑)中读取的数据。 您可以将其视为“缓存之上的缓存”,并进一步大大提高了您的应用程序性能和可扩展性。 如果在 InProc 模式下使用 Client Cache,则可以实现 InProc 速度。

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

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

  • - 适合阅读密集型案例:仅当您有读取密集型用例(其中读取次数比写入次数多很多倍)时,客户端缓存才适用。 如果写入次数与读取次数相同,则客户端缓存实际上会更慢,因为写入涉及在两个位置更新它。
  • - 像本地缓存一样更快的速度(InProc / OutProc):客户端缓存存在于应用程序进程内部(InProc 模式)或 Web/应用服务器本地(OutProc 模式)。 无论哪种情况,与仅从集群缓存中获取此数据相比,它都可以显着提高应用程序性能。 InProc 模式允许您在“应用程序堆”上缓存对象,从而为您提供任何分布式缓存都无法比拟的“InProc 速度”。
  • - 不是独立的缓存:客户端缓存可能是本地缓存,但它不是独立的缓存。 相反,它使自身与集群缓存保持同步。 这意味着,如果另一个客户端更新您客户端缓存中的集群缓存中的数据,集群缓存会通知客户端缓存使用该数据的最新副本更新自身。 而且,这是异步但立即完成的。
  • - 乐观/悲观同步:默认情况下,客户端缓存使用乐观同步,这意味着 NCache 客户端假定客户端缓存拥有的任何数据都是最新的副本。 如果客户端缓存没有任何数据,客户端从集群缓存中获取数据,放入客户端缓存,然后返回给客户端应用程序。 悲观同步意味着缓存客户端首先检查集群缓存是否有更新版本的缓存项。 如果是,则客户端获取它,将其放入客户端缓存中,然后将其返回给客户端应用程序。 否则,它将返回客户端缓存中的任何内容。
  • - 无需更改任何代码的插件:关于客户端缓存的最好的事情是它不涉及应用程序中的代码更改。 相反,您只需通过配置更改将其插入即可。 和, NCache 幕后的客户端 API 知道如何使用客户端缓存。

接下来做什么?

联系我们

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