数据库方式
原理
在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每次读取多少个sequence,假设为K)等信息;
Sequence获取步骤:
1).当初次使用该sequence时,根据传入的sequence名称,从数据库这张表中读取current_value,
和increment到MyCat中,并将数据库中的current_value设置为原current_value值+increment值;
.MyCat将读取到current_value+increment作为本次要使用的sequence值,下次使用时,自动加1,
当使用increment次后,执行步骤1)相同的操作.
MyCat负责维护这张表,用到哪些sequence,只需要在这张表中插入一条记录即可。若某次读取的
sequence没有用完,系统就停掉了,则这次读取的sequence剩余值不会再使用。

创建一个 person表,主键为Id,hash方式分片,主键自增(采用数据库方式),当自增的step分别为10,100,1万的三种情况下,对此表做性能测试。
person表结构如下
Id,主键,Mycat自增主键
name,字符串,16字节最长
school,毕业学校,数字,1-1000范围,是学校编号
age,年龄,18-60
addr,地址,32字节,建议为 gz-tianhe(城市-地区两级 枚举的仿真数据)
zcode,邮编,
birth,生日,为日期类型, 1980到2010年之间随机的日期
score,得分,0-100分

1 自增主键(数据库方式)
[mysql@hongquan ~]$ cd /usr/local/mycat/
[mysql@hongquan mycat]$ ll
total 8
drwxr-xr-x 8 mycat mycat 4096 Jun 22 03:13 jdk1.8.0_101
drwxr-xr-x 7 mycat mycat 4096 Oct 11 03:05 mycat
server.xml配置:
<system><property name="sequnceHandlerType">1</property></system>
注:sequnceHandlerType 需要配置为1,表示使用数据库方式生成sequence.
数据库配置:
创建表,函数
use db1;
创建表
DROP TABLE IF EXISTS MYCAT_SEQUENCE;
CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY (name) ) ENGINE=InnoDB;
创建函数
DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`system`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
RETURN retval ;
END
;;
DELIMITER ;

DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`system`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;

DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER=`system`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;

INSERT INTO db1.MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GLOBAL', 1, 1);
[root@hqmysql1 conf]# vim sequence_db_conf.properties
sequence_db_conf.properties相关配置,指定sequence相关配置在哪个节点上:
USER_SEQ=dn1
TABLE1=dn1
INSERT INTO db1.MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GLOBAL', 1, 1);
INSERT INTO db1.MYCAT_SEQUENCE(name,current_value,increment) VALUES ('COMPANY', 2, 10);
INSERT INTO db1.MYCAT_SEQUENCE(name,current_value,increment) VALUES ('TABLE1', 2, 10);
--重启mycat
[root@hqmysql1 bin]# ./mycat stop
Stopping Mycat-server...
Stopped Mycat-server.
[root@hqmysql1 bin]# ./mycat start
Starting Mycat-server...

select * from MYCAT_SEQUENCE;
select next value for MYCATSEQ_GLOBAL,next value for MYCATSEQ_GLOBAL;
select next value for MYCATSEQ_TABLE1,next value for MYCATSEQ_COMPANY;

caught err: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :' for MYCATSEQ_GLOBAL,next value for',expect UPDATE, actual IDENTIFIER MYCATSEQ_GLOBAL

错误:
mysql> insert into table2(name_) values(1);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> select next value for MYCATSEQ_TABLE2,next value for MYCATSEQ_TABLE2;
+--------------------+--------------------+
| 804585874594598912 | 804585874594598912 |
+--------------------+--------------------+
| 804585874594598912 | 804585874594598912 |
--重启mycat,正常,难道是reload @@config_all;对server.xml的配置不生效??
mysql> select next value for MYCATSEQ_TABLE2,next value for MYCATSEQ_TABLE2;
+---+---+
| 2 | 2 |
+---+---+
| 2 | 2 |
mysql> insert into table2(id,name_) values(next value for MYCATSEQ_TABLE2,2);
Query OK, 1 row affected (0.14 sec)

