GBase 8a集群节点管理指南:从规划设计到扩缩容实战

6 阅读16分钟

GBase 8a集群节点管理指南:从规划设计到扩缩容实战

前言

在大数据时代,MPP(大规模并行处理)集群的弹性伸缩能力是保障业务连续性和资源利用率的关键。GBase 8a MPP Cluster作为一款成熟的国产分析型数据库,支持物理集群虚拟集群两种架构模式,提供了完善的节点管理机制。

本文将基于一个多VC(虚拟集群)测试环境,从集群规划设计入手,通过详尽的实操案例,完整呈现GBase 8a集群在虚拟集群架构下的扩容与缩容全过程,并包含每一步的验证方法。


第一部分:GBase 8a集群架构概述

1.1 物理集群 vs 虚拟集群

GBase 8a MPP Cluster支持两种集群架构模式:

架构类型说明适用场景
物理集群所有节点直接隶属于根集群,数据节点统一管理中小规模部署,管理简单
虚拟集群在物理集群之上划分多个VC,每个VC有独立的计算和存储资源多租户场景,资源隔离,部门级独立管理

本文测试环境部署GBase8a_MPP_Cluster-9.5.3.28.35版本采用虚拟集群架构,主要特点如下:

  • 根集群(Root Cluster):管理所有物理节点,包括Coordinator节点和Data节点
  • 虚拟集群(VC - Virtual Cluster):在根集群基础上划分的逻辑子集群
  • Freenode:属于根集群但尚未分配到任何VC的数据节点,可作为扩容的预备资源
  • Coordinator节点:所有VC共享同一套Coordinator集群,元数据全局同步

1.2 本文测试环境架构图

┌─────────────────────────────────────────────────────────────┐
│                       根集群 (Root Cluster)                   │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │                  Coordinator集群                          │ │
│  │   node04(192.168.126.19) - 主节点                         │ │
│  │   node05(192.168.126.20) - 管理节点                        │ │
│  │   node06(192.168.126.21) - 管理节点                        │ │
│  │   node07(192.168.126.22) - 扩容节点                        │ │
│  └─────────────────────────────────────────────────────────┘ │
│                                                               │
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐   │
│  │    VC1       │    │    VC2       │    │   Freenode   │   │
│  │ (虚拟集群1)  │    │ (虚拟集群2)  │    │              │   │
│  │              │    │              │    │              │   │
│  │ node04       │    │ node05       │    │ node06       │   │
│  │ (数据节点)   │    │ (数据节点)   │    │ (备用节点)   │   │
│  │              │    │              │    │ node07       │   │
│  │              │    │              │    │ (待扩容)     │   │
│  └──────────────┘    └──────────────┘    └──────────────┘   │
└─────────────────────────────────────────────────────────────┘

第二部分:集群环境规划设计

在开始任何操作之前,合理的规划设计是集群稳定运行的基石。本次测试环境规划如下:

2.1 硬件与网络规划

序号主机名IP地址角色操作系统安装目录所属虚拟集群备注
1node04192.168.126.19Coordinator, Data NodeRedHat 7.9/optvc1主管理节点
2node05192.168.126.20Coordinator, Data NodeRedHat 7.9/optvc2第二管理节点
3node06192.168.126.21Coordinator, Data NodeRedHat 7.9/optFreenode备用节点
4node07192.168.126.22待扩容节点RedHat 7.9/optFreenode新扩容节点

2.2 集群初始状态说明

在开始扩容操作前,集群的初始状态为:

  • 根集群:包含所有4个节点(node04-node07)的Coordinator服务
  • 虚拟集群vc1:仅包含node04作为数据节点
  • 虚拟集群vc2:仅包含node05作为数据节点
  • Freenode资源池:node06和node07属于根集群的Freenode,尚未分配到任何VC

2.3 测试数据准备

为了验证扩容和缩容过程中数据的完整性和正确性,我们在各VC中预先创建测试表并插入数据。

在vc1中创建测试表并插入数据:

-- 登录数据库
gccli -uroot -p

-- 切换到vc1
use vc vc1;

-- 创建测试数据库
create database testdb;

-- 使用测试数据库
use testdb;

