NCache 裂脑恢复架构和演示

NCache 提供了一种重要的高可用性架构功能,称为裂脑检测和恢复。 观看此视频以了解此功能,然后查看动手演示 NCache 裂脑恢复。

今天我就来说说 NCache 脑裂恢复架构,并给你一个演示。

ncache-在关键任务应用程序中

NCache 是 .NET 的内存中分布式缓存和 .NET Core 应用程序。 它还支持 Java 和 Node.js 应用程序。 NCache 用于您的应用程序在多个应用程序服务器上运行的高级事务应用程序。 这些可能是您的 Web 应用程序、微服务应用程序或任何其他服务器应用程序。 和, NCache 位于应用程序层和您的数据库之间,可以是 SQL 服务器或 Oracle 类型的关系数据库或任何 NoSQL database 像 CosmosDB 或 MongoDB 或任何遗留的大型机数据库或数据。 和, NCache 通常在一个集群中有两个或多个缓存服务器,并且对于这个关键任务应用环境 NCache 为您提供高可用性,作为高可用性的一部分,我将讨论一个非常重要的功能,称为裂脑检测和裂脑恢复。

动态缓存集群架构

在我进入脑裂之前,让我快速给你一个概述 NCache 动态缓存集群架构。

动态缓存集群

这是一个基于 TCP 的体系结构,其中每个服务器都通过 TCP 套接字连接到每个其他服务器。 它是一种可自我修复的点对点架构。 自我修复意味着它会自动调整自己以适应任何变化。 而且,由于采用了对等架构,因此不会出现单点故障。 这意味着没有主人就没有奴隶。 有一个集群协调器节点,它通常是集群中最老的节点。 但是,如果出现故障,下一个最旧的节点会自动成为其继任者。 集群协调器负责管理集群。 它管理集群成员。 在分区或分区副本拓扑的情况下,它管理数据分布图。 而且,它还管理集群的健康状况。

现在,正如我所说,该集群中的每个节点都与其他节点相连,并且它会跟踪该连接。 而且,如果该连接中断,则集群中有一个连接故障转移功能,即该节点会自动重试,多次重试是可配置的选项,并且每次重试都有超时。 而且,还有一个心跳功能,它会以可配置的时间间隔不断发送心跳,以确保该套接字连接已启动。 完成所有这些的原因是因为在大多数情况下,这足以确保自动恢复或恢复任何连接中断。 而且,这样做的原因是因为缓存服务器通常部署在同一个数据中心,实际上是在同一个子网中。 因此,这些缓存服务器之间的连接通常非常可靠。 而且,裂脑并不经常发生,但有时会发生。 而且,当它发生时,我将讨论我们如何管理它。

无论如何,这种架构允许您在运行时添加或删除任何缓存服务器,而无需停止缓存或任何应用程序。 并且,每当您将缓存服务器添加到集群时,集群协调器都会更新集群成员映射并将其动态传播到所有缓存服务器,然后再动态传播到所有客户端。 然后类似地,如果它是分区或分区副本拓扑,那么即使数据分布图也会更新,您可以进入 NCache 架构视频以获取更多详细信息。 但是,一个分区或分区副本拓扑有 1000 个存储桶,这是分布图,并且该映射基本上告诉服务器每个服务器具有哪些存储桶,以及何时将其发送给客户端,客户端知道数据在哪里。 所以,这就是动态缓存集群。

动态客户端连接

第二个方面是动态客户端连接,就像集群内的连接是动态的一样,客户端与集群之间的连接也是动态的。

动态客户端连接

而且,它是一个非常轻量级的基于 TCP 的连接。 而且,如果该连接出现故障,则会再次出现连接故障转移功能,其中存在重试和超时。 而且,还有保持活动功能,客户端不断向集群发送心跳类型的消息,以确保连接保持正常。 实际上,客户端和集群之间的连接中断概率比集群本身更大,原因是客户端可以部署在单独的子网中,甚至跨越防火墙。 因此,所有这些通常都会增加套接字损坏的机会。 因此,无论何时发生这种情况,客户端都可以重新连接。 所以,有一个连接故障转移功能。

