图空间是Nebula Graph中彼此隔离的图数据集合,与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> |
在Nebula Graph实例中唯一标识一个图空间。图空间名称由大小写英文字母、数字或下划线组成,区分大写小,且不可使用关键字和保留字。 |
partition_num |
指定图空间的分片数量。建议设置为5倍的集群硬盘数量。例如集群中有3个硬盘,建议设置15个分片。默认值为100。 |
replica_factor |
指定每个分片的副本数量。建议在生产环境中设置为3,在测试环境中设置为1。由于需要基于多数表决,副本数量必须是奇数。默认值为1。 |
vid_type |
必选参数。指定点ID的数据类型。可选值为FIXED_STRING(<N>) 和INT64 。INT 等同于INT64 。FIXED_STRING(<N>) 表示数据类型为字符串,最大长度为N ,超出长度会报错;INT64 表示数据类型为整数。 |
COMMENT |
图空间的描述。最大为256字节。默认无描述。 |
!!! caution
如果将副本数设置为1,用户将无法使用[BALANCE](../../8.service-tuning/load-balance.md)命令为Nebula Graph的存储服务平衡负载或扩容。
!!! caution
VID类型变更与长度限制
1. 在Nebula Graph 1.x中,VID的类型只能为`INT64`,不支持字符型;在Nebula Graph 2.x中, VID的类型支持`INT64`和`FIXED_STRING(<N>)`。请在创建图空间时指定VID类型,使用`INSERT`语句时也需要保持一致,否则会报错VID类型不匹配`Wrong vertex id type: 1001`。
2. VID最大长度必须为`N`,不可任意长度;超过该长度也会报错`The VID must be a 64-bit integer or a string fitting space vertex id length limit.`。
!!! compatibility "历史版本兼容性"
2.5.0之前的2.x版本中,`vid_type`不是必选参数,默认为`FIXED_STRING(8)`。
!!! note
`graph_space_name`, `partition_num`, `replica_factor`, `vid_type`, `comment` 设置后就无法改变。除非[`DROP SPACE`](./5.drop-space.md),并重新`CREATE SPACE`。
CREATE SPACE <new_graph_space_name> AS <old_graph_space_name>;
参数 | 说明 |
---|---|
<new_graph_space_name> |
目标图空间名称。该图空间必须未创建。图空间名称由大小写英文字母、数字或下划线组成,区分大写小,且不可使用关键字和保留字。创建时会克隆<old_graph_space_name> 图空间的Schema,包括图空间本身参数(分片数量、副本数量等),以及Tag、Edge type和原生索引。 |
<old_graph_space_name> |
原始图空间名称。该图空间必须已存在。 |
# 仅指定VID类型,其他选项使用默认值。
nebula> CREATE SPACE my_space_1 (vid_type=FIXED_STRING(30));
# 指定分片数量、副本数量和VID类型。
nebula> CREATE SPACE my_space_2 (partition_num=15, replica_factor=1, vid_type=FIXED_STRING(30));
# 指定分片数量、副本数量和VID类型,并添加描述。
nebula> CREATE SPACE my_space_3 (partition_num=15, replica_factor=1, vid_type=FIXED_STRING(30)) comment="测试图空间";
# 克隆图空间。
nebula> CREATE SPACE 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
立刻尝试使用刚创建的图空间可能会失败,因为创建是异步实现的。
Nebula Graph将在下一个心跳周期内完成图空间的创建,为了确保创建成功,可以使用如下方法之一:
-
在
SHOW SPACES
或DESCRIBE SPACE
语句的结果中查找新的图空间,如果找不到,请等待几秒重试。 -
等待两个心跳周期,例如20秒。
如果需要修改心跳间隔,请为所有配置文件修改参数heartbeat_interval_secs
。但过短的心跳周期(<5秒)可能会导致分布式系统中的机器误判对端失联。
在大型集群中,由于启动时间不同,分片的分布可能不均衡。用户可以执行如下命令检查分片的分布情况:
nebula> SHOW HOSTS;
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| Host | Port | Status | Leader count | Leader distribution | Partition distribution |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| "storaged0" | 9779 | "ONLINE" | 8 | "basketballplayer:3, test:5" | "basketballplayer:10, test:10" |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| "storaged1" | 9779 | "ONLINE" | 9 | "basketballplayer:4, test:5" | "basketballplayer:10, test:10" |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| "storaged2" | 9779 | "ONLINE" | 3 | "basketballplayer:3" | "basketballplayer:10, test:10" |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| "Total" | | | 20 | "basketballplayer:10, test:10" | "basketballplayer:30, test:30" |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
如果需要均衡负载,请执行如下命令:
nebula> BALANCE LEADER;
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| Host | Port | Status | Leader count | Leader distribution | Partition distribution |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| "storaged0" | 9779 | "ONLINE" | 7 | "basketballplayer:3, test:4" | "basketballplayer:10, test:10" |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| "storaged1" | 9779 | "ONLINE" | 7 | "basketballplayer:4, test:3" | "basketballplayer:10, test:10" |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| "storaged2" | 9779 | "ONLINE" | 6 | "basketballplayer:3, test:3" | "basketballplayer:10, test:10" |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+
| "Total" | | | 20 | "basketballplayer:10, test:10" | "basketballplayer:30, test:30" |
+-------------+------+----------+--------------+--------------------------------+--------------------------------+