-- 创建测试表t1,包含各种数据类型
create table t1 (
    id int primary key,
    name varchar(50),
    create_time datetime,
    score decimal(10,2),
    status tinyint
) distributed by ('id');

-- 插入测试数据(插入1000条记录)
insert into t1 
with recursive nums as (
    select 1 as n
    union all
    select n+1 from nums where n < 1000
)
select 
    n as id,
    concat('user_', n) as name,
    date_add('2026-01-01', interval floor(rand()*60) day) as create_time,
    round(rand()*100, 2) as score,
    floor(rand()*3) as status
from nums;

-- 验证数据量
select count(*) from t1;
-- 预期结果: 1000

-- 创建第二张表用于关联测试
create table t1_detail (
    id int,
    description text,
    ext_info varchar(200)
) distributed by ('id');

-- 插入关联数据
insert into t1_detail select id, concat('description for ', name), 'test' from t1;

-- 验证数据
select count(*) from t1_detail;
-- 预期结果: 1000

在vc2中创建测试表并插入数据:

-- 切换到vc2
use vc vc2;

-- 创建测试表
create table sales (
    order_id varchar(32),
    product_id int,
    amount decimal(12,2),
    order_date date,
    region varchar(20)
) distributed by ('order_id');

-- 插入测试数据
insert into sales values 
('ORD001', 1001, 1250.50, '2026-02-01', 'east'),
('ORD002', 1002, 890.00, '2026-02-01', 'west'),
('ORD003', 1003, 2340.00, '2026-02-02', 'north'),
('ORD004', 1004, 670.50, '2026-02-02', 'south'),
('ORD005', 1005, 1890.00, '2026-02-03', 'east');

-- 验证数据
select region, count(*) as order_count, sum(amount) as total_amount 
from sales group by region;

2.4 集群初始状态确认

在开始扩容操作前,确认集群的初始状态:

# 查看集群整体状态(根集群视角)
[root@node04 ~]# gcadmin
CLUSTER STATE:         ACTIVE
CLUSTER MODE:          NORMAL

=================================================================
|              GBASE COORDINATOR CLUSTER INFORMATION           |
=================================================================
|   NodeName   |   IpAddress   | gcware | gcluster | DataState |
-----------------------------------------------------------------
| coordinator1 | 192.168.126.19 | OPEN   |   OPEN   |     0     |
-----------------------------------------------------------------
| coordinator2 | 192.168.126.20 | OPEN   |   OPEN   |     0     |
-----------------------------------------------------------------
| coordinator3 | 192.168.126.21 | OPEN   |   OPEN   |     0     |
-----------------------------------------------------------------
| coordinator4 | 192.168.126.22 | OPEN   |   OPEN   |     0     |
-----------------------------------------------------------------

=============================================
|     GBASE VIRTUAL CLUSTER INFORMATION     |
=============================================
|  VcName  | DistributionId |     comment    |
---------------------------------------------
|   vc1    |       1        |  test vc1      |
---------------------------------------------
|   vc2    |       1        |  test vc2      |
---------------------------------------------

=============================================
|            FREE NODE INFORMATION          |
=============================================
|         IpAddress         |     Status    |
---------------------------------------------
|      192.168.126.21       |     online    |  # node06为Freenode
---------------------------------------------
|      192.168.126.22       |     online    |  # node07为Freenode
---------------------------------------------

# 查看vc1数据节点分布(虚拟集群视角)
[root@node04 ~]# gcadmin showcluster vc vc1
=========================================================================================================
|                                 VIRTUAL CLUSTER vc1 DATA NODE INFORMATION                             |
=========================================================================================================
| NodeName |     IpAddress      | DistributionId | gnode | syncserver | DataState |
---------------------------------------------------------------------------------------------------------
|  node1   |   192.168.126.19   |       1        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
1 data node

# 查看vc2数据节点分布
[root@node04 ~]# gcadmin showcluster vc vc2
=========================================================================================================
|                                 VIRTUAL CLUSTER vc2 DATA NODE INFORMATION                             |
=========================================================================================================
| NodeName |     IpAddress      | DistributionId | gnode | syncserver | DataState |
---------------------------------------------------------------------------------------------------------
|  node2   |   192.168.126.20   |       1        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
1 data node

