裂脑簇
当集群中的一个或多个节点与其他节点断开连接并导致子集群或裂脑集群形成时,就会发生这种情况。
从本质上讲,脑裂是一个基于与医学脑裂综合征类比的术语。 这种情况描述了数据或其可用性的不一致,这可能源于维护范围重叠的两个独立数据集。 这可能是由于网络设计中的服务器或由于网络中相应服务器之间的数据通信错误和不同步而导致的故障情况。 这通常也称为网络分区。
自 NCache 也是一个分布式缓存,可以包含多个节点和集群,裂脑集群的出现也是有可能的 NCache.
当裂脑发生时,就有可能形成子簇。 因此,必须删除其中一个子集群,以确保所有客户端都重定向到一个运行状况良好的集群。 由于删除子簇意味着数据将会丢失,因此根据以下标准选择要删除的子簇:
- 如果子簇大小不同,则删除节点数最少的子簇。 这是为了确保最小的数据丢失,因为较小的集群将包含较少的数据。
- 如果集群大小相同,则协调节点IP地址较高的子集群将被删除。 例如,子集群A和B的协调节点IP分别为20.200.20.38和20.200.20.40。 此时,协调节点IP为20.200.20.40的子集群将被删除。
裂脑可能表示由于维护范围重叠的两个独立数据集而产生的数据不一致或可用性问题。 此外,这可能会导致严重问题,并可能给管理员带来可怕的情况。 因此,确保不存在裂脑和数据损坏的风险非常重要。
发生脑裂后,有一些常用的方法来处理网络分区问题。
- 乐观的态度
- 悲观的方法
在乐观方法中,节点之间的通信通道被简单地恢复,同时让分区节点暂时照常工作。 这是假设节点将在短时间内自动同步来完成的。 这种方法可能只是一种简单的方法,因为在裂脑的情况下总是存在数据损坏的威胁。
另一方面,悲观方法要求放弃或干脆牺牲系统可用性以保持数据一致。 在检测到网络分区时,对子分区的访问受到限制。 这样做是为了确保数据一致性。 在这种情况下,为了避免历史分歧,只有一个组件可以继续向存储发出读/写请求。
通过以下方式处理裂脑集群 NCache
当裂脑发生时,网络中的集群节点在做出重要决策之前会经历一系列检查,例如哪些节点要关闭、重新启动、重新连接或从网络中删除。 NCache 提供了一种称为裂脑自动恢复的功能,默认情况下禁用该功能。 但是,可以根据数据敏感性和用户需求启用它,以防网络中发生裂脑。
NCache 仅针对副本分区拓扑提供此功能。 为了深入了解这一点,让我们看一下集群连接、分区-副本拓扑以及节点断开连接背后的场景。
集群连接
两个或多个节点可以连接并一起工作以形成集群。 集群中的每个节点称为成员。 一个簇在 NCache 可以被认为是一个群组通道,成员可以在其中通过发送或接收消息来相互交谈。 集群始终以网状拓扑形式形成,这意味着所有节点都是互连的。
每个集群由一个协调器节点和其余的非协调器或参与者节点组成。 协调器节点是最高级的节点,即最先启动的节点,负责大部分任务,例如节点添加或删除。 每当在集群中添加或删除节点时,它都会通知协调器节点,协调器节点管理其余操作以维护集群中的可连接环境。 协调器节点执行的其他任务包括存储桶分配、触发缓存加载器和连接维护。
一个集群可以分为以下几类:
- 全连接集群
- 部分连接的集群
- 已停止的集群
全连接集群
如果集群有 n 个节点,并且集群中的每个节点与所有其他节点都有健康的 n-1 个连接,则集群被称为处于完全连接状态。 在这种状态下,所有节点都可以相互通信,因此处于稳定状态。
下图是一个理想状态下的全连接集群。
如果一个集群处于全连接状态并且一个节点加入了集群,它就成为了相应集群的一部分/成员。 如果一个节点离开集群或部分断开连接,具有一个或多个成员节点,它将形成一个单独的集群。 协调节点通知所有现有节点网络中的这种变化。 这会触发状态转移,旨在平衡新集群中的数据。 根据拓扑,客户端连接分布在新节点之间。
客户端连接
如果集群处于健康状态,在 PoR 拓扑中,所有客户端都与集群的所有节点连接。 对于与分区副本 (PoR) 相关的裂脑情况,客户端连接到集群的所有节点。 如果节点加入,客户端也会连接到新节点。 如果节点离开,客户端可以继续执行操作。
停止
如果一个节点正常离开集群,即它已关闭并且相应节点没有主机进程,则该节点被视为已停止(涉及集群的其余部分)。 停止节点会导致状态转移,从而导致数据平衡。 这反过来又平衡了其余节点之间的客户端数量。 但是,此功能特定于 REP 拓扑。
客户端连接
之前连接到停止节点的客户端现在将连接到其他连接的节点。
部分连接的集群
在某些情况下,集群中的一个或多个节点可能无法连接到其他节点,例如由于网络故障。
假设有一个 3 节点全连接集群。 如果发生故障,三个节点中的两个仍然可以相互通信; 但是,第三个节点无法到达网络,则两个连接的节点将形成一个子簇,即子簇 1。第三个断开连接的节点将形成一个独立的子簇,即子簇 2。每个子簇-cluster 现在将拥有其协调器节点。 在这种情况下,集群将失去其理想的连接状态。 现在存在两个集群,它们之间无法通信,但在其子集群内完全连接。 这种状态称为集群的部分连接,如下图所示。
在上述场景中,子簇1和子簇2中的节点是子簇1与自身全连接,与子簇2全断开,反之亦然。
在更复杂的情况下,我们假设一个 5 节点集群,其中网络故障导致节点 5 断开与除节点 3 之外的所有节点的连接。在这种情况下,节点 3 仍然连接到节点 5,节点 3 仍然连接到节点 1。还连接到节点 2、节点 4 和节点 3。 现在,节点 1 是子集群 1(节点 4、节点 2 和节点 2)和子集群 5(节点 XNUMX)的公共成员。
下图说明了正在进行的部分连接。
每个集群将通知节点 3,要求其仅维持与一个集群的连接。 收到通知后,节点 3 将评估从何处接收通知,并将在主集群断开连接之前连接到包含最高级节点的子集群(在本例中为子集群 2)。
下图显示了集群最终状态下的部分连接情况。
连接重试
每个集群操作都有一个超时值,默认为 60 秒,可在 NCache 管理中心。 每个集群都有连接重试次数(默认值 2)和重试间隔(默认值 2)。 这两个值也可以在 NCache 管理中心。
每当集群中的节点连接断开时,主要协调节点会首先尝试重新建立连接。 如果重试连接成功并且没有发生超时,则集群将转为正常的完全连接状态。 但是,如果由于某种原因无法重新建立连接,则集群中的所有节点会形成多个子集群,从而导致部分连接。
新节点加入
如果集群处于部分连接状态,则任何新节点的添加都将针对在网络中保持适当连接的子集群部分进行。 如果两个子簇都连接,则加入规模较大的子簇,即节点数较多的子簇。 如果节点数量相等,则会与Coordinator节点进行IP比较,IP较大的会加入到Coordinator中。
客户端连接
在部分连接的情况下,由于集群处于不稳定的环境中,客户端应用程序可能会出现突然且不确定的行为。 如果一台客户端计算机连接到两个子集群,则某些客户端可能会连接到子集群 1,而其他客户端可能会连接到子集群 2。网络连接可能会导致所有客户端都连接到一个子集群。仅集群。 集群中也不会有数据一致性。
修复部分连接问题
为了解决脑裂问题, NCache 提供手动和自动恢复选项,如下所述。
手动分辨率
当集群进入部分连接状态时,需要重新启动。 第一个建议是尝试识别并解决导致其处于此状态的问题。 如果是网络问题,请尝试稳定网络。 解决问题后,关闭创建单个集群的节点,然后逐个启动它们。
例如,考虑图 3 中的集群。可以看出,子集群 1 中的节点 2、节点 4 和节点 1 是全连接的,而子集群 3 中的节点 5 和节点 2 是全连接的。故障导致创建子集群2,需要关闭节点3和节点5。尝试修复导致网络故障的问题。 完成后,逐个启动每个节点。 启动的节点将成为子集群1的一部分,然后子集群XNUMX将变成全连接集群。
裂脑自动恢复
为了迎合裂脑, NCache 还提供了一种自动方法,即通过以下方式进行裂脑自动恢复选项 NCache 管理中心。 由于数据可以是各种类型并具有不同的敏感度级别,因此默认情况下禁用此选项。 这完全取决于管理员 NCache 管理中心根据情况认为必要时是否启用。 要为集群启用裂脑自动恢复,请参阅 启用裂脑自动恢复使用 NCache 管理中心.