整个架构允许您在运行时添加或删除客户端,而无需停止缓存或应用程序。 而且,每当添加客户端时,客户端都会从集群中获取集群成员信息,然后如果它是分区或分区副本拓扑,那么它还会从集群中获取我在此处显示的数据分布图。 而且,这允许客户端自动知道集群中有多少台服务器,它们是谁。 因此,您可以仅在分区或分区副本拓扑中连接到它们,并且还知道数据分布图是什么。

裂脑检测

因此,考虑到所有这些架构,尽管 TCP 连接通过重试和超时内置了弹性,但仍然存在这种情况,但由于某种原因,缓存服务器之间的连接实际上可能会中断。 这可能是硬件原因。 这可能是网络驱动程序问题,也可能是各种原因。 每当发生这种情况时,我们称之为连接中断。

脑裂检测

因此,在缓存集群架构中,集群中的每个节点都在不断检测是否存在连接中断,这意味着尽管重试连接仍然中断。 每当连接中断时,每个节点都假定另一个节点已经死亡。 因此,它一直与所有其他节点通信。 因此,例如,如果您在这里有一台服务器,则该节点正在与所有这三个服务器进行通信。 所以,这个节点可能会挂掉。 所以,这个节点也许可以和这三个人对话。 当这种情况发生时,它将假设这三个现在是一个由三个组成的集群,并且该节点已经离开。 所以,当这样的事情发生时,比方说,一个由六个节点组成的集群,我将举一个例子,连接中断的方式使得它们中的三个能够相互通信,这两个是能够互相交谈,而这个无法与任何人交谈。

因此,当这些节点检测到所有这些时发生这种情况时,他们都会假设,好吧,我是三个节点的集群,因为我能够与这三个节点通信,当我是三个节点的集群时,我的一个节点将成为一个集群协调器,它可能已经是一个集群协调器,因为如果它是 s1,它可能是最旧的,并且它仍然是这里的集群协调器。 但是,在拆分二的情况下,s4 成为该集群的新集群协调器。 并且,对于 split 3,s6 作为唯一节点也成为协调器。 现在,在这种情况下,这些节点知道这三个节点能够与这三个节点通信。 所以,它说好吧,我很好,其他人都死了。 这也是这么想的,我还好其他人都死了。 这些认为我很好其他人已经死了。

但是,他们也知道,我应该是一个由六个节点组成的集群。 因此,他们不断尝试 ping 所有其他节点,以查看它们是否会恢复正常。 而且,ping 发生在一个可配置的时间间隔内,之后他们将放弃并假设这些节点已经永久关闭,而我是唯一剩下的一个。 但是,在那个时间间隔内,假设连接,网络连接恢复并且这些节点现在彼此可见。 所以,假设他们在这个例子中都能看到对方。 所以,现在他们意识到哦,我们已经创建了三个独立的拆分,但我们可以互相交谈。

所以,现在他们将正式, NCache 将正式检测分裂。 即使分裂发生在连接断开的那一刻, NCache 节点不知道这是分裂,因为他们认为他们都死了。 但是,如果这些节点在指定的时间间隔内返回,那么缓存节点会说,好的分裂已经发生,现在是时候进行分裂恢复了。 而且,这样做的原因是因为您的应用程序需要一个健康的缓存集群才能继续工作,虽然拆分不是一个健康的情况,但如果您可以自动从中恢复,而不是您的管理员人员不得不在奇怪的时间进行干预白天或晚上或周末。 然后它让你的生活更轻松 NCache 自动回到健康状态,一个健康的六个集群。 但是,这是怎么发生的?

首先是检测到拆分,因为我说过只有在连接恢复并且它们能够看到对方时才检测到它。 在那之前,他们认为其他人已经死了。 好的? 现在检测到分裂,现在分裂恢复开始了。

裂脑恢复

拆分恢复涉及什么?

脑裂恢复