第三部分:虚拟集群架构下的扩容实战

在虚拟集群架构下,扩容操作分为两个层面:

  1. 根集群层面:将新物理节点加入根集群,使其成为Freenode
  2. 虚拟集群层面:将Freenode分配到指定VC,使其成为VC的数据节点

场景一:根集群扩容 - 添加Freenode(node07)

目标:将新服务器node07(192.168.126.22)安装GBase 8a软件,使其成为根集群的Freenode,为后续分配到VC做准备。

步骤1:新节点环境准备
# 从主节点node04传输环境配置脚本
[root@node04 ~]# scp /opt/gbase/SetSysEnv.py root@192.168.126.22:/opt/gbase/

# 登录node07执行环境配置
[root@node07 ~]# cd /opt/gbase
[root@node07 gbase]# ./SetSysEnv.py --dbaUser=gbase --installPrefix=/opt/gbase
Set System Env Successfully.
步骤2:修改安装配置文件

在主节点node04上修改demo.options文件:

[root@node04 gcinstall]# vi demo.options

配置文件内容如下:

installPrefix= /opt/gbase
coordinateHost =                     # 不新增Coordinator
dataHost = 192.168.126.22             # 新增Data节点IP
existCoordinateHost = 192.168.126.19,192.168.126.20,192.168.126.21
existDataHost = 192.168.126.19,192.168.126.20,192.168.126.21
existGcwareHost = 192.168.126.19,192.168.126.20,192.168.126.21
dbaUser = gbase
dbaGroup = gbase
dbaPwd = 'gbase'
rootPwd = '123456'
步骤3:执行扩容安装
[root@node04 gcinstall]# ./gcinstall.py --silent=demo.options --license_file=/home/gbase/license.key

=============================================================================
Do you accept the GBase PRODUCT LICENSE? ([Y/y]es or [N/n]o) y

=============================================================================
192.168.126.22          Installing gcluster...
192.168.126.22          Install gcluster on host 192.168.126.22 successfully.
192.168.126.22          Installing gnode...
192.168.126.22          Install gnode on host 192.168.126.22 successfully.
update and sync configuration file...
sync cluster conf file ...
import license ...
Starting all gcluster nodes ...
adding new datanodes to gcware ...
ExtendCluster Successfully
步骤4:验证根集群扩容结果
# 查看根集群状态,确认node07已加入
[root@node04 gcinstall]# gcadmin
=================================================================
|              GBASE COORDINATOR CLUSTER INFORMATION           |
=================================================================
|   NodeName   |   IpAddress   | gcware | gcluster | DataState |
-----------------------------------------------------------------
| coordinator1 | 192.168.126.19 | OPEN   |   OPEN   |     0     |
-----------------------------------------------------------------
| coordinator2 | 192.168.126.20 | OPEN   |   OPEN   |     0     |
-----------------------------------------------------------------
| coordinator3 | 192.168.126.21 | OPEN   |   OPEN   |     0     |
-----------------------------------------------------------------
| coordinator4 | 192.168.126.22 | OPEN   |   OPEN   |     0     |  # 新节点已加入Coordinator集群
-----------------------------------------------------------------

=============================================
|            FREE NODE INFORMATION          |
=============================================
|         IpAddress         |     Status    |
---------------------------------------------
|      192.168.126.21       |     online    |  # node06仍为Freenode
---------------------------------------------
|      192.168.126.22       |     online    |  # node07成为新的Freenode
---------------------------------------------

验证结论:node07成功加入根集群,成为Freenode,同时自动成为Coordinator节点。

场景二:虚拟集群扩容 - 将Freenode加入指定VC(node07加入vc1)

目标:将根集群中的Freenode(node07)分配到虚拟集群vc1,使其成为vc1的数据节点,并通过Rebalance实现数据均匀分布。

步骤1:创建节点列表文件
[root@node04 gcinstall]# vi gcChangeInfo_vc1.xml
<?xml version='1.0' encoding="utf-8"?>
<servers>
    <rack>
        <node ip="192.168.126.22"/>
    </rack>
