暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HotDB直接通过已有分片规则建表

原创 热璞HotDB 2021-07-28
478

功能说明:

根据管理平台已添加好的分片规则,在计算节点服务端利用特殊语句直接建表,无需再配置表分片信息。利用已有分片规则所建的表,删除表后,管理平台相关表配置信息会同步被删除。
使用前提:已存在分片规则,添加分片规则请参考《分布式事务数据库HotDB Server【管理平台】功能使用手册》。

1. 管理平台新建分片规则,并动态加载。

1).利用服务端口命令:
查看分片规则的functionid| functionname| functiontype| ruleid | rulename等信息,根据相关字段信息创建表。
mysql> show hotdb functions;
±------------±--------------------±--------------±---------------+
| function_id | function_name | function_type | auto_generated |
±------------±--------------------±--------------±---------------+
| 1 | AUTO_GENERATE_CRC32 | AUTO_CRC32 | 1 |
| 2 | AUTO_CRC32_4 |AUTO_CRC32 | 0 |
| 3 | AUTO_CRC32_1 |AUTO_CRC32 | 0 |
| 26 | AUTO_GENERATE_MOD |AUTO_MOD | 1 |
| 31 | 29__MATCH1 | MATCH | 0 |
| 33 | 32_SIMPLE_MOD | SIMPLE_MOD | 0 |
| 36 | 36_SIMPLE_MOD |SIMPLE_MOD | 0 |
| 37 | 37_CRC32_MOD |CRC32_MOD | 0 |
±------------±--------------------±--------------±---------------+
8 rows in set (0.01 sec)
mysql> show hotdb rules;
±--------±-------------------------------------------------------±------------±------------±---------------+
| rule_id | rule_name |rule_column | function_id | auto_generated |
±--------±-------------------------------------------------------±------------±------------±---------------+
| 4 |hotdb-cloud_555f9d00-27c3-4eaa-860c-309312672908 | id | 3 | 0 |
| 12 |hotdb-cloud_8b7d9b8d-f711-476c-aa33-a4e2af184ab5 | adnid | 2 | 0 |
| 13 |hotdb-cloud_7f8fff18-6016-47f1-ab0a-1912f5b75523 | adnid | 2 | 0 |
| 21 |AUTO_GENERATE_3_JOIN_A_JWY | ID | 1 | 1 |
| 50 |AUTO_GENERATE_9_FT_ADDR | ID | 26 | 1 |
| 64 |AUTO_GENERATE_23_S03 | A | 1 | 1 |
±--------±-------------------------------------------------------±------------±------------±---------------+
6 rows in set (0.01 sec)

2.1.水平分片表