因此,在拆分恢复中,首先合并两个最大的子集群或两个最大的拆分。 并且,这个分裂的集群和这个分裂的集群,他们相互协调说好,因为我是两者中较小的一个,这里的大小基于每个集群中的节点数。 它可能是基于数据量的。 它可能基于活动量和客户端数量,但我们选择了节点数量,因为这是最有可能的情况。 因为,在大多数情况下,由于哈希映射分布,每个节点的数据量几乎相同,因为有一千个桶是均匀分布的,因为在 NCache 如果数据不平衡,它会在节点之间重新平衡数据。

因此,所有这一切都意味着最有可能的情况是每个节点的数据量大致相同。 因此,最大数量的节点意味着最大的数据量。 就这样,成为了主人。 并且,这个另一个分裂必须放弃它的数据并作为新节点重新加入这个集群。 所以,它做的第一件事就是放弃它的客户,它告诉我们。 所以,这两个服务器,这个协调器告诉它的另一个节点,好的,我们需要放弃客户端并告诉客户端连接到这个集群。 所以,发生的第一件事是客户端移动到新集群,因为这是健康的,这是主集群。 一旦客户端移动到这里,现在这个集群就会放弃它的数据,基本上你可以看到它重新启动。 虽然,它不会重新启动,它只是放弃它的数据并重新加入这个集群作为一个健康的节点。

现在,作为结果,您有一个五节点集群,它是拆分 XNUMX 和拆分 XNUMX 的合并。 因此,在完成之后,它会进入下一个最大的拆分并将其与此合并。 现在,在我们的例子中,我们只有三个分割,但你可以有超过三个,算法是你从最大的开始,然后将它与下一个最大的和下一个最大的等等合并。 因此,您可以根据需要进行尽可能多的迭代,但在任何时间点都只会合并两个拆分。 因此,虽然这两个拆分正在合并,但第三个拆分被认为是独立的,它将继续执行其操作,直到拆分合并,现在此合并即将发生。

并且,如果有第四个拆分也将在此拆分之后合并。 所以,在这个过程中,请注意,取决于有多少节点必须丢失或放弃其数据,您将丢失数据。 因此,例如,在这种情况下,三个节点成为主节点,其他三个节点丢失数据。 即使在分区副本拓扑中,每个分区也只有一个副本。 因此,您将丢失数据,而这只是这种情况的一部分。 然而,这个现实的另一部分是,如果对于数据缓存的情况,这个数据已经来了。 这已经存在于数据库中。 因此,您不会丢失数据,只需从数据库中重新加载即可。 您可以根据应用程序操作的命中和未命中重新加载它。 您也可以根据通读重新加载它。 您还可以根据缓存刷新功能重新加载它 NCache 但无论哪种方式,数据都不会丢失。

但是,如果数据更多的是会话状态,任何其他临时数据,不存在于永久存储中,那么您丢失的数据。 因此,在这种情况下,您必须重新创建这些会话。 但是,尽管数据丢失仍然是一个更好的情况,因为毕竟您遇到了网络故障。 所以,这有后果。

在下一个版本中 NCache,我们将提供一个持久性功能,您可以在其中持久化缓存。 而且,持久缓存意味着缓存中的任何内容都保留在自己的位置, NCache自己的持久性存储,并且以这种方式在脑裂恢复中,即使是瞬态数据也不会丢失,因为 NCache 正在将其副本保存在持久存储中。 但是,当该功能公开时,我会讨论这个问题。 所以,这个时候我就只谈这个。

动手演示

所以,我希望我已经解释了这个架构。 现在,我将向您演示如何在 NCache. 所以,我有一个例子,我有五个缓存服务器,我将在这个列表和这个列表之间创建一个拆分。

集群拆分 ips

我只是要创建这两个拆分。 拆分一将包含这两个缓存服务器,拆分二将包含这两个缓存服务器。 而且,我有一个我要使用的 Windows 客户端,我现在就坐在那里,我将用它来进行管理和监控。 而且,我有一个 Linux 客户端,我有两个架子对这个客户端开放。 因此,我可以从那里启动两个单独的客户端应用程序。 所以,我现在正在运行这个集群。 我不会向您展示如何添加此集群,因为还有其他视频向您展示了如何做到这一点。 我只是要向你展示它的裂脑部分。