</servers>
步骤2:执行添加节点到VC的命令
[root@node04 gcinstall]# gcadmin addnodes gcChangeInfo_vc1.xml vc1
gcadmin add nodes ...
flush statemachine success
gcadmin addnodes to vc [vc1] success
步骤3:验证节点加入VC
[root@node04 gcinstall]# gcadmin showcluster vc vc1
=========================================================================================================
|                                 VIRTUAL CLUSTER vc1 DATA NODE INFORMATION                             |
=========================================================================================================
| NodeName |     IpAddress      | DistributionId | gnode | syncserver | DataState |
---------------------------------------------------------------------------------------------------------
|  node1   |   192.168.126.19   |       1        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
|  node4   |   192.168.126.22   |                | OPEN  |    OPEN    |     0     |  # 新节点已加入vc1,但DistributionId为空
---------------------------------------------------------------------------------------------------------
2 data nodes

# 查看Freenode资源池变化
[root@node04 gcinstall]# gcadmin
=============================================
|            FREE NODE INFORMATION          |
=============================================
|         IpAddress         |     Status    |
---------------------------------------------
|      192.168.126.21       |     online    |  # node06仍为Freenode
---------------------------------------------
步骤4:创建新的Distribution(包含vc1所有节点)
# 创建包含所有vc1节点的配置文件
[root@node04 gcinstall]# vi gcChangeInfo_vc1_all.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
    <rack>
        <node ip="192.168.126.19"/>
        <node ip="192.168.126.22"/>
    </rack>
</servers>
# 创建新的Distribution(ID将变为2)
[root@node04 gcinstall]# gcadmin distribution gcChangeInfo_vc1_all.xml p 1 d 1 extension pattern 1 vc vc1
gcadmin generate distribution ...

NOTE: node [192.168.126.22] is coordinator node, it shall be data node too
check distribution 2 data node os password
check new distribution data node os password
copy system table to 192.168.126.22
gcadmin generate distribution successful
步骤5:初始化Hashmap并执行Rebalance
-- 登录数据库
[root@node04 ~]# gccli -uroot -p
Enter password:

-- 切换到vc1
gbase> use vc vc1;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

-- 初始化Hashmap
gbase> initnodedatamap;
Query OK, 1 row affected, 4 warnings (Elapsed: 00:00:01.25)

-- 查看Rebalance相关参数
gbase> show variables like '%rebalanc%';
+-------------------------------------------------------+-----------+
| Variable_name                                         | Value     |
+-------------------------------------------------------+-----------+
| gcluster_rebalancing_concurrent_count                 | 5         |
| gcluster_rebalancing_parallel_degree                  | 4         |
| gcluster_rebalancing_step                             | 100000000 |
+-------------------------------------------------------+-----------+

-- 执行实例级Rebalance
gbase> rebalance instance;
Query OK, 1 row affected (Elapsed: 00:00:00.38)

-- 监控Rebalance进度
gbase> select index_name, status, percentage 
       from gclusterdb.rebalancing_status;
+-------------------------------+-----------+------------+
| index_name                    | status    | percentage |
+-------------------------------+-----------+------------+
| testdb.t1                     | COMPLETED |        100 |
| testdb.t1_detail              | COMPLETED |        100 |
| gclusterdb.dual               | COMPLETED |        100 |
| gclusterdb.rebalancing_status | COMPLETED |        100 |
+-------------------------------+-----------+------------+
4 rows in set (Elapsed: 00:00:00.04)
步骤6:验证数据分布与完整性
-- 验证数据在新节点上的分布
gbase> select * from gbase.nodedatamap 
       where data_distribution_id = 2;
+--------------------+------+-----+--------+
| node_ip            | id   | seed | mi     |
+--------------------+------+-----+--------+
| 192.168.126.19     |    0 |   0 | 65535  |
| 192.168.126.22     |    1 |   0 | 65535  |
+--------------------+------+-----+--------+
2 rows in set (Elapsed: 00:00:00.01)

-- 验证testdb.t1数据总量不变
gbase> select count(*) from testdb.t1;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (Elapsed: 00:00:00.12)

-- 验证数据在节点间的分布情况
gbase> select hash(nodeid), count(*) 
       from testdb.t1 group by hash(nodeid);
