【Mycat 2】详解序列


一、什么是 Mycat 2 序列

当使用 Mycat 作为一个分库分表的逻辑数据库时,序列是为逻辑表自增字段提供自增功能的对象。其概念类似于 Oracle 、DB2 、MS SQL 等传统数据库中序列的概念。

二、Mycat 2 序列的分类

Mycat 2 官方将分序列为 Mycat 2 生成的(全局)序列由 MySQL 生成的序列两种。

但笔者在查阅源码时发现 TimeBasedSequence ,这个也是使用的雪花算法,似乎就只是 Mycat 序列注释里的 Time 属性,也并没有完全实现,与默认的 Mycat 2 序列所采用的雪花算法没有区别。

在这里插入图片描述

笔者理解,Mycat 2 目前版本其实序列只有一种,即 Mycat 2 生成的序列,也就是全局序列。

而 MySQL 生成的序列,虽然有对应的 clazz 属性设置,可似乎没有实现。并且,笔者认为,既然交由 MySQL 管理自增字段,就不需要 Mycat 对序列做什么了,而是由数据库解决方案设计者自行设计、管理,Mycat 仅负责查询汇总。

而且 Mycat 2 倘若后续实现了该功能,笔者认为也是得不偿失的,因为实现该功能的复杂性远大于其价值,成本过高。

如果想实现将如下 SQL 语句自动将数据分布在不同存储节点上,要么很难,要么有诸多使用限制。

insert into db_not_tb__city(name,city) values('a','sh'),('b','sh'),('c','bj'),('d','sh'),('e','sz'),('f','bj'),('g','bj'),('h','sz');

一种比较好的设计是添加新的注释功能或者 SQL 方言(这个 Mycat 团队应该没能力实现),指定插入数据的存储位置。例如,将如上语句分为两个 INSERT 语句。

insert /*+ mycat:"locality":{"targetName":"cls0" }*/ into db_not_tb__city(name,city) values('a','sh'),('b','sh'),('c','bj'),('d','sh');
insert /*+ mycat:"locality":{"targetName":"cls1" }*/ into db_not_tb__city(name,city) values('e','sz'),('f','bj'),('g','bj'),('h','sz');

三、如何创建 Mycat 2 序列

前文已经提过,Mycat 2 实际实现的只有 Mycat 2 利用默认的雪花算法生成的全局序列,因而本文不打算介绍 MySQL 生成序列。

3.1 使用全局序列功能的前提

需要在 Mycat 2 原型库或默认存储节点使用 mysql 客户端执行 dbseq.sql(本文绑定资源点击下载) 脚本,创建 Mycat 全局序列表 mycat_sequence 和相应的序列函数。注意,此步骤只需执行一次。

在使用序列时,如果需要显示指定 targetName 属性,应与执行 dbseq.sql 的数据库相对应。

3.2 序列的命名规范

序列的命名规范是 物理库名 + _ + 物理表名 ,对应的物理存储的序列配置文件名称为 物理库名 + _ + 物理表名 + .sequence.json

注意,不要使用纯英文字幕和数字组成的表名,当前 Mycat 有 Bug 无法识别。 详见 Mycat 2 无法识别普通表名

例如,sharding_db_not_tb 这个序列名中,sharding 表示物理库 shardingdo_not_tb 表示物理库 sharding 中的物理表 do_not_tb

注意
尽管 Mycat 支持逻辑库、表与物理库、表名称不同,但笔者强烈建议设计为相同,以避免不这么做带来的复杂性和不确定性。

3.3 向全局序列表添加新序列的记录

依旧使用上面的例子,假设您要创建的序列名称为 sharding_db_not_tb ,则需要向全局序列表中添加对应的一条数据记录。注意,初始值咬设置为 0

insert into mycat_sequence values('sharding_db_not_tb',0,1);

3.4 创建全局序列(可选)

Mycat 默认即采用雪花算法创建全局序列。

/*+ mycat:setSequence{"name":"sharding_db_not_tb"} */;
# 或者加 `time` 属性
/*+ mycat:setSequence{"name":"sharding_db_not_tb","time":true} */;

3.5 逻辑表建表语句中使用 AUTO_INCREMENT

在表字段后使用 AUTO_INCREMENT 子句(或属性)。

例如:

# create table
/*+ mycat:createTable{
	"schemaName":"sharding",
	"shardingTable":{  
"createTableSQL":"create table db_not_tb(id int primary key AUTO_INCREMENT,name varchar(10),city varchar(10)) dbpartition by MOD_HASH(id) dbpartitions 2",
	
"function":{
				"properties":{
					"dbNum":2,
					"dbMethod":"mod_hash(id)",
					"mappingFormat":"cls${targetIndex}/sharding/db_not_tb",
					"storeNum":2
				}
			}
	},
	"tableName":"db_not_tb"
} */;

四、Mycat 2 序列的核心要点

Mycat 全局序列的核心要点其实是:

  • 执行 dbseq.sql 在原型库创建全局序列表及相关函数。
  • 序列名称符合命名规范。
  • 向全局序列表中插入要创建的序列的记录。
  • 使用 AUTO_INCREMENT
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独上西楼影三人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值