企业模式数据库中的 K-safety

K-safety 设置企业模式数据库群集中的容错能力。值 K 表示复制数据库群集中的数据的次数。这些副本允许其他节点接管任何故障节点的查询处理。

在 Vertica 中,K 值可以为零 (0)、一 (1) 或二 (2)。如果 K-safety 为一 (K=1) 的数据库失去一个节点,该数据库可继续正常运行。其他节点发生故障时,只要群集中至少有一个其他节点拥有故障节点的数据副本,数据库都可以继续运行。将 K-safety 增加到 2 可确保 Vertica 在任何两个节点发生故障时仍可以正常运行。当一个或多个故障节点返回并成功恢复时,它们可以再次参加数据库操作。

K-safety 为 1 的数据库中有最多一半的节点出现故障可能不会导致数据库关闭。只要每个故障节点上的数据在其他活动节点上可用,数据库就继续运行。

伙伴实例投影

为了确定 K-safety 值,Vertica 会创建伙伴实例投影,这些投影是分布在数据库节点上的分段投影的副本。(请参阅分段投影未分段投影。)Vertica 会将包含相同数据的段分布到不同的节点上。这可确保在某个节点下线时,其中的所有数据都能在余下的节点中找到。

K-Safety 示例

上图显示了 K-safety 级别为 1 的五节点群集。每个节点都包含下一个高编号节点中存储的数据的伙伴实例投影(节点 1 包含节点 2 的伙伴实例投影,节点 2 包含节点 3 的伙伴实例投影,依此类推)。如果任何节点发生故障,数据库将继续运行。数据库的性能将下降,因为其中一个节点必须处理自己的工作负载和故障节点的工作负载。

下图显示了节点 2 发生故障的情况。在此情况下,节点 1 将处理节点 2 的工作,因为它含有节点 2 数据的副本。节点 1 也将继续执行自身的处理工作。此时,数据库容错能力会从 1 降至 0,因为再有一个节点故障将导致数据库变得不安全。在此示例中,无论是节点 1 还是节点 3 出现故障,数据库都会变得不安全,因为此时并非所有数据都可用。如果节点 1 发生故障,节点 2 的数据将不再可用。如果节点 3 发生故障,其数据将不再可用,因为节点 2 已关闭,无法使用伙伴实例投影。在这种情况下,节点 1 和节点 3 会被视为关键节点。在 K-safety 级别为 1 的数据库中,包含故障节点伙伴实例投影的节点,以及其伙伴实例投影位于故障节点上的节点,始终会成为关键节点。

节点 2 下线后,如果节点 4 或节点 5 发生故障,数据库仍具有全部可用数据。下图显示了节点 4 发生故障时节点 3 可以使用其伙伴实例投影来补位。在此情况下,如果再有节点发生故障,数据库将关闭,因为群集中的所有节点现在都成为关键节点。此外,如果再有一个节点发生故障,半数或半数以上的节点将关闭,无论所有数据是否可用,都需要 Vertica 自动关闭。

在 K-safety 级别为 2 的数据库中,节点 2 和群集中的任何其他节点之一发生故障时,数据库仍会继续运行。下图显示了群集中的每个节点都包含其前后邻居的伙伴实例投影(例如,节点 1 包含节点 5 和节点 2 的伙伴实例投影)。在此情况下,节点 2 和节点 3 发生故障时,数据库仍会继续运行。此时节点 1 会补位节点 2,而节点 4 会补位节点 3。由于要求群集中有半数或半数以上的节点可用才能使数据库继续运行,因此,如果节点 5 发生故障,群集将无法继续运行,即使节点 1 和节点 4 都具有节点 5 数据的伙伴实例投影。

监控 K‑safety

可以访问系统表以监控和记录 Vertica 操作的各个方面。使用 SYSTEM 表可以监控与 K-safety 相关的信息,例如:

  • NODE_COUNT:群集中的节点数

  • NODE_DOWN_COUNT:群集中当前已关闭的节点数

  • CURRENT_FAULT_TOLERANCE:K‑safety 级别