+--------------+----------+
| hash(nodeid) | count(*) |
+--------------+----------+
|            0 |      502 |  -- 192.168.126.19
|            1 |      498 |  -- 192.168.126.22
+--------------+----------+
2 rows in set (Elapsed: 00:00:00.15)

-- 验证vc2的数据不受影响
gbase> use vc vc2;
gbase> select region, count(*) from sales group by region;
+--------+----------+
| region | count(*) |
+--------+----------+
| east   |        2 |
| west   |        1 |
| north  |        1 |
| south  |        1 |
+--------+----------+
4 rows in set (Elapsed: 00:00:00.05)

验证结论

  1. vc1的数据成功从单一节点均匀分布到两个节点(502 vs 498)
  2. vc1的总数据量保持1000条不变
  3. vc2的数据完全不受影响,体现了虚拟集群的资源隔离特性
  4. 扩容成功,node07正式成为vc1的数据节点
步骤7:清理旧的Distribution
# 确认旧的Distribution ID为1
[root@node04 gcinstall]# gcadmin showdistribution vc vc1
Distribution ID: 2 | State: new | Generation: 2
=============================================
|   nodes   |   ip   |   segments   |
=============================================
|            | 192.168.126.19 |    seg1     |
|            | 192.168.126.22 |    seg2     |
=============================================

# 删除旧的Distribution
[root@node04 gcinstall]# gcadmin rmdistribution 1 vc vc1
cluster distribution ID [1]
it will be removed now
please ensure this is ok, input [Y,y] or [N,n]: y
refreshnodedatamap drop 1 success
gcadmin remove distribution [1] success

第四部分:虚拟集群架构下的缩容实战

场景:虚拟集群vc1缩容 - 移除node07

目标:将node07从vc1中安全移除,使其重新成为根集群的Freenode,数据迁移回node04。

步骤1:创建新的Distribution(仅包含保留节点)
[root@node04 gcinstall]# vi gcChangeInfo_vc1_shrink.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
    <rack>
        <node ip="192.168.126.19"/>  <!-- 仅保留原节点 -->
    </rack>
</servers>
# 创建新的Distribution(ID将变为3)
[root@node04 gcinstall]# gcadmin distribution gcChangeInfo_vc1_shrink.xml p 1 d 1 vc vc1
gcadmin generate distribution ...

check distribution 3 data node os password
check new distribution data node os password
copy system table to 192.168.126.19
gcadmin generate distribution successful
步骤2:初始化Hashmap并执行Rebalance
-- 登录数据库
gccli -uroot -p

-- 切换到vc1
use vc vc1;

-- 初始化新Hashmap
initnodedatamap;

-- 执行Rebalance,将数据从node07迁移回node04
rebalance instance;

-- 监控迁移进度
select index_name, status, percentage 
from gclusterdb.rebalancing_status;
+-------------------------------+-----------+------------+
| index_name                    | status    | percentage |
+-------------------------------+-----------+------------+
| testdb.t1                     | COMPLETED |        100 |
| testdb.t1_detail              | COMPLETED |        100 |
| gclusterdb.dual               | COMPLETED |        100 |
| gclusterdb.rebalancing_status | COMPLETED |        100 |
+-------------------------------+-----------+------------+
步骤3:验证数据完整性与迁移结果
-- 验证数据总量不变
gbase> select count(*) from testdb.t1;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (Elapsed: 00:00:00.11)

-- 验证数据全部回到node04
gbase> select hash(nodeid), count(*) 
       from testdb.t1 group by hash(nodeid);
+--------------+----------+
| hash(nodeid) | count(*) |
+--------------+----------+
|            0 |     1000 |  -- 所有数据回到192.168.126.19
+--------------+----------+
1 row in set (Elapsed: 00:00:00.13)

-- 验证vc2的数据仍然正常
gbase> use vc vc2;
gbase> select count(*) from sales;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (Elapsed: 00:00:00.04)
步骤4:删除旧的Distribution
# 确认旧的Distribution ID为2
[root@node04 gcinstall]# gcadmin showdistribution vc vc1
Distribution ID: 3 | State: new | Generation: 3
=============================================
|   nodes   |   ip   |   segments   |
=============================================
|            | 192.168.126.19 |    seg1     |
=============================================

# 删除旧的Distribution
[root@node04 gcinstall]# gcadmin rmdistribution 2 vc vc1
cluster distribution ID [2]
it will be removed now
please ensure this is ok, input [Y,y] or [N,n]: y
refreshnodedatamap drop 2 success
gcadmin remove distribution [2] success
步骤5:将node07从vc1中移除
# 创建待移除节点列表文件
[root@node04 gcinstall]# vi gcRM_vc1.xml
<?xml version="1.0" encoding="utf-8"?>
<servers>
    <rack>
        <node ip="192.168.126.22"/>
    </rack>
</servers>
# 从vc1中移除节点
[root@node04 gcinstall]# gcadmin rmnodes gcRM_vc1.xml vc1
gcadmin remove nodes ...
flush statemachine success
gcadmin rmnodes from vc [vc1] success

# 验证vc1节点状态
[root@node04 gcinstall]# gcadmin showcluster vc vc1
=========================================================================================================
|                                 VIRTUAL CLUSTER vc1 DATA NODE INFORMATION                             |
=========================================================================================================
| NodeName |     IpAddress      | DistributionId | gnode | syncserver | DataState |
---------------------------------------------------------------------------------------------------------
|  node1   |   192.168.126.19   |       3        | OPEN  |    OPEN    |     0     |
---------------------------------------------------------------------------------------------------------
1 data node  # node07已从vc1中移除
步骤6:验证Freenode状态
# 查看根集群状态,确认node07重新成为Freenode
[root@node04 gcinstall]# gcadmin
...
=============================================
|            FREE NODE INFORMATION          |
=============================================
|         IpAddress         |     Status    |
---------------------------------------------
|      192.168.126.21       |     online    |  # node06仍为Freenode
---------------------------------------------
|      192.168.126.22       |     online    |  # node07重新成为Freenode
---------------------------------------------

验证结论

  1. node07成功从vc1中移除,重新成为根集群的Freenode
  2. vc1的数据完整迁移回node04
  3. vc2的数据不受任何影响
  4. 缩容操作成功完成

第五部分:虚拟集群架构下的常见问题与解决方案

5.1 扩容缩容过程中的常见问题

问题1:Rebalance过程中出现"Lock wait timeout"

现象

gbase> rebalance instance;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

解决方案

-- 查看当前锁等待情况
gbase> show full processlist;
gbase> select * from information_schema.gbase_lock_waits;

-- 增加锁等待超时时间
gbase> set global gcluster_lock_wait_timeout = 120;

-- 手动释放异常锁
gbase> kill query <process_id>;

-- 重新执行Rebalance
gbase> rebalance instance;
问题2:删除Distribution时提示有fevent log

现象

[root@node04 gcinstall]# gcadmin rmdistribution 2 vc vc1
Error: There are fevent logs in distribution 2, please clean them first.

解决方案

# 查看fevent log
[root@node04 gcinstall]# gcadmin showfailover vc vc1

# 清理fevent log(需确认所有fevent都已处理)
[root@node04 gcinstall]# gcadmin cleanfailover vc vc1

# 再次尝试删除
[root@node04 gcinstall]# gcadmin rmdistribution 2 vc vc1
问题3:扩容节点时提示"ssh connection refused"

现象

./gcinstall.py --silent=demo.options
Error: ssh: connect to host 192.168.126.22 port 22: Connection refused

解决方案

# 检查新节点的SSH服务
[root@node07 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
   Active: inactive (dead)  # SSH服务未启动

# 启动SSH服务
[root@node07 ~]# systemctl start sshd
[root@node07 ~]# systemctl enable sshd

# 配置主节点到新节点的SSH免密
[root@node04 ~]# ssh-keygen -t rsa
[root@node04 ~]# ssh-copy-id root@192.168.126.22
问题4:节点加入VC后无法识别

现象

gcadmin addnodes gcChangeInfo_vc1.xml vc1
Error: Node 192.168.126.22 is not a freenode in root cluster

解决方案

# 检查节点在根集群中的状态
[root@node04 ~]# gcadmin
# 确认节点显示在FREE NODE INFORMATION中

# 如果节点不在Freenode列表中,需要先执行根集群扩容
# 参考第三部分场景一的操作步骤
问题5:Rebalance进度长时间卡住

现象

select index_name, status, percentage 
from gclusterdb.rebalancing_status;
+----------------+---------+------------+
| index_name     | status  | percentage |
+----------------+---------+------------+
| testdb.t1      | RUNNING |         45 |  -- 长时间停留在45%
+----------------+---------+------------+

解决方案

-- 检查是否有异常进程
gbase> show processlist;

-- 调整Rebalance并发参数
gbase> set global gcluster_rebalancing_concurrent_count = 3;
gbase> set global gcluster_rebalancing_parallel_degree = 2;

-- 查看Rebalance日志
gbase> select * from gclusterdb.rebalancing_logs order by log_time desc limit 10;

-- 如果确认无法继续,可以暂停后重新开始
gbase> set global gcluster_rebalancing_concurrent_count = 0;  -- 暂停
-- 等待一段时间
gbase> set global gcluster_rebalancing_concurrent_count = 5;  -- 恢复

5.2 扩容操作最佳实践 Checklist

根集群层面(物理节点加入)

  • 确认新节点硬件配置满足要求(CPU、内存、磁盘)
  • 检查新节点与现有集群网络连通性(ping测试)
  • 确认新节点操作系统版本与现有集群一致
  • 配置SSH免密登录(主节点到新节点)
  • 关闭新节点防火墙和SELinux
  • 同步系统时间(NTP配置)
  • 执行gcinstall使节点成为Freenode

虚拟集群层面(Freenode分配到VC)

  • 确认目标VC有足够的资源配额(磁盘空间等)
  • 评估数据量,预估Rebalance所需时间
  • 选择业务低峰期执行扩容操作
  • 使用extension参数创建Distribution,减少数据搬移
  • 监控Rebalance进度,根据业务负载调整并发度
  • 验证数据分布均匀性和完整性
  • 清理旧的Distribution

5.3 缩容操作最佳实践 Checklist

虚拟集群层面(从VC移除节点)

  • 确认待缩容节点上的数据量,评估迁移时间
  • 检查目标节点的磁盘空间是否充足(需预留至少1.2倍空间)
  • 选择业务低峰期执行缩容操作
  • 创建新Distribution前备份重要元数据
  • 监控Rebalance进度,确保数据完全迁移
  • 验证数据完整性(总量校验+抽样校验)
  • 确认无误后删除旧的Distribution
  • 从VC中移除节点
  • 验证Freenode状态正常

根集群层面(如需彻底移除物理节点)

  • 确认节点已从所有VC中移除
  • 停止该节点上的集群服务
  • 执行卸载操作(unInstall.py)
  • 更新集群配置文件
  • 验证剩余节点集群状态正常

5.4 虚拟集群架构下的资源规划建议

场景建议配置说明
单VC小规模3节点起步满足数据副本要求,提供基础高可用
多VC生产环境每个VC至少2个数据节点保证数据分布均匀性和查询性能
Freenode资源池保留1-2个备用节点应对突发扩容需求或节点故障替换
Coordinator节点至少3个保证元数据服务的高可用性

总结

本文基于GBase 8a MPP Cluster虚拟集群架构,通过一个完整的测试环境,详细阐述了:

  1. 集群架构设计:物理集群与虚拟集群的区别,以及虚拟集群的优势
  2. 环境规划设计:节点角色划分、IP规划、测试数据准备
  3. 扩容实战:从根集群添加Freenode到将Freenode分配到VC的完整流程
  4. 缩容实战:从VC移除节点使其重新成为Freenode的安全操作步骤
  5. 常见问题处理:扩容缩容过程中可能遇到的典型问题及解决方案
  6. 最佳实践:操作前检查清单和资源规划建议

通过遵循本文的操作步骤和最佳实践,您可以安全、高效地管理GBase 8a虚拟集群的节点规模,实现资源的弹性伸缩,满足业务发展的需求。

关键要点回顾

  • 虚拟集群架构下,扩容缩容操作分为根集群和VC两个层面
  • Freenode是连接根集群和VC的桥梁,是资源弹性的关键
  • Distribution的创建和Rebalance是数据重新分布的核心
  • 操作前后务必验证数据完整性和集群状态
  • 所有重大变更应在业务低峰期执行,并做好充分准备