iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mycat的使用 - 03.全局序列号
  • 244
分享到

Mycat的使用 - 03.全局序列号

2024-04-02 19:04:59 244人浏览 八月长安
摘要

02配置篇说到tb1表按照主键id进行了分片, 实际工作中还会经常按业务字段分片, 这次有tb3表, 按user_id分片, 依上文思路, 先调整下涉及到的配置文件.1. 在schema.xml中, 添加t

02配置篇说到tb1表按照主键id进行了分片, 实际工作中还会经常按业务字段分片, 这次有tb3表, 按user_id分片, 依上文思路, 先调整下涉及到的配置文件.

1. 在schema.xml中, 添加tb3表的配置.

<table name="tb3" datanode='dnTest1,dnTest2' rule="mod-long-user_id"/>


2. 在rule.xml中, 添加tb3表分片配置, 其中分片算法还是简单取摸.

<tableRule name="mod-long-user_id">

    <rule>

        <columns>user_id</columns>

        <alGorithm>mod-long</algorithm>

    </rule>

</tableRule>


连接Mycat, 创建tb3的表结构.

Mysql> create table tb3(id int auto_increment primary key, user_id int not null default 0, user_name varchar(30) not null default '');


下面插入2条数据.

mysql> insert into tb3(id, user_id, user_name) values(7, 1, 'abcd');

mysql> insert into tb3(id, user_id, user_name) values(7, 2, 'efgh');


查看发现, 虽然id字段为主键, 但在分片情况下, 其已失去了原有的唯一性约束. 原因很简单, 多个MySQL实例上唯一主键可以很自然的出现相同值.

mysql> select * from tb3;

+----+---------+-----------+

| id | user_id | user_name |

+----+---------+-----------+

|  7 |       2 | efgh      |

|  7 |       1 | abcd      |

+----+---------+-----------+



针对上述情况, Mycat中使用全局序列号(简称sequence), 来重塑主键的全局唯一性, 提供了包含本地配置和数据库配置等多种实现方式.


下面使用配置数据库的方式来获取sequence, 先了解下其原理.


在数据库中创建一张表, 存放sequence名称(name列), 当前值(current_value), 和步长(increment, 表每次读取多少个sequence).


sequence的获取, 和维护:

1). 当初次使用该sequence时, 根据传入的sequence名称, 从数据库该表中读取current_value, 和increment到Mycat中, 并将数据库中的current_value设置为原current_value值+increment值.


2). Mycat将读取到current_value值+increment值作为本次要使用的sequence值, 下次再使用时, 自动加1, 当使用increment次后, 执行步骤1)相同的操作.


3). Mycat负责维护这张表, 用到哪些sequence, 只需在该表中插入一条记录即可. 若某次读取的sequence没有用完, Mycat就停掉了, 则这次读取的sequence剩余值不会再使用.


配置方式:

1. 在server.xml中, 开启使用数据库方式生成sequence的开关.

<property name="sequnceHandlerType">1</property>


2. 调整schema.xml, 并在Mycat后端某个MySQL实例上创建mycatseq数据库(该库名随意), MYCAT_SEQUENCE表(表名要大写), 和3个函数.

2.1 于schema.xml中添加如下配置.

<dataNode name="gseq" dataHost="Rep1_3306" database="mycatseq"/>


2.2 登陆节点主机Rep1_3306创建相应的数据库和表.

mysql> create database mycatseq;

mysql> use mycatseq;

mysql> create table MYCAT_SEQUENCE(name varchar(50) not null, current_value int not null, increment int not null default 100, primary key(name));


2.3 并创建3个函数.

# mycat_seq_currval

DELIMITER //


CREATE DEFINER=`zzzz`@`192.168.4.%` FUNCTioN `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 COLLATE utf8_bin

    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 ;


# mycat_seq_nextval;

DELIMITER //


CREATE DEFINER=`zzzz`@`192.168.4.%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 COLLATE utf8_bin

    DETERMINISTIC

BEGIN

         UPDATE MYCAT_SEQUENCE

                 SET current_value = current_value + increment  WHERE name = seq_name;

         RETURN mycat_seq_currval(seq_name);


END; //


DELIMITER ;


# mycat_seq_setval;

DELIMITER //


