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¶
数据安全性(Data Safety)¶
非分段投影在集群每个节点上都有一份数据副本。对于 K=1 的数据库,每个分段投影都有一个包含数据副本的 buddy projection。
分段与 Buddy 节点¶
在分段投影中,数据根据投影设计中指定的分段表达式拆分为多个 segment。属于分段投影及其 buddy projection 的数据 segment 在节点上偏移分布。
拥有某个数据 segment 及其副本的两个节点称为 buddy 节点。它们之间共享依赖关系。
下图展示了节点依赖关系。节点 1 和节点 2 是 buddy 节点,共享数据 segment S1 的依赖;节点 2 和节点 3 共享 segment S2 的依赖,以此类推:

查询节点依赖¶
方法 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 — 位图方式:
输出示例:
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+)— 带节点名称的详细输出:
位图解读¶
8.0.1 之前的版本中,
get_node_dependencies不提供位到节点的映射。最右 bit 代表 node_id 最小的节点,最左 bit 代表 node_id 最大的节点。
查看节点按 node_id 升序排列的名称:
- bit 值 1 = 该节点与另一个同样 bit=1 的节点互为 buddy
- 例如位图
00110:node_id 第二小的节点和 node_id 第三小的节点是 buddy cnt= 该依赖关系对应的 projection buddy pair 数量- 全 1 的位图(如
11111) = 非分段投影,cnt表示数据库中非分段投影的数量
依赖环¶
如果将节点视为顶点、节点间的依赖关系视为边画成图,K=1 的数据库会形成一个环,每个顶点有 2 条边:

- 如果环中所有节点都有 3 条边 → K=2
- 如果仅部分节点有多于 2 条边 → rebalance 未完成
重新计算节点依赖¶
高可用与数据安全性¶
K=1 的 Vertica 数据库在满足以下条件时保持 UP 且完全可用:
- 数据库中超过半数节点处于 UP 状态
- 依赖环中没有相邻的两个节点同时 DOWN
这个特性称为 data safety。
举例¶
- 节点 1 和节点 4 同时宕机 → ✅ 数据库仍 UP(不相邻)
- 节点 1 和节点 5 同时宕机 → ❌ unsafe SHUTDOWN(相邻,数据 segment 不可访问)
查询关键节点¶
当有节点 DOWN 时,可查询关键节点列表,适合计划性维护前评估风险:
最佳实践建议¶
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; |
扩展阅读¶
- Vertica 集群 Rebalance 完全指南 — Rebalance 与节点依赖修复
- Vertica 维护前准备 Checklist — 检查节点依赖是维护前第 1 步
- Vertica 备份与恢复方案总览 — 恢复与 Data Safety
- Projection 优化最佳实践 — Projection 的 K-Safety 设置