跳转至

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. 预防建议

  1. 非必要不使用双主配置:大多数场景单 primary + 多个 secondary 足以满足需求。双主配置增加了运维复杂度和误操作风险
  2. 操作前确认子集群角色
    SELECT subcluster_name, is_primary, is_default
    FROM subclusters
    ORDER BY subcluster_name;
    
  3. 区分 K-safety 和 primary 节点数:K-safety 要求超过半数 primary 节点存活,而非刚好等于半数。例如 6 个 primary 节点,关闭 3 个(刚好一半)即触发只读
  4. 运维窗口或维护前:先检查是否有双主配置,避免误操作导致业务中断

扩展阅读