Eon 双主子集群的注意事项¶
作者:JiangChong | 发布时间:2026-04-24
1. 问题背景¶
在 Vertica Eon 模式中,primary 子集群的节点参与 K-safety 和 quorum 判定。数据库保持运行需要满足两个条件:半数以上 primary 节点存活,且每个 shard 至少有一个 primary 节点订阅。
当一个 Eon 数据库中存在两个或更多 primary 子集群时,直接关闭其中任何一个都会导致 primary 节点数不足半数,触发 quorum 保护机制,使整个数据库进入只读状态。这不是 bug,而是 K-safety 的设计行为——防止在网络分区场景下出现脑裂。
2. 故障现象¶
2.1 错误操作:直接关闭主子集群¶
[dbadmin@v001 ~]$ admintools -t stop_subcluster -c subcluster2 -d eon_minio -Fi
Info: no password specified, using none
Subcluster is critical, shutting the subcluster down will cause the whole database shutdown
通过 SQL 函数关闭同样会导致问题:
eon_minio=> SELECT SHUTDOWN_SUBCLUSTER('subcluster2');
SHUTDOWN SUBCLUSTER
---------------------
Subcluster shutdown
2.2 后果:整个数据库变为只读¶
关闭后查询节点状态,所有节点的 is_readonly 均变为 t:
eon_minio=> select node_name,node_state,is_primary,is_readonly,node_address,subcluster_name,node_type from nodes;
node_name | node_state | is_primary | is_readonly | node_address | subcluster_name | node_type
--------------------+------------+------------+-------------+----------------+--------------------+-----------
v_eon_node0001 | UP | t | t | 10.0.0.11 | default_subcluster | PERMANENT
v_eon_node0002 | UP | t | t | 10.0.0.12 | default_subcluster | PERMANENT
v_eon_node0003 | UP | t | t | 10.0.0.13 | default_subcluster | PERMANENT
v_eon_node0004 | UP | t | t | 10.0.0.14 | subcluster2 | PERMANENT
v_eon_node0005 | UP | t | t | 10.0.0.15 | subcluster2 | PERMANENT
v_eon_node0006 | UP | t | t | 10.0.0.16 | subcluster2 | PERMANENT
(6 rows)
根因分析:集群共 6 个节点、2 个 primary 子集群(各 3 节点)。关闭 subcluster2 后,primary 节点从 6 个降为 3 个,刚好等于半数(不是超过半数),触发 quorum 保护,数据库进入只读模式以防止数据不一致。
3. 解决方案¶
3.1 正确操作流程:先降级,再关闭¶
双主子集群场景下,操作任何一个 primary 子集群之前,必须先将其降级为 secondary:
-- 步骤1:降级为目标子集群为次要子集群
eon_minio=> SELECT DEMOTE_SUBCLUSTER_TO_SECONDARY('subcluster2');
-- 步骤2:关闭子集群
[dbadmin@v001 ~]$ admintools -t stop_subcluster -c subcluster2 -d eon_minio -Fi
3.2 恢复操作:重启后升回主子集群¶
维护完成后,重新启动子集群并恢复其 primary 角色:
-- 步骤1:启动子集群
[dbadmin@v001 ~]$ admintools -t start_subcluster -c subcluster2 -d eon_minio -Fi
-- 步骤2:重新升级为主子集群
eon_minio=> SELECT PROMOTE_SUBCLUSTER_TO_PRIMARY('subcluster2');
3.3 操作原则¶
| 场景 | 正确做法 | 错误做法 |
|---|---|---|
| 关闭一个 primary 子集群 | DEMOTE_SUBCLUSTER_TO_SECONDARY() → 关闭 |
直接 SHUTDOWN_SUBCLUSTER() 或 stop_subcluster |
| 单 primary 集群 | 不能关闭唯一的 primary 子集群 | — |
| 维护后恢复 | 启动 → PROMOTE_SUBCLUSTER_TO_PRIMARY() |
启动后忘记恢复 primary 角色 |
4. 预防建议¶
- 非必要不使用双主配置:大多数场景单 primary + 多个 secondary 足以满足需求。双主配置增加了运维复杂度和误操作风险
- 操作前确认子集群角色:
- 区分 K-safety 和 primary 节点数:K-safety 要求超过半数 primary 节点存活,而非刚好等于半数。例如 6 个 primary 节点,关闭 3 个(刚好一半)即触发只读
- 运维窗口或维护前:先检查是否有双主配置,避免误操作导致业务中断
扩展阅读¶
- Vertica 弹性伸缩功能介绍与配置 — Eon 模式子集群机制的完整讲解
- Vertica 锁和锁冲突 — Elastic Cluster Locks 与 K-safety 的关系
- K-Safety 最佳实践 — K-safety 配置与 quorum 机制详解