4、常用分片规则简介
(1)MOD_HASH
[数据分片]HASH型分片算法-MOD_HASH
如果分片值是字符串则先对字符串进行hash转换为数值类型
分库键和分表键是同键
分表下标=分片值%(分库数量*分表数量)
分库下标=分表下标/分表数量
分库键和分表键是不同键:
分表下标=分片值%分表数量
分库下标=分片值%分库数量
(2) RIGHT_SHIFT
[数据分片]HASH型分片算法-RIGHT_SHIFT
RIGHT_SHIFT(字段名,位移数)
仅支持数值类型
分片值右移二进制位数,然后按分片数量取余
( 3) YYYYMd
[数据分片]HASH型分片算法-YYYYMM
仅用于分库
(YYYY*12+MM)%分库数.MM是1-12
( 4)MMDD
仅用于分表
仅DATE/DATETIME
一年之中第几天%分表数
tbpartitions不超过366
5.5 全局序列
Mycat2在1.x版本上简化全局序列,自动默认使用雪花算法生成全局序列号,如不需要Mycat.默认的全局序列,可以通过配置关闭自动全局序列
1、建表语句方式关闭全局序列
如果不需要使用mycat的自增序列,而使用mysql本身的自增主键的功能,需要在配置中更改对应的建表sql,不设置AUTO_INCREMENT关键字,这样, mycat就不认为这个表有自增主键的功能,就不会使用mycat的全局序列号.这样,对应的插入sql.在mysql.处理,由mysql的自增主键功能补全自增值.
雪花算法:引入了时间戳和ID保持自增的分布式ID生成算法
建表sql可以自动在原型库对应的逻辑表的物理表获取,如果逻辑表的建表SQL 与物理表的建表SQL不对应,则需要在配置文件中配置建表SQL.
例如:
#带AUTO_INCREMENT 关键字使用默认全局序列 CREATE TABLE db1.travelrecord ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` varchar (100) DEFAULT NULL, `traveldate` date DEFAULT NULL, `fee` decimal(10,0) DEFAULT NULL, `days` int DEFAULT NULL, `blob` longblob, PRIMARY KEY (`id`), · KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST ;
#带AUTO_INCREMENT 关键字使用默认全局序列 CREATE TABLE db1.travelrecord ( `id` bigint NOT NULL, `user_id` varchar (100) DEFAULT NULL, `traveldate` date DEFAULT NULL, `fee` decimal(10,0) DEFAULT NULL, `days` int DEFAULT NULL, `blob` longblob, PRIMARY KEY (`id`), · KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST ;
2、设置Mycat数据库方式获取全局序列
#1、在prototype服务器的db1库导入dbseq.sql文件
Mycat2已经为用户提供了相关sql脚本,需要在对应数据库下运行脚本,不能通过Mycat客户端执行。
脚本所在目录mycat/confe
脚本内容
DROP TABLE IF EXISTS MYCAT_SEQUENCE; CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(64) NOT NULL, current_value BIGINT(20) NOT NULL, increment INT NOT NULL DEFAULT 1, PRIMARY KEY (name) ) ENGINE=InnoDB; -- ---------------------------- -- Function structure for `mycat_seq_currval` -- ---------------------------- DROP FUNCTION IF EXISTS `mycat_seq_currval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(64)) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval="-1,0"; SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name; RETURN retval ; END ;; DELIMITER ; -- ---------------------------- -- Function structure for `mycat_seq_nextval` -- ---------------------------- DROP FUNCTION IF EXISTS `mycat_seq_nextval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(64)) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); DECLARE val BIGINT; DECLARE inc INT; DECLARE seq_lock INT; set val = -1; set inc = 0; SET seq_lock = -1; SELECT GET_LOCK(seq_name, 15) into seq_lock; if seq_lock = 1 then SELECT current_value + increment, increment INTO val, inc FROM MYCAT_SEQUENCE WHERE name = seq_name for update; if val != -1 then UPDATE MYCAT_SEQUENCE SET current_value = val WHERE name = seq_name; end if; SELECT RELEASE_LOCK(seq_name) into seq_lock; end if; SELECT concat(CAST((val - inc + 1) as CHAR),",",CAST(inc as CHAR)) INTO retval; RETURN retval; END ;; DELIMITER ; -- ---------------------------- -- Function structure for `mycat_seq_setvals` -- ---------------------------- DROP FUNCTION IF EXISTS `mycat_seq_nextvals`; DELIMITER ;; CREATE FUNCTION `mycat_seq_nextvals`(seq_name VARCHAR(64), count INT) RETURNS VARCHAR(64) CHARSET latin1 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); DECLARE val BIGINT; DECLARE seq_lock INT; SET val = -1; SET seq_lock = -1; SELECT GET_LOCK(seq_name, 15) into seq_lock; if seq_lock = 1 then SELECT current_value + count INTO val FROM MYCAT_SEQUENCE WHERE name = seq_name for update; IF val != -1 THEN UPDATE MYCAT_SEQUENCE SET current_value = val WHERE name = seq_name; END IF; SELECT RELEASE_LOCK(seq_name) into seq_lock; end if; SELECT CONCAT(CAST((val - count + 1) as CHAR), ",", CAST(val as CHAR)) INTO retval; RETURN retval; END ;; DELIMITER ; -- ---------------------------- -- Function structure for `mycat_seq_setval` -- ---------------------------- DROP FUNCTION IF EXISTS `mycat_seq_setval`; DELIMITER ;; CREATE FUNCTION `mycat_seq_setval`(seq_name VARCHAR(64), value BIGINT) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); DECLARE inc INT; SET inc = 0; SELECT increment INTO inc FROM MYCAT_SEQUENCE WHERE name = seq_name; UPDATE MYCAT_SEQUENCE SET current_value = value WHERE name = seq_name; SELECT concat(CAST(value as CHAR),",",CAST(inc as CHAR)) INTO retval; RETURN retval; END ;; DELIMITER ; INSERT INTO MYCAT_SEQUENCE VALUES ('GLOBAL', 1, 1);
#2、添加全局序列配置文件
进入/mxcat/conf/sequences目录,添加配置文件
{数据库名字}_{表名字}.sequence.jison
配置内容:
{ "clazz": "io.mycat.plug.sequence.SequenceMySQLGenerator" , "name": "db1_travelrecord" , "targetName": "prototype" , "schemaName": "db1"//指定物理库名 }
可选参数targetName·更改序列号服务器
“targetName”: "prototype”是执行自增序列的节点,也是dbsea.sal导入的节点
dbseq.sql导入的当前库的库名与逻辑表的逻辑库名一致
导入后检查库下有没有mvcat sequence表。
其中increment是序列号自增的步伐,为1的时候严格按1递增,当1000的时候,mycat会每次批量递增1000取序列号.此时在多个myeat访问此序列号表的情况下,不能严格自增
NAME列中的值是对应的 库名_表名 该值需要用户设置,即插入一条逻辑表相关的记录,用于记录序列号
#3、切换为数据库方式全局序列号
使用注释前要导入dbsega.sal以及设置mycat…sequence表内的逻辑表记录通过注释设置为数据库方式全局序列号
/*+·mycat:setSequence { "name" :"db1_travelrecord" , "clazz" :"io.mycat.plug.sequence.SequenceMySQLGenerator" , "name" :"db1_travelrecord" , "targetName" : "prototype" , "schemaName" : " db2" }*/;
#4、切换为雪花算法方式全局序列号4
/*+mycat:setSequence{"name" :"dbl_travelrecord","time":true}·*/ ;
第六章 Mycat 安全设置
6.1 权限配置
1、 user 标签权限控制
目前 Mycat 对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过mycat/conf/users目录下的{用户名}.user.json进行配置。
#root.user.json { "dialect":"mysql", "ip":null, "password":"123456", "transactionType":"xa", "username":"root" }
配置说明
标签属性 | 说明 |
name | 应用连接中间件逻辑库的用户名 |
password | 该用户对应的密码 |
ip | 建议为空,填写后会对客户端的ip进行限制 |
dialectc | 使用语言,默认mvsal |
transactionType | 事务类型,默认proxy proxy:本地事务,在涉及大于1个数据库的事务, commit阶段失败会导致不一致,但是兼容性最好 |
2、·权限说明
Mycat2权限分为两块:登录权限、sql权限
(1)登录权限:
Mycat2在 MySQL 网终协议的时候检查客户端的IP,用户名,密码其中IP使用正则表达式匹配,一旦匹配成功,就放行
( 2) sql权限
使用自定义拦截器实现
第七章·Mycat 相关工具
7.1-Mycat2-UI
Mycat2·UI是官方推出的 Mycat2监控工具。
1、下载
http://dl.mycat.org.cn/2.0/ui/
2、运行环境
在安装JDK8的环境,双击 jar包就可以打
assistant-1.22-release-jar-with-dependencies-2022-5-19.jar
3、使用
#双击 java -jar .\assistant-1.22-release-jar-with-dependencies-2022-5-19.jar
(1)连接
连接Mycat2(需要Mycat2服务器正常启动)
点击文件->点击新连接
(2)编辑分片表
导入文件是csv格式,无表头
(6项)
prototype,s0,t0,0,0,0
prototype,s0,t1,0,1,1
(3项)
prototype, s0,t0
prototype, s0, t1
暂时不支持自动 HASH 型算法的分区导入
物理分库下标,物理分表下标是根据分片算法要求填入,没有明确要求不需要填写
对于1.6的分片算法,物理分库下标,物理分表下标是没有意义的,只有总物理分表下标有意义(总分表的下标)
(3)编辑索引表
(4)编辑全局表
最后
Markdown 37371 字数 2290 行数
HTML 30680 字数 1484 段落
2022/8/26 18:50
暑假学习结束