CREATE DEFINER=`zzzz`@`192.168.4.%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET utf8 COLLATE utf8_bin

    DETERMINISTIC

BEGIN

         UPDATE MYCAT_SEQUENCE

                   SET current_value = value

                   WHERE name = seq_name;

         RETURN mycat_seq_currval(seq_name);


END; //


DELIMITER ;



至此, 使用Mycat sequence的准备工作就绪了, 谁来使用呢, 就是tb3, 怎么使用呢, 看如下步骤.

1. 要在schema.xml中对tb3的配置稍微改造下, 添加autoIncrement="true", 告诉Mycat tb3使用sequence; 添加primaryKey="id", 告诉Mycat主键字段是什么.

<table name="tb3" dataNode='dnTest1,dnTest2' rule="mod-long-user_id" primaryKey="id" autoIncrement="true"/>


2. 那Mycat如何知道去哪个节点主机获取sequence呢, 需要在一个新的配置文件sequence_db_conf.properties中标明表名(要大写)和分片节点的对应关系.

#testdb

TB3=gseq


3. 登陆节点主机Rep1_3306, 初始化tb3表的sequence.

mysql> insert into MYCAT_SEQUENCE(name, current_value, increment) values('TB3', 400, 100);


mysql> select * from MYCAT_SEQUENCE;

+------+---------------+-----------+

| name | current_value | increment |

+------+---------------+-----------+

| TB3  |           400 |       100 |

+------+---------------+-----------+


登陆Mycat, 验证sequence可以正常使用.

mysql> select next value for MYCATSEQ_TB3;

+-----+

| 500 |

+-----+

| 500 |

+-----+



此时, tb3表使用sequence的工作准备好了, 下面插入数据看看.

mysql> insert into tb3(user_name) values('igkl');

ERROR 1064 (HY000): bad insert sql (sharding column:USER_ID not provided,INSERT INTO tb3 (ID, user_name)

VALUES (501, 'igkl')

mysql> insert into tb3(id, user_id, user_name) values(9, 4, 'igkl');


由于Mycat负责主键值id的生成, SQL语句中可省去id字段不写(若像上面, 指定id为某值, 也没问题).

mysql> insert into tb3(user_id, user_name) values(59, 'mnop');


mysql> select * from tb3 where user_id = 59;

+-----+---------+-----------+

| id  | user_id | user_name |

+-----+---------+-----------+

| 502 |      59 | mnop      |

+-----+---------+-----------+


查看日志, 发现Mycat对原始SQL语句进行了改写, 添加了id字段.

03/18 20:46:36.798  DEBUG [$_NIOReactOR-1-RW] (ServerQueryHandler.java:56) -ServerConnection [id=1, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=true, schema=testdb]insert into tb3(user_id, user_name) values(59, 'mnop')

03/18 20:46:36.800  DEBUG [Thread-1] (NonBlockingSession.java:113) -ServerConnection [id=1, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=true, schema=testdb]insert into tb3(ID,user_id, user_name) values( 502,59, 'mnop'), route={

   1 -> dnTest2{insert into tb3(ID,user_id, user_name) values( 502,59, 'mnop')}

03/18 20:46:36.800  DEBUG [Thread-1] (MySQLConnection.java:459) -con need syn ,total syn cmd 2 commands SET names utf8;SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;schema change:false con:MySQLConnection [id=2, lastTime=1521377196800, user=zzzz, schema=test2, old shema=test2, borrowed=true, fromSlaveDB=false, threadId=81, charset=utf8, txIsolation=0, autocommit=true, attachment=dnTest2{insert into tb3(ID,user_id, user_name) values( 502,59, 'mnop')}, respHandler=SingleNodeHandler [node=dnTest2{insert into tb3(ID,user_id, user_name) values( 502,59, 'mnop')}, packetId=0], host=192.168.4.151, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]

03/18 20:46:36.802  DEBUG [$_NIOREACTOR-2-RW] (NonBlockingSession.java:229) -release connection MySQLConnection [id=2, lastTime=1521377196792, user=zzzz, schema=test2, old shema=test2, borrowed=true, fromSlaveDB=false, threadId=81, charset=utf8, txIsolation=3, autocommit=true, attachment=dnTest2{insert into tb3(ID,user_id, user_name) values( 502,59, 'mnop')}, respHandler=SingleNodeHandler [node=dnTest2{insert into tb3(ID,user_id, user_name) values( 502,59, 'mnop')}, packetId=1], host=192.168.4.151, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]


若感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).

Mycat的使用 - 03.全局序列号

您可能感兴趣的文档:

--结束END--

本文标题: Mycat的使用 - 03.全局序列号

本文链接: https://www.lsjlt.com/news/52549.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mycat的使用 - 03.全局序列号
    02配置篇说到tb1表按照主键id进行了分片, 实际工作中还会经常按业务字段分片, 这次有tb3表, 按user_id分片, 依上文思路, 先调整下涉及到的配置文件.1. 在schema.xml中, 添加t...
    99+
    2024-04-02
  • MyCat 中怎么实现一个全局序列号
    这期内容当中小编将会给大家带来有关MyCat 中怎么实现一个全局序列号,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 本地文件方式原理:此方式 MyCAT 将 seq...
    99+
    2024-04-02
  • 微信小程序全局文件的使用详解
    目录全局文件总结我们前边两篇介绍了账号的申请、注册,工具的安装,云服务的开通。本篇我们介绍一下基础语法。介绍的方法呢我们会结合上微搭低代码的工具一起做个对比。因为低代码工具也产生了非...
    99+
    2022-11-13
    微信小程序全局文件 小程序全局文件
  • 微信小程序怎么使用全局js
    今天小编给大家分享一下微信小程序怎么使用全局js的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。要注意的是必须要用module...
    99+
    2023-06-26
  • Oracle序列号查询使用注意事项
    Oracle序列是一种用于生成唯一数字的对象,通常用于创建主键值或者其他需要唯一标识的字段。在使用Oracle数据库时,序列号查询是一个常见的操作,但是需要注意一些事项,以确保查询的准...
    99+
    2024-03-02
    查询 oracle 序列号 sql语句
  • SQL使用ROW_NUMBER()OVER函数生成序列号
    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说ROW_NUMBER()从1开始,为每一条分组记录返回一个...
    99+
    2024-04-02
  • python全局变量的使用
    问题提出,怎么记录汉诺塔问题中盘子移动的次数? def hanu(n,a,b,c):          if n==1 :                print("move",a,"->",c)                ...
    99+
    2023-01-31
    全局变量 python
  • 使用redis如何生成自增序列号码
    目录Redis生成自增序列号码导入依赖yml 配置工具方法redis生成唯一编号redis生成自增序列号码 导入依赖 <!--redis--> <dependency> <groupId&...
    99+
    2022-11-23
    redis 自增 redis生成自增序列号 redis自增序列号
  • Java使用EasyExcel动态添加自增序号列
    目录前言 实现 思路 其它 总结 前言 本文将介绍如何通过使用EasyExcel自定义拦截器实现在最终的Excel文件中新增一列自增的序号列,最终的效果如下: 此外,本文所使用的...
    99+
    2024-04-02
  • 微信小程序中如何使用全局变量
    这篇文章主要介绍微信小程序中如何使用全局变量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!全局变量的使用每个小程序都需要在 app.js 中调用 App 方法注册小程序示例,绑定生命...
    99+
    2024-04-02
  • 不再迷茫!HTML 有序列表的使用全景图
    HTML 有序列表的基本语法 HTML 有序列表的基本语法如下: <ol> <li>Item 1</li> <li>Item 2</li> <li>It...
    99+
    2024-02-12
    HTML 有序列表 HTML 列表 数据 组织 显示
  • SQL如何使用ROW_NUMBER() OVER函数生成序列号
    这篇文章给大家介绍SQL如何使用ROW_NUMBER() OVER函数生成序列号,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ...
    99+
    2023-06-22
  • node.js 全局变量的具体使用
    全局对象 所有模块都可以调用 global:表示Node所在的全局环境,类似于浏览器中的window对象。 process:指向Node内置的process模块,允...
    99+
    2024-04-02
  • vue3.0中sass全局的使用过程
    目录vue3.0 sass全局的使用vue3.0使用sass入门 1.使用npm安装sass包2.新建scss文件3.在main.js中引入style.scss文件4.在页...
    99+
    2024-04-02
  • Golang中Json的序列化和反序列化的使用
    目录 JSON:创建格式:基本数据类型序列化:map序列化:切片序列化:反序列化为结构体:反序列化为map:反序列化为切片: JSON: JSON(JavaScr...
    99+
    2024-04-02
  • node.js 全局变量的使用方法
    这篇文章给大家分享的是有关node.js 全局变量的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。全局对象所有模块都可以调用global:表示Node所在的全局环境,类似于浏览器中的window对象。pr...
    99+
    2023-06-14
  • 如何使用Python中的序列化和反序列化
    如何使用Python中的序列化和反序列化,需要具体代码示例序列化和反序列化是在数据存储和传输过程中非常重要的概念。在Python中,我们可以使用pickle模块来实现序列化和反序列化操作。本文将详细介绍如何使用Python中的pickle模...
    99+
    2023-10-22
    Python 序列化 反序列化
  • Android应用获取设备序列号的方法
    软硬件环境 Macbook Pro MGX 72 Android studio 2.1.2 Android 5.1.1前言上一篇介绍了如何获取ethernet的MAC地址,对于厂商来讲,除了MAC号,还有一项数据也很重要,那就是机器序...
    99+
    2023-05-31
    android 设备 序列号
  • Golang中Json的序列化和反序列化怎么使用
    这篇文章主要介绍“Golang中Json的序列化和反序列化怎么使用”,在日常操作中,相信很多人在Golang中Json的序列化和反序列化怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang中Js...
    99+
    2023-06-30
  • java序列化与反序列化的使用方法汇总
    一、概念        java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象。对象...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作