监控集群运行状况和统计信息

所以,在这里,我有一个五节点集群。 我有一个五节点集群。 所以,我有一个五节点集群,它就在这里并且正在运行。 好的,我将继续打开统计信息,我还将打开它的监视器。 所以,我所做的是我打开了两个不同的 NCache 管理器窗口。 一个连接到这里的 .97,一个连接到这里的 .82。 所以,这个是 97,我有真正的经理。 我有监视器,我有统计数据。 而且,第二个是 .82,我将再次这样做。 这是同一个集群,但我只是在与不同的服务器进行管理。 与此服务器相比,我正在与此服务器交谈,就在这里。 而且,在这里,我将再次进行统计。 所以,我可以看到活动。 目前没有任何活动,因为我还没有运行任何客户端。 而且,我还要打开监视器。

演示缓存

那么,我为什么要打开其中的两个? 因为,我要监控,我要连接到这个节点,我要连接到这个节点。 因此,当我进行拆分时,我可以看到。 因为,如果我只在拆分发生时连接到这个,它只会表明我只剩下两台服务器,而这些服务器将无法看到。 所以,我想从两个角度来看待这一点。 因为,我将介绍通过防火墙规则进行拆分,当然,在您的情况下,您将没有防火墙规则。 您将遇到某种网络中断。 所以,我将通过防火墙规则来介绍或模拟它。 所以,我现在连接到这个节点进行管理和监控,并连接到这个节点进行管理和监控。 而且,我现在要来这里,我要……哦不,还没有。

我还将使用此命令行来调用 Get-Caches-Server,我将在此处与 .82 交谈。

命令行 82

我要和 82 谈谈,告诉我你拥有的所有缓存的详细信息。 所以,.82 是说,我有一个名为 democache 的缓存,其中有五台服务器; 82、102、122、97 和 117。一个五服务器集群,因为现在没有拆分。

我要去另一台服务器,97。

命令行 97

我要问同样的事情。 我说给我你的服务器。 一切都很好,我有一个五服务器缓存; 目前为 82、102、122、97 和 117。 所以,它是五台服务器集群,没有拆分,一切都很好。

使用 Test-Stress Powershell Cmdlet 模拟压力

一切正常。 我现在要启动应用程序。 我有一个 PowerShell 窗口。 实际上,这是一个 Linux 机器。 我要告诉你这里发生了什么。 来吧! 我只是要再次打开 PowerShell。 我很抱歉。 我只是要导入这个模块,它是 NCache 管理模块。 您只需要在 Linux 上执行此操作。 您不必在 Windows 上导入它。 然后我会说Test-Stress democache。 好的。 所以,现在我已经运行了这个工具之一。 我将在这里做同样的事情。

测试压力演示缓存

我要说的是Test-Stress democache。 这两个我都有。 现在看,我有活动发生。 正如您在此处看到的,我在所有五个节点上都发生了活动,一二三四五。 在所有五个节点上,我都有活动发生。 在这里,我可以看到。 这里也是。 我有五个节点。 我又说 97,现在是 97。

97 端口拆分前

让我们看看我是否也可以在这里看到相同的内容。 所以,我将转到 .82,看看我有五个节点活动正在发生。 统计窗口也显示活动。

82 端口拆分前

好的! 所以,一切正常。 通常,我不会在两个不同的服务器上打开这个和缓存管理器监视器。 我打开的原因是因为我需要展示分裂,当分裂发生时,我需要从分裂的双方向你展示正在发生的事情。

导致网络断开

好的! 现在我一切都在运行。 我现在要继续介绍。 所以,我要做的是在这两个盒子上,我将使用防火墙规则。 所以,我将在这里使用防火墙。 我将在这里使用防火墙。 所以,我已经制定了这两条规则。 所以,我要登录。 我在这里登录97。 我这里有个规矩。 我要去假设我有一个入站规则。 它是 NCache, 我只是叫它 NCache 脑裂。 这条规则是说阻止那些端口上的连接,78 到 7900,那是缓存。

入站规则裂脑