水平分片表的定义请参考《分布式事务数据库HotDB Server【名词解释】功能使用手册》,使用如下语法直接引用分片函数创建水平分片表:
CREATE TABLE [IF NOT EXISTS] tbl_name SHARDBY {functionid | functionname} ‘functionid | functionname’ USING COLUMN’shardcolumnname’ (…
CREATE TABLE [IF NOT EXISTS] tbl_name SHARDBY {functiontype} ‘functiontype’ USING COLUMN ‘shardcolumnname’ on datanode’datanodeid’(…

登录服务端,切换逻辑库,输入建表语句,执行成功。 管理平台会显示该表为已定义状态:

mysql> use fun_zy
Database changed
mysql> CREATE TABLE match1_tb shard byfunctionname ‘test_match1’ using column ‘aname’ (id INT UNSIGNED NOT NULLAUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, aname VARCHAR(32) DEFAULT’’, adept VARCHAR(40), adate datetime DEFAULT NULL)ENGINE =INNODB;
Query OK, 0 rows affected (0.09 sec)

对于此语法规则建表,需要注意以下几点:

Ø 'functionid |functionname | functiontype’为具体指定的分片函数ID、分片函数名称、分片函数类型
Ø ‘shardcolumnname’ 为指定的分片字段
Ø 'datanodeid’为节点ID,可以逗号间隔,且支持区间形式指定,如:‘1,3,4,5-10,12-40’,节点ID可登录分布式事务数据库管理平台页面,选择“配置”->“节点管理”查看,也可以登录计算节点服务端口使用命令show hotdb datanodes;查看:
mysql> show hotdb datanodes;
±--------------±---------------±----------------+
| datanode_id | datanode_name | datanode_type |
±--------------±---------------±----------------+
| 9 | dn_01 | 0 |
| 11 | dn_02 | 0 |
| 13 | dn_03 | 0 |
| 15 | dn_04 | 0 |
| 19 | dn_failover | 0 |
| 20 | dn_rmb_01 | 0 |
±--------------±---------------±----------------+
6 rows in set (0.00 sec)

Ø functiontype 只支持 auto_crc32/auto_mod,若使用了其他类型会提示:ERROR:The fucntiontype can only beauto_crc32/auto_mod.
mysql> create table ft_match shard byfunctiontype ‘match’ using column ‘id’ on datanode ‘11,13’(id int(10) primarykey, a char(20) not null);
ERROR 10070 (HY000): The functiontype can only byauto_crc32/auto_mode.

Ø 使用functionid |functionname建表时,当指定的function信息关联的function_type 是auto_crc32/auto_mod 时,需要指定on datanode ‘datanodes’ ,否则会提示:The functionmust be specified datanodes。 如果是其他类型,则无需指定。
mysql> create table mod_ft shard by functionid’15’ using column ‘id’(id int(10) primary key, a char(20) not null);
ERROR 10090 (HY000): The function must bespecified datanodes.
mysql> create table testsa shard by functionid’3’ using column ‘id’(id int,a int);
Query OK, 0 rows affected, 1 warning (0.10 sec)
mysql> CREATE TABLE match_tb shard byfunctionname ‘test_match1’ using column ‘ananme’ on datanode ‘1,2’(id INTUNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, anameVARCHAR(32) DEFAULT ‘’, adept VARCHAR(40), adate datetime DEFAULT NULL)ENGINE=INNODB;
ERROR 10090 (HY000): This rule doesn’t need tospecify a datanodes;

表结构类似的表可以使用相同的分片规则,使用如下语法可直接引用分片规则创建水平分片表:
CREATE TABLE [IF NOT EXISTS] tbl_name SHARDBY {ruleid | rulename} ‘ruleid\rulename’ [on datanode ‘datanodes’] (…

登录计算节点服务端口使用命令,show hotdb rules;和show hotdbfunctions;可以看到与之分片函数关联的分片规则:
mysql> show hotdb rules;
±--------±-------------------------------------------------------±------------±------------±---------------+
| rule_id | rule_name |rule_column | function_id | auto_generated |
±--------±-------------------------------------------------------±------------±------------±---------------+
| 17 | AUTO_GENERATE_3_ROUTE1_TB | A | 1 | 1 |
±--------±-------------------------------------------------------±------------±------------±---------------+
21 rows in set (0.01 sec)
mysql> show hotdb functions;
±------------±--------------------±--------------±---------------+
| function_id | function_name | function_type| auto_generated |
±------------±--------------------±--------------±---------------+
| 1 | test_route1 | ROUTE | 1 |
±------------±--------------------±--------------±---------------+
13 rows in set (0.01 sec)

用户可用ruleid/rulename来直接创建表:
mysql> CREATE TABLE rt_table shard by ruleid’17’(id int not null auto_increment primary key,a int(10),b decimanl(5,2),cdecimal(5,2),d date,e time(6),f timestamp(6) DEFAULT CURRENT_TIMESTAMP(6),gdatetime(6) DEFAULT CURRENT_TIMESTAMP(6),h year,I char(20) charcter set utf8,jvarchar(30) character set utf8mb4,k char(20) character set gbk,l text characterset latin1, m enum(’’,‘null’,‘1’,‘2’,‘3’),n set(’’,‘null’,‘1’,‘2’,‘3’));
Query OK, 0 rows affected (0.07 sec)

对于此语法规则建表,需要注意以下几点:
Ø 当指定的rule关联的function_type是auto_crc32/auto_mod 时,需要指定on datanode ‘datanodes’;如果是其他类型,则无需指定datanode。
mysql> show hotdb rules;
±--------±-------------------------------------------------------±------------±------------±---------------+
| rule_id | rule_name |rule_column | function_id | auto_generated |
±--------±-------------------------------------------------------±------------±------------±---------------+
| 17 | AUTO_GENERATE_3_ROUTE1_TB | A | 1 | 1 |
±--------±-------------------------------------------------------±------------±------------±---------------+
21 rows in set (0.01 sec)
mysql> show hotdb functions;
±------------±--------------------±--------------±---------------+
| function_id | function_name | function_type| auto_generated |
±------------±--------------------±--------------±---------------+
| 1 | test_route1 | ROUTE | 1 |
±------------±--------------------±--------------±---------------+
13 rows in set (0.01 sec)
mysql> CREATE TABLE route2_rptb1 shard byrulename ‘AUTO_GENERATE_3_ROUTE1_TB’ on datanode ‘9,11,13’(id int not nullauto_increment primary key,a int(10),b decimanl(5,2),c decimal(5,2),d date,etime(6),f timestamp(6) DEFAULT CURRENT_TIMESTAMP(6),g datetime(6) DEFAULTCURRENT_TIMESTAMP(6),h year,i char(20) charcter set utf8,j varchar(30)character set utf8mb4,k char(20) character set gbk,l text character set latin1,m enum(’’,‘null’,‘1’,‘2’,‘3’),n set(’’,‘null’,‘1’,‘2’,‘3’));
ERROR 10090 (HY000): This rule doesn’t need tospecify a datanodes;

Ø 当指定的rule关联的function_type是auto_crc32/auto_mod 时, 指定的datanode 个数与参数不符时,则会提示:ERROR:The totalnumber of datanodes must be XXX(XXX为实际ruleid 关联的 function info的 column_value值):
mysql> CREATE TABLE auto_c shard by ruleid’63’ on datanode ‘9’(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnidINT DEFAULT NULL, aname VARCHAR(32) DEFAULT ‘’,adept VARCHAR(40), adatedatetime DEFAULT NULL)ENGINE=INNODB;
ERROR 10090 (HY000): The total number ofdatanodes must be 2
mysql> CREATE TABLE auto_c shard by ruleid’63’ on datanode ‘9,15’(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,adnid INT DEFAULT NULL, aname VARCHAR(32) DEFAULT ‘’,adept VARCHAR(40), adatedatetime DEFAULT NULL)ENGINE=INNODB;
Query OK, 0 rows affected (0.13 sec)

2.2.垂直分片表

垂直分片表的定义请参考《分布式事务数据库HotDB Server【名词解释】功能使用手册》,使用如下语法规则在服务端创建垂直分片表:
CREATE TABLE [IF NOT EXISTS] tbl_name SHARDBY vertical on datanode ‘datanodeid’(…

Server端直接创建垂直分片表时, 必须在shard by 后面加vertical,且在on datanode之前,顺序不可调换。
mysql> CREATE TABLE tb_vertical shard byvertical on datanode’9’( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,adnid INT DEFAULT NULL, aname VARCAHR(32) DEFAULT ‘’, adept VARCHAR(40), adateDATETIME DEFAULT NULL)ENGINE=INNODB;
Query OK, 0 rows affected(0.07 sec)
image.png
语法规则里的vertical是创建垂直分片表的标志,且datanodeid 仅能指定一个,若超过,会有提示:ERROR:Can onlyspecify one datanode.

Ø 未指定datanode:

mysql> CREATE TABLE tb1_vertical shard byvertical( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INTDEFAULT NULL, aname VARCAHR(32) DEFAULT ‘’, adept VARCHAR(40), adate DATETIMEDEFAULT NULL)ENGINE=INNODB;
ERROR 10090 (HY000): This table has to specify adatanodes.

Ø 指定多个节点:

mysql> CREATE TABLE tb1_vertical shard byvertical on datanode’9,11,13’( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARYKEY, adnid INT DEFAULT NULL, aname VARCAHR(32) DEFAULT ‘’, adept VARCHAR(40),adate DATETIME DEFAULT NULL)ENGINE=INNODB;
ERROR 10090 (HY000): Can only specify onedatanodes.

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论