ShardingSphere使用DistSQL编辑规则
Posted 胡乐天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ShardingSphere使用DistSQL编辑规则相关的知识,希望对你有一定的参考价值。
介绍:
标准的 SQL 提供了如 DQL、DDL、DML、DCL 等不同类型的语法,用于定义不同功能的 SQL 语句,DistSQL 也定义了一套自己的语法体系。
在 ShardingSphere 中, DistSQL 的语法目前主要划分为 RDL、RQL 和 RAL 三种类型:
RDL(Resource & Rule Definition Language),资源规则定义语言,用于资源和规则的创建、修改和删除;
RQL(Resource & Rule Query Language),资源规则查询语言,用于资源和规则的查询和展现;
RAL(Resource & Rule Administrate Language),资源规则管理语言,用于 Hint、事务类型切换、分片执行计划查询等增量功能操作。
仅支持:ShardingSphere-Proxy
1.持久化两种方式
单机版和zookeeper集群版
注:
以下介绍使用单机版,且只做了分库,未做分表(大同小异)
分片算法使用:枚举
我用的版本是5.0(2022 0311之后的版本)
下载路径:https://nightlies.apache.org/shardingsphere/
2.修改配置文件server.yml
mode:
type: Standalone
repository:
type: File
overwrite: false
rules:
- !AUTHORITY
users:
- root@%:root
- sharding@:sharding
provider:
type: ALL_PRIVILEGES_PERMITTED
- !TRANSACTION
defaultType: XA
providerType: Atomikos
- !SQL_PARSER
sqlCommentParseEnabled: true
3.启动
4.连接数据库
mysql –P 3307 –h127.0.0.1 –uroot –proot
注:sharding默认端口为3307,可在启动的时候,后面跟上参数,即可修改端口
日常使用的几句命令
– 查看当前分库资源连接sql:
Show schema resources from sharding_db;
删除数据源:
Drop resource ds_xuxiao1,ds_xuexiao2;
查看当前数据库下所有的分片规则sql:
show sharding table rules from sharding_db;
删除表规则和表:
drop sharding table rule ed_school; drop table ed_school;
5.创建sharding数据库,并使用
Create database sharding_db;
Use sharding_db;
6.创建分库(在localost中创建的)
CREATE DATABASE `xuexiao1` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin';
CREATE DATABASE `xuexiao2` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin';
注:此处使用utf8mb4原因:防止emojo表情无法存储
7.将分库数据源增加到sharding代理上
sharding的连接上执行以下:
add resource ds_xuexiao1 (
host=localhost,
port=3306,
db=xuexiao1,
user=root,
password=123456
);
add resource ds_xuexiao2 (
host=127.0.0.1,
port=3306,
db=xuexiao2,
user=root,
password=123456
);
8.在sharding的连接中创建表规则(分片规则)
此处使用类型为:INLINE的枚举算法(算法和类型一定要写对,否则创建表规则是不成功的,并且2022年3月11日之前的版本使用枚举算法是有bug的)
创建表规则
CREATE sharding TABLE rule ed_school (
datanodes ( "ds_$['xuexiao1','xuexiao2'].ed_school" ),
database_strategy (
type = standard,
sharding_column = school_code,
sharding_algorithm (
TYPE (
NAME = inline,
PROPERTIES ( "algorithm-expression" = "ds_$school_code" ))))
);
9.在sharding的连接中创建表
CREATE TABLE `ed_school` (
`school_code` varchar(20) NOT NULL DEFAULT 'xuexiao' COMMENT '学校编码',
`school_type` varchar(50) DEFAULT NULL COMMENT '学校类型名称',
`school_seq` char(3) DEFAULT NULL COMMENT '学校内部序号编码',
`school_name` varchar(100) DEFAULT NULL COMMENT '学校名称',
`school_headmaster` varchar(50) DEFAULT NULL COMMENT '校长姓名',
`school_logo` varchar(255) DEFAULT NULL COMMENT '学校logo',
`province` varchar(50) DEFAULT NULL COMMENT '省份',
`city` varchar(50) DEFAULT NULL COMMENT '地市',
`is_valid` tinyint(4) DEFAULT '1',
PRIMARY KEY (`school_code`),
KEY `FK_学校属于学校类型` (`school_type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学校';
创建表后,两个分库中都会自动创建
10.测试该表的分片规则
INSERT INTO ed_school VALUES ('xuexiao1', '高档学校', '000', '学校1', '胡乐天1', NULL, '新疆', '石河子', 1);
INSERT INTO ed_school VALUES ('xuexiao2', '起步学校', '013', '学校2', '胡乐天2', NULL, '江苏', '南京', 1);
执行完后,查看两个分库表中是否都含有对应的数据!!!!
11.修改表规则(例如增加了一所学校,编码为xuexiao3)
①首先创建分库xuexiao3
CREATE DATABASE `xuexiao3` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin';
②同步原有结构到xuexiao3数据库中(可用Navicat中的工具-》结构同步)
③增加xuexiao3的数据源
add resource ds_xuexiao3 (
host=localhost,
port=3306,
db=xuexiao3,
user=root,
password=123456
);
④修改ed_school的分片规则
ALTER sharding TABLE rule ed_school (
datanodes ( "ds_$['xuexiao1','xuexiao2', 'xuexiao3'].ed_school" ),
database_strategy (
type = standard,
sharding_column = school_code,
sharding_algorithm (
TYPE (
NAME = inline,
PROPERTIES ( "algorithm-expression" = "ds_$school_code" ))))
);
⑤测试
INSERT INTO ed_school VALUES ('xuexiao3', '普通学校', '020', '学校3', '乐天3', NULL, '北京', '北京市市辖区', 1);
检查xuexiao3库中是否有了该数据!!
12.在sharding中添加广播表规则
广播表,即为所有分库中都会完全存在一样的所有数据,一般用于字典表。
语法:
创建: CREATE SHARDING BROADCAST TABLE RULES (tableName [, tableName] …)
修改: ALTER SHARDING BROADCAST TABLE RULES (tableName [, tableName] …)
编辑: DROP SHARDING BROADCAST TABLE RULES (tableName [, tableName] …)
举例:系统配置表
创建广播表规则
CREATE SHARDING BROADCAST TABLE RULES (sys_config);
创建表
CREATE TABLE `sys_config` (
`config_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '参数主键',
`config_name` varchar(100) DEFAULT '' COMMENT '参数名称',
`config_key` varchar(100) DEFAULT '' COMMENT '参数键名',
`config_value` varchar(500) DEFAULT '' COMMENT '参数键值',
`config_type` char(1) DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
`create_by` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`config_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='参数配置表';
测试插入
INSERT INTO `sys_config` VALUES (1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2022-01-06 11:00:07', '', NULL, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow');
检查xuexiao1、xuexiao2、xuexiao3分库的该表中是否都有这条数据,都有即正确!
参考:
DistSQL分片:
https://shardingsphere.apache.org/document/5.0.0/cn/user-manual/shardingsphere-proxy/usage/distsql/
sharding中文论坛:
https://community.sphere-ex.com/
sharding源码和issue:
https://github.com/apache/shardingsphere
以上是关于ShardingSphere使用DistSQL编辑规则的主要内容,如果未能解决你的问题,请参考以下文章
京东数科主导的首个Apache基金会项目ShardingSphere进入孵化器