在达梦分布式集群(DMDPC)的日常运维和开发中,很多同学对 RAFT组、表空间组、表空间、表 这四个概念的关系感到困惑。
本文将从底层到上层,讲讲这四个概念之间的关系。
RAFT组: RAFT组是DMDPC中数据存储的物理单元。每个RAFT组由一组实例组成(通常为奇数个,如1、3、5个),组内通过RAFT协议实现数据同步和自动选主。一个RAFT组对外表现为一个完整的数据副本集合,其中只有一个主节点提供读写服务,其余备节点实时同步数据,保证高可用。
表空间: 表空间是数据库中逻辑存储与物理存储的桥梁。每个表空间必须绑定到某一个RAFT组上,所有存储在该表空间中的数据,最终都会落到其绑定的RAFT组所对应的物理节点上。表空间由数据文件组成,用户建表时通过指定表空间来决定数据的物理存储位置。
表空间组: 表空间组是一个逻辑概念,用于将多个分布在不同RAFT组上的表空间聚合为一个集合。建表时指定表空间组,系统会按轮询策略将表(或分区)依次分配到组内不同的表空间上,从而实现数据在多RAFT组间的自动打散分布。
表: 表是用户数据的最终载体。在DMDPC中,表通过表空间或表空间组定位其物理存储位置。非分区表整表存储在单个表空间中;分区表的每个分区可独立存储在不同表空间上,从而实现一张大表跨多个RAFT组分布。
3.1 RAFT组 → 表空间:一对多
每个RAFT组上可以创建多个表空间,每个表空间只能属于一个RAFT组。
-- RAFT_1 上创建两个表空间
CREATE TABLESPACE TS_1 DATAFILE 'TS_1.DBF' SIZE 128 STORAGE(ON RAFT_1);
CREATE TABLESPACE TS_2 DATAFILE 'TS_2.DBF' SIZE 128 STORAGE(ON RAFT_1);
-- RAFT_2 上创建一个表空间
CREATE TABLESPACE TS_3 DATAFILE 'TS_3.DBF' SIZE 128 STORAGE(ON RAFT_2);
验证:
SELECT NAME, RAFT_ID FROM DPC_TABLESPACE ORDER BY RAFT_ID;
3.2 表空间组 → 表空间:多对多(跨RAFT组)
表空间组可以包含来自不同RAFT组的表空间,是数据跨节点分布的关键。
-- 创建表空间组
SP_TS_GROUP_CREATE('TSG_ALL', '覆盖所有RAFT组');
-- 加入来自不同RAFT组的表空间
SP_TS_GROUP_ADD_TS('TSG_ALL', 'TS_1'); -- RAFT_1
SP_TS_GROUP_ADD_TS('TSG_ALL', 'TS_2'); -- RAFT_1
SP_TS_GROUP_ADD_TS('TSG_ALL', 'TS_3'); -- RAFT_2
SP_TS_GROUP_ADD_TS('TSG_ALL', 'TS_4'); -- RAFT_2
SP_TS_GROUP_ADD_TS('TSG_ALL', 'TS_5'); -- RAFT_3
SP_TS_GROUP_ADD_TS('TSG_ALL', 'TS_6'); -- RAFT_3
验证:
SP_GET_ALL_TS_BY_TSGROUP('TSG_ALL');
3.3 表 → 表空间/表空间组
非分区表:完整存储在单个表空间上。
CREATE TABLE T_SMALL (ID INT, NAME VARCHAR(50)) STORAGE(ON TS_1);
分区表:不同分区可分布在不同的表空间(及不同的RAFT组)上。
-- 方式1:使用表空间组,分区自动轮询分布在组内所有表空间
CREATE TABLE T_LARGE (ID INT, NAME VARCHAR(50))
PARTITION BY HASH(ID) PARTITIONS default
STORAGE(ON TSG_ALL);
-- 方式2:每个分区手动指定表空间
CREATE TABLE T_RANGE (ID INT, NAME VARCHAR(50))
PARTITION BY RANGE(ID) (
PARTITION P1 VALUES LESS THAN(100) STORAGE(ON TS_1),
PARTITION P2 VALUES LESS THAN(200) STORAGE(ON TS_3),
PARTITION P3 VALUES LESS THAN(MAXVALUE) STORAGE(ON TS_5)
);
四、示例
环境:三个RAFT组,每个RAFT组一个表空间,组成一个表空间组。
| RAFT组 | 机器IP | 表空间 | 表空间组 |
|---|---|---|---|
| RAFT_1 | 192.168.9.183 | TS_1 | TSG_ALL |
| RAFT_2 | 192.168.9.184 | TS_2 | TSG_ALL |
| RAFT_3 | 192.168.9.185 | TS_3 | TSG_ALL |
| 建表并查看分布: |
-- 分区表
CREATE TABLE TEST_HASH (ID INT, NAME VARCHAR(50))
PARTITION BY HASH(ID) PARTITIONS 6
STORAGE(ON TSG_ALL);
-- 查看每个分区在哪个表空间(即哪个RAFT组)
SELECT
PARTITION_NAME,
TABLESPACE_NAME,
(SELECT RAFT_ID FROM DPC_TABLESPACE WHERE NAME = a.TABLESPACE_NAME) AS RAFT_ID
FROM DBA_TAB_PARTITIONS a
WHERE TABLE_NAME = 'TEST_HASH'
ORDER BY PARTITION_POSITION;
6个分区轮询分布在3台机器上,实现了数据的均匀分布。
文章
阅读量
获赞
