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的连接中创建表规则(分片规则)

创建语句此处参考:https://shardingsphere.apache.org/document/5.0.0/cn/user-manual/shardingsphere-proxy/usage/distsql/syntax/rdl/rdl-sharding-rule/

分片算法:
https://shardingsphere.apache.org/document/5.0.0/cn/user-manual/shardingsphere-jdbc/configuration/built-in-algorithm/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编辑规则的主要内容,如果未能解决你的问题,请参考以下文章

ShardingSphere分库分表6-5.x新版本特性

ShardingSphere分库分表6-5.x新版本特性

京东数科主导的首个Apache基金会项目ShardingSphere进入孵化器

ShardingSphere5.0.0-Sharding-proxy MySql 读写分离

ShardingSphere系列之基本概念学习笔记

ShardingSphere系列之基本概念学习笔记