CREATE SPACE¶
图空间是 NebulaGraph 中彼此隔离的图数据集合,与 MySQL 中的 database 概念类似。CREATE SPACE
语句可以创建一个新的图空间,或者克隆现有图空间的 Schema。
前提条件¶
只有 God 角色的用户可以执行CREATE SPACE
语句。详情请参见身份验证。
语法¶
创建图空间¶
CREATE SPACE [IF NOT EXISTS] <graph_space_name> (
[partition_num = <partition_number>,]
[replica_factor = <replica_number>,]
vid_type = {FIXED_STRING(<N>) | INT[64]}
)
[COMMENT = '<comment>'];
参数 | 说明 |
---|---|
IF NOT EXISTS |
检测待创建的图空间是否存在,只有不存在时,才会创建图空间。仅检测图空间的名称,不会检测具体属性。 |
<graph_space_name> |
在 NebulaGraph 实例中唯一标识一个图空间。图空间名称以英文字母开头,支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(`)包围,详情参见关键字和保留字。 |
partition_num |
指定图空间的分片数量。建议设置为集群中硬盘数量的 20 倍(HDD 硬盘建议为 2 倍)。例如集群中有 3 个硬盘,建议设置 60 个分片。默认值为 100。 |
replica_factor |
指定每个分片的副本数量。建议在生产环境中设置为 3,在测试环境中设置为 1。由于需要基于多数表决,副本数量必须是奇数。默认值为 1。 |
vid_type |
必选参数。指定点 ID 的数据类型。可选值为FIXED_STRING(<N>) 和INT64 。INT 等同于INT64 。FIXED_STRING(<N>) 表示数据类型为定长字符串,长度为N 字节,超出长度会报错。例如,UTF-8中,一个中文字符的长度为三个字节,如果设置N 为 12,那么vid_type 为最多 4 个中文字符。INT64 表示数据类型为整数。 |
COMMENT |
图空间的描述。最大为 256 字节。默认无描述。 |
Caution
- 如果将副本数设置为 1,用户将无法使用 BALANCE 命令为 NebulaGraph 的存储服务平衡负载或扩容。
-
VID 类型变更与长度限制:
- 在 NebulaGraph 1.x 中,VID 的类型只能为
INT64
,不支持字符型;在 NebulaGraph 2.x 中,VID 的类型支持INT64
和FIXED_STRING(<N>)
。请在创建图空间时指定 VID 类型,使用INSERT
语句时也需要保持一致,否则会报错 VID 类型不匹配Wrong vertex id type: 1001
。
- VID 最大长度必须为
N
,不可任意长度;超过该长度也会报错The VID must be a 64-bit integer or a string fitting space vertex id length limit.
。
- 在 NebulaGraph 1.x 中,VID 的类型只能为
-
如果出现
Host not enough!
的报错,直接原因是线上 Storage Host 的数量少于即将创建的图空间的replica_factor
的数量。此时,可用SHOW HOSTS
指令查看判断,出现的情况有:- 在集群是单 Storage Host 的情况下试图创建多副本(replica_factor)图空间,这时候只能选择创建单副本数的图空间,或者扩容 Storage Host 之后再创建图空间。
- 新创建的集群里 Storage Host 已经被服务发现,但是尚未执行
ADD HOSTS
将其激活,这时候需要通过 Console 连接,执行SHOW HOSTS
获取被发现了的 Storage Host,然后执行相应的ADD HOSTS
激活,待有足够的 Online Storage Host 之后再尝试创建图空间。
- 有部分 Storage Host 处在非 Online 状态,需要进行进一步排查。
历史版本兼容性
2.5.0 之前的 2.x 版本中,vid_type
不是必选参数,默认为FIXED_STRING(8)
。
Note
graph_space_name
, partition_num
, replica_factor
, vid_type
, comment
设置后就无法改变。除非 DROP SPACE
,并重新CREATE SPACE
。
克隆图空间¶
CREATE SPACE <new_graph_space_name> AS <old_graph_space_name>;
参数 | 说明 |
---|---|
<new_graph_space_name> |
目标图空间名称。该图空间必须未创建。图空间名称以英文字母开头,支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(`)包围,详情参见关键字和保留字。创建时会克隆<old_graph_space_name> 图空间的 Schema,包括图空间本身参数(分片数量、副本数量等)、Tag、Edge type 和原生索引,不会克隆任何数据。 |
<old_graph_space_name> |
原始图空间名称。该图空间必须已存在。 |
示例¶
# 仅指定 VID 类型,其他选项使用默认值。
nebula> CREATE SPACE IF NOT EXISTS my_space_1 (vid_type=FIXED_STRING(30));
# 指定分片数量、副本数量和 VID 类型。
nebula> CREATE SPACE IF NOT EXISTS my_space_2 (partition_num=15, replica_factor=1, vid_type=FIXED_STRING(30));
# 指定分片数量、副本数量和 VID 类型,并添加描述。
nebula> CREATE SPACE IF NOT EXISTS my_space_3 (partition_num=15, replica_factor=1, vid_type=FIXED_STRING(30)) comment="测试图空间";
# 克隆相同图空间的 Schema。
nebula> CREATE SPACE IF NOT EXISTS my_space_4 as my_space_3;
nebula> SHOW CREATE SPACE my_space_4;
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Space | Create Space |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "my_space_4" | "CREATE SPACE `my_space_4` (partition_num = 15, replica_factor = 1, charset = utf8, collate = utf8_bin, vid_type = FIXED_STRING(30)) ON default comment = '测试图空间'" |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Caution
立刻尝试使用刚创建的图空间可能会失败。因为创建是异步实现的。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。如果需要修改心跳间隔,请为所有配置文件修改参数heartbeat_interval_secs
。但过短的心跳周期(<5 秒)可能会导致分布式系统中的机器误判对端失联。
检查分片分布情况¶
在大型集群中,由于启动时间不同,分片的分布可能不均衡。用户可以执行如下命令检查分片的分布情况:
nebula> SHOW HOSTS;
+-------------+------+-----------+----------+--------------+--------------------------------+--------------------------------+---------+
| Host | Port | HTTP port | Status | Leader count | Leader distribution | Partition distribution | Version |
+-------------+------+-----------+----------+--------------+--------------------------------+--------------------------------+---------+
| "storaged0" | 9779 | 19669 | "ONLINE" | 8 | "basketballplayer:3, test:5" | "basketballplayer:10, test:10" | "3.1.0" |
| "storaged1" | 9779 | 19669 | "ONLINE" | 9 | "basketballplayer:4, test:5" | "basketballplayer:10, test:10" | "3.1.0" |
| "storaged2" | 9779 | 19669 | "ONLINE" | 3 | "basketballplayer:3" | "basketballplayer:10, test:10" | "3.1.0" |
+-------------+------+-----------+----------+--------------+--------------------------------+--------------------------------+---------+
如果需要均衡负载,请执行如下命令:
nebula> BALANCE LEADER;
nebula> SHOW HOSTS;
+-------------+------+-----------+----------+--------------+--------------------------------+--------------------------------+---------+
| Host | Port | HTTP port | Status | Leader count | Leader distribution | Partition distribution | Version |
+-------------+------+-----------+----------+--------------+--------------------------------+--------------------------------+---------+
| "storaged0" | 9779 | 19669 | "ONLINE" | 7 | "basketballplayer:3, test:4" | "basketballplayer:10, test:10" | "3.1.0" |
| "storaged1" | 9779 | 19669 | "ONLINE" | 7 | "basketballplayer:4, test:3" | "basketballplayer:10, test:10" | "3.1.0" |
| "storaged2" | 9779 | 19669 | "ONLINE" | 6 | "basketballplayer:3, test:3" | "basketballplayer:10, test:10" | "3.1.0" |
+-------------+------+-----------+----------+--------------+--------------------------------+--------------------------------+---------+
最后更新:
February 23, 2023