NCache 为每个缓存启动一个单独的进程。 因此,该缓存进程默认使用 7800 到 7900 端口。 虽然它是可配置的。 因此,您可能正在使用不同的端口,在这种情况下,如果您想模拟它,您必须阻止这些端口。 并且,端口 8250 是管理端口。

设置范围

Scope 是说阻止 82、102、122。所以,我要告诉这个,阻止这三个框访问你,这基本上就是它的意思。

所以,我有这个端口。 我要说启用规则,并且我有相同的端口用于出站规则。 这是一个......所以,它正在阻止出站。 而且,现在我要去 117 并阻止它。 我会来 117。再说一次,我这里有一个入境口岸。 这里也一样。 块连接,端口,78 79,范围,所有这三个框。 好的。 所以,我要说启用规则。 这是启用的。 我要去另一个我会说在这里启用规则。

启用防火墙规则

好的,现在我所做的,我已经打开了所有这些的防火墙。

两个子簇的形成

所以,现在分裂将开始发生。 虽然它不会立即发生,但我可以看到,我将首先询问 82 这是哪个,缓存中有多少台服务器? 它说好的! 我有 82、102、122、97、117。所以,它仍然有全部五个,因为尚未发生拆分。 它仍在经历重试和所有其他事情。 我要问另一个,你有多少台服务器? 它仍然有一、二、三、四、五。 因此,还没有发生拆分,因为它仍然会重试和超时。 但是,分裂很快就会发生。

我要来这里看看它是否开始看到一些停靠点。 所以,我在这里和 97 说话,97 是双节点集群端。

分裂开始发生在 97

所以,97 告诉我它只是看到......所以,它不是看到 102、182、82 是说那些停止了,而是 97 和 117 运行良好。 好的! 让我们看看另一面展示了什么。 分裂的另一边,也就是这另一边。 所以,我在和 97 通话,现在我要和 82 通话,你可以看到这是 82,这里是 82。IP 地址……它说好的! 说 102, 122。所以说 122 是部分连接的,而 82 是完全连接的。

分裂开始发生在 82

它仍在经历这种复苏。 它仍在经历重试阶段,其中 122 无法与其他一些节点通信,但它会继续进行,接下来会发生什么,我将快速向您展示……

所以,这里有一个我告诉你集群中的特性,如果有一个部分连接的节点,它会从集群中删除部分连接或部分连接的节点,以创建一个健康的集群。 所以,现在正在发生的事情是它正在删除另一个集群,另一个节点,它是一个部分连接的节点。 现在,让我们再次来到这里,现在看看命令行是怎么说的。 我正在与 82 交谈,正如我所说,那是三节点集群。 所以,它应该……让我们看看它有多少? 糟糕,这里说的是 82,它有一个、两个、三个、四个。 所以,它有四个。 它还没有五个。 它有四个。 它仍在经历……它会强制删除节点,现在我要去 97,它就在这里,我会说好吧,你有多少台服务器? 而且,97只有两个。

所以,97已经确立了它看不到其他三个的事实。 所以,它认为我是这里唯一的集群。 它不知道有分裂,因为正如我所说的只有分裂, NCache 仅在此连接恢复时才知道拆分。 所以,现在它只是认为其他节点已经死了。 所以,它说好的,我将继续使用这两个节点。 而且,让我去这里的另一个。 让我们看看它有什么。 哦好的! 现在它也剩下三个了。 所以,它经历了,它也做到了。 它已删除部分断开连接的节点,现在可以到达一个健康的集群。 但是,它是一个只有三个节点的集群,对吧?

两台服务器上发生分裂

因此,我在这里与服务器 .82 进行了交谈。 我问它你的缓存中有多少台服务器,它说只有三台。 我问97你的缓存里有多少台服务器,它说只有两台。

好的! 所以,分裂发生了。 作为拆分的一部分,您将看到到目前为止应用程序没有抛出任何异常。 这意味着拆分已经发生,没有任何数据丢失。 这可能是应用程序没有遇到过,但在某些情况下,您会遇到一些异常。

网络还原时的脑裂检测和恢复