mysql> insert into table2(id,name_) values(next value for MYCATSEQ_TABLE2,2);
Query OK, 1 row affected (0.15 sec)

mysql> insert into table2(id,name_) values(next value for MYCATSEQ_TABLE2,2);
Query OK, 1 row affected (0.11 sec)

mysql> select * from table2;
+----+-------+
| id | name_ |
+----+-------+
| 4 | 2 |
| 3 | 2 |
| 5 | 2 |
+----+-------+
3 rows in set (0.10 sec)

<table name="table1" primaryKey="id_" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />

CREATE TABLE table1(
‘id_’ INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
‘name_’ INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (‘id_’)
) ENGINE=MYISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
---
<table name="person1" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
<table name="person2" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
<table name="person3" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />

INSERT INTO db1.MYCAT_SEQUENCE(name,current_value,increment) VALUES ('PERSON1', 1, 10);
INSERT INTO db1.MYCAT_SEQUENCE(name,current_value,increment) VALUES ('PERSON2', 1, 100);
INSERT INTO db1.MYCAT_SEQUENCE(name,current_value,increment) VALUES ('PERSON3', 1, 1000);
PERSON1=dn1
PERSON2=dn1
PERSON3=dn1
create table person1(
id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
name varchar(16) not null,
school int(4) not null,
age int(3) not null,
addr varchar(32),
zcode int(10),
birth datetime,
score int(3),PRIMARY KEY (id))ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
insert into person1(id,name,school,age,addr,zcode,birth,score)
values(next value for MYCATSEQ_PERSON1,'xiaoming',100,19,'gz-tianhe',1254565,now(),90);
2016-12-02 00:59:22.081 DEBUG [Thread-1] (io.mycat.server.NonBlockingSession.execute(NonBlockingSession.java:119)) - ServerConnection [id=5, schema=TESTDB, host=10.0.1.134, user=system,txIsolation=3, autocommit=true, schema=TESTDB]insert into person3(id,name,school,age,addr,zcode,birth,score)
values( 1001,'xiaoming',100,19,'gz-tianhe',1254565,now(),90), route={
1 -> dn3{insert into person3(id,name,school,age,addr,zcode,birth,score)
values( 1001,'xiaoming',100,19,'gz-tianhe',1254565,now(),90)}
} rrs
2016-12-02 00:59:22.081 DEBUG [Thread-1] (io.mycat.backend.mysql.nio.handler.SingleNodeHandler.execute(SingleNodeHandler.java:173)) - rrs.getRunOnSlave() null
2016-12-02 00:59:22.081 DEBUG [Thread-1] (io.mycat.backend.mysql.nio.handler.SingleNodeHandler.execute(SingleNodeHandler.java:175)) - node.getRunOnSlave() null
2016-12-02 00:59:22.082 DEBUG [Thread-1] (io.mycat.backend.mysql.nio.handler.SingleNodeHandler.execute(SingleNodeHandler.java:184)) - node.getRunOnSlave() null
2016-12-02 00:59:22.082 DEBUG [Thread-1] (io.mycat.backend.mysql.nio.handler.SingleNodeHandler.execute(SingleNodeHandler.java:186)) - node.getRunOnSlave() null
2016-12-02 00:59:22.082 DEBUG [Thread-1] (io.mycat.backend.datasource.PhysicalDBNode.getConnection(PhysicalDBNode.java:96)) - rrs.getRunOnSlave() null
2016-12-02 00:59:22.082 DEBUG [Thread-1] (io.mycat.backend.datasource.PhysicalDBNode.getConnection(PhysicalDBNode.java:127)) - rrs.getRunOnSlave() null
2016-12-02 00:59:22.105 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.releaseConnection(NonBlockingSession.java:354)) - release connection MySQLConnection [id=34, lastTime=1480669162082, user=system, schema=db3, old shema=db3, borrowed=true, fromSlaveDB=false, threadId=1208094, charset=utf8, txIsolation=3, autocommit=true, attachment=dn3{insert into person3(id,name,school,age,addr,zcode,birth,score)
values( 1001,'xiaoming',100,19,'gz-tianhe',1254565,now(),90)}, respHandler=SingleNodeHandler [node=dn3{insert into person3(id,name,school,age,addr,zcode,birth,score)
values( 1001,'xiaoming',100,19,'gz-tianhe',1254565,now(),90)}, packetId=1], host=10.0.1.134, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]

