跳转至

K-Safety 最佳实践

原文:K-Safety Best Practices | 作者:Shrirang Kamat、Soniya Shah

概述

本文档概述 K-safety、数据安全性及节点依赖关系的核心概念,是理解 Vertica 高可用与恢复机制的基础。

K-Safety

K-safety 衡量数据库集群的容错能力。K 值表示数据库中数据副本的数量。要在 Vertica 中实现高可用,分段投影必须至少有 1 个 buddy projection非分段投影则必须在所有节点上复制。Vertica 通过 K-safety 来强制执行这些投影要求。

K=1 的约束

在 K-safety = 1 的数据库中,Vertica 自动创建的投影会带有 buddy projection。但如果手动创建投影时未指定 ksafe1 关键字,该投影就不会有 buddy projection,并将被标记为 unsafe(不安全),受到以下限制:

  • 不会更新(not up to date)
  • 无法刷新
  • 无法接收加载的数据
  • 不能用于查询

检查 K-Safety

SELECT GET_DESIGN_KSAFE();

数据安全性(Data Safety)

非分段投影在集群每个节点上都有一份数据副本。对于 K=1 的数据库,每个分段投影都有一个包含数据副本的 buddy projection。

分段与 Buddy 节点

在分段投影中,数据根据投影设计中指定的分段表达式拆分为多个 segment。属于分段投影及其 buddy projection 的数据 segment 在节点上偏移分布

拥有某个数据 segment 及其副本的两个节点称为 buddy 节点。它们之间共享依赖关系

下图展示了节点依赖关系。节点 1 和节点 2 是 buddy 节点,共享数据 segment S1 的依赖;节点 2 和节点 3 共享 segment S2 的依赖,以此类推:

KSafetyBP NodeDependencies

查询节点依赖

方法 1 — buddy pair 列表:

SELECT dependency_id, min(node_name) AS node_x, max(node_name) AS node_y
FROM vs_node_dependencies JOIN nodes ON node_oid = node_id
GROUP BY 1 HAVING count(*) = 2 ORDER BY 1;

输出示例:

dependency_id |        node_x        |        node_y
--------------+----------------------+----------------------
0             |        node1         |        node3
1             |        node2         |        node4
2             |        node3         |        node4
3             |        node2         |        node5
4             |        node1         |        node5
(5 rows)

方法 2 — 位图方式:

SELECT GET_NODE_DEPENDENCIES();

输出示例:

get_node_dependencies
-----------------------------------------------------------------------------
Deps:
00110 - cnt: 2
01001 - cnt: 2
01100 - cnt: 2
10001 - cnt: 2
10010 - cnt: 2
11111 - cnt: 9
00001  name: Node 2
00010  name: Node 1
00100  name: Node 3
01000  name: Node 4
10000  name: Node 5
(1 row)

方法 3(8.0.1+)— 带节点名称的详细输出:

SELECT get_node_dependencies_verbose();

位图解读

8.0.1 之前的版本中,get_node_dependencies 不提供位到节点的映射。最右 bit 代表 node_id 最小的节点,最左 bit 代表 node_id 最大的节点。

查看节点按 node_id 升序排列的名称:

SELECT node_name FROM nodes ORDER BY node_id;
  • bit 值 1 = 该节点与另一个同样 bit=1 的节点互为 buddy
  • 例如位图 00110:node_id 第二小的节点和 node_id 第三小的节点是 buddy
  • cnt = 该依赖关系对应的 projection buddy pair 数量
  • 全 1 的位图(如 11111 = 非分段投影,cnt 表示数据库中非分段投影的数量

依赖环

如果将节点视为顶点、节点间的依赖关系视为边画成图,K=1 的数据库会形成一个,每个顶点有 2 条边:

KSafetyBP NodeDependenciesRing

  • 如果环中所有节点都有 3 条边 → K=2
  • 如果仅部分节点有多于 2 条边 → rebalance 未完成

重新计算节点依赖

SELECT RECOMPUTE_NODE_DEPENDENCIES();

高可用与数据安全性

K=1 的 Vertica 数据库在满足以下条件时保持 UP 且完全可用:

  1. 数据库中超过半数节点处于 UP 状态
  2. 依赖环中没有相邻的两个节点同时 DOWN

这个特性称为 data safety

举例

  • 节点 1 和节点 4 同时宕机 → ✅ 数据库仍 UP(不相邻)
  • 节点 1 和节点 5 同时宕机 → ❌ unsafe SHUTDOWN(相邻,数据 segment 不可访问)

查询关键节点

当有节点 DOWN 时,可查询关键节点列表,适合计划性维护前评估风险

SELECT * FROM critical_nodes;

最佳实践建议

1. 只用 K=1,不推荐 K=2

K=1 K=2
资源消耗基准 多消耗 50% 系统资源
不容忍相邻节点同时 DOWN 可容忍相邻两节点同时 DOWN
推荐 不推荐(相邻双节点同时宕机概率极低,得不偿失)

2. 大集群配置 Fault Groups(故障组)

对于跨越两个以上机架的大集群,务必通过定义 fault group 实现机架感知

详见 Vertica 文档:High Availability with Fault Groups

这样可将 buddy segment 分布在不同机架,避免单机架故障导致相邻节点同时 DOWN。


数据库恢复与 Data Safety

启动 Vertica 时需要:

  • 超过半数节点形成 quorum(法定人数)
  • 依赖环中不能有相邻节点被排除在外

详见 Vertica 文档:K-Safety


关键 SQL 速查

用途 SQL
查 K-safety SELECT GET_DESIGN_KSAFE();
查 buddy pair SELECT ... FROM vs_node_dependencies JOIN nodes ...
查依赖位图 SELECT GET_NODE_DEPENDENCIES();
查依赖位图+名称(8.0.1+) SELECT get_node_dependencies_verbose();
重算节点依赖 SELECT RECOMPUTE_NODE_DEPENDENCIES();
查关键节点 SELECT * FROM critical_nodes;

扩展阅读