好的! 现在,我要做的下一步是继续前进并启动裂脑。 所以,我现在想恢复连接,以便检测到裂脑并开始恢复。 但是,在我这样做之前,我将在我的缓存配置中向您展示,如果我转到这里的第一个主题的集群设置,如果我一直走到底部,我已经启用了自动恢复脑裂。

自动恢复裂脑

因此,如果您启用自动恢复,这意味着 NCache 一旦检测到裂脑,就会自动从裂脑中恢复。 而且,正如我所提到的,它会在连接恢复时检测到裂脑。

所以,现在让我们回到 97 并关闭这个防火墙。 而且,我要先做97。 我要来这里,我会说,禁用这条规则,我会来这里,我会说禁用这条规则。

禁用防火墙 97

好的! 我已经做到了,现在我要来这里 117 我会说让我们也在这里禁用规则。 禁用规则。 禁用规则。 好的! 现在我已经禁用了规则。 因此,此防火墙已关闭,这意味着他们现在能够看到,或者很快,他们将能够看到彼此。 这不会立即发生,但他们将能够看到对方。 而且,如您所见……

所以,我实际上会再次来到这里,我会说给我看看你的缓存。 我又来了,我会把这个放在我面前,我会说确定我现在正在和 82 说话,我说给我看看你的缓存,82 说,我有 82、102、122。所以,所以到目前为止,它仍然有三个缓存。 它没有看到另外两个。 我要去另一个,我要说给我看你的缓存。 它说的是 97 和 117。到目前为止,裂脑恢复尚未开始,但它会开始。 这是因为重试需要一点时间。 正如您在此处看到的,我已经看到一二三四五服务器。 这里是一二三四五服务器。

脑裂恢复成功-ncache-经理

但是,我将再次依赖我的旧命令行 PowerShell 工具来告诉我。 我会这样做获取缓存调用。 我会和 82 谈谈,告诉我你有多少台服务器。 它仍然是一二三。 而且,我说告诉我你在这里有多少台服务器。 它仍然有一个两个。 所以,再次,一二和一二三。 所以,一直没有联系。 因此,裂脑尚未恢复。 而且,这就是为什么它仍然会部分连接,部分连接,并且客户端继续工作。

好的! 让我再走。 让我们再做一个。 它仍然没有完成。 好的! 到这里。 97..来吧! 好的! 现在,它开始看到另一个节点。 82、102、122 和 97 就在这里。 但是,它仍然是片面的。 它需要看到其中的两个,你应该看到分区和副本,这就是为什么它可能还不能与 97 对话,因为……好吧! 现在,82、102、122、97,这里又恢复了五个节点。 全部五个。

5 服务器恢复的 powershell-82 端口

让我去这个。 这个。 不知怎的……来吧! 我会在这里改变它。 所以,在这里我会说 82 而不是 97。 现在这样做。 我会看到 97 也向我展示了五个节点,一二三四五。 好的。 因此,所有五个节点都重新连接。

5 服务器恢复的 powershell-97 端口

我要来这里。 让我重新启动这台显示器。 我还会再来这里的。 这个缓存,我会说统计。 我看到所有五个都在工作,客户正在与他们交谈。 因此,客户端正在与所有五个通话的事实再次意味着客户端连接也会自动恢复。 而且,监视器也会在这里向我展示所有五个。 因此,如您所见,所有五个节点都是完全连接的。

统计窗口显示所有 5 连接为 97

好的! 现在让我来这里找另一个。 我去另一间了吗? 这个。 好的! 我会说好的统计。 所有五个都是我在这里与所有五个人交谈,正如你所看到的,他们所有人都在进行活动,我要说监控所有五个人都在这里发生。

统计窗口显示所有 5 连接为 82

结论

因此,我们从拥有一个健康的集群到进行拆分,再到再次拥有一个健康的集群。 而且,我们也可以在这里看到,我们有一个五节点集群。 所以,这几乎是这个演示的结尾。 请继续玩 NCache 并且看到,通过裂脑恢复,您拥有了这种额外的高可用性能力。

接下来做什么?

 

联系我们

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