mycat sequence的更多相关文章

  1. mycat学习日记:全局sequence

    mycat分库分表的情况下,原生mysql的自增长主键无法满足主键全局唯一这个要求.看了MYCAT社区从零开始的一篇博客,加上自己的实践,大概总结一下. 目前mycat对于全局sequence主要提供 ...

  2. mycat入门教程

    github https://github.com/MyCATApache/Mycat-Server myCat介绍 myCat的诞生,要从其前身Amoeba和Cobar说起. Amoeba(变形虫) ...

  3. Mycat 全局系列号

    标签:utf8 概述 本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点. 配置 文件方式获取 1.修改server配置文件 vim server. ...

  4. MyCAT全局序列号

    在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式. 本地文件方式 原理:此方式MyCA ...

  5. mycat表拆分操作教程

    1,迁移数据 举例说明,比如一个博客数据库数据表如下: 这里水平拆分,垂直拆分,只是做个简单的实验,真正的线上业务要根据情况,数据进行拆分. ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  6. mycat实例(2)

    全局序列号 数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence). 1. 本地 ...

  7. mycat实例(1)

    2016二月 22 置原 MyCat - 使用篇(1) 分类:数据库分库分表(Mycat等) (1126) (1) 数据库路由中间件MyCat - 使用篇(1) 基本概念 直接介绍概念太枯燥了,还是拿 ...

  8. MyCat 主键ID自增长配置

    在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式,实现方式主要有三种:本地文件方式.数 ...

  9. Mycat中的核心概念

      Mycat中的核心概念     Mycat中的核心概念 1.数据库中间件    Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...

随机推荐

  1. poj 3468 线段树模板题

    #include<iostream> #include<algorithm> #include<stdio.h> using namespace std; #def ...

  2. ajax02-XMLHttpRequest 对象的使用

    XMLHttpRequest 是 AJAX 的基础,用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. XMLHttpRequest 对象 所有现代浏览器均 ...

  3. QT 文本html显示格式的问题,如在QTextBrowser.setText用tr(),其中为html格式

    QObject::tr("<h1><font color = green>%1</font>的人品指数:<font color = orange&g ...

  4. IntelliJ Idea 免费激活方法免激活码

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...

  5. MVP实战心得—封装Retrofit2.0+RxAndroid+RxBus

    响应式编程框架,rxjava的扩展,很爽的链式编程 魅力在于对数据的处理,与线程切换的灵活性. 用来处理异步操作(Lambda表达式不会用.用Lambda表达式代码会更少,但不会的人会看不懂代码.不是 ...

  6. Unity 3D 离线协议

    在联网状态下,获得离线协议,然后导入到Untiy的协议管理器里. 以后在断网的情况下,也能离线使用Unity. 步骤: 1.生成 Request 文件.(Unity_v5.3.1f1.alf) 1) ...

  7. MRC与ARC混合编程的编译器标记

    如果是MRC项目创建ARC源文件,给这个源文件加上 -fobjc-arc 的编译器标记, 如果是ARC项目创建MRC源文件,给这个源文件加上 -fno-objc-arc 的编译器标记. 步骤: 1. ...

  8. CentOS7 常用命名整理

    前言: 总是为了一点命令去查搜索引擎,今天简单整理了一下常用的一些命名: 一.网络配置相关 0.修改 IP&DNS 信息 # vi /etc/sysconfig/network-scripts ...

  9. mysql 视图、触发器、事物、存储过程、函数

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  10. nyoj-451-光棍节的快乐(错排公式)

     题目链接 /* Name:nyoj-451-光棍节的快乐 Copyright: Author: Date: 2018/4/25 16:44:47 Description:D(n)=(n-1)*(D( ...