zoukankan      html  css  js  c++  java
  • MyCAT全局序列号-数据库方式

    1.MyCat中的全局序列号介绍

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

    2.数据库方式

    原理:在数据库中建立一张表,存放 sequence 名称(name),sequence 当前值(current_value),步长(increment int 类型每次读取多少个 sequence,假设为 K)等信息;

    获取步骤:

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

    MyCat 将读取到 current_value+increment 作为本次要使用的 sequence 值,下次使用时,自动加 1,当 使用 increment 次后,执行步骤 1)相同的操作. MyCat 负责维护这张表,用到哪些 sequence,只需要在这张表中插入一条记录即可。若某次读取的 sequence 没有用完,系统就停掉了,则这次读取的 sequence 剩余值不会再使用。

    3.配置数据库方式

    <3.1> 修改Mycat配置文件server.xml

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

    1代表使用数据库方式生成sequence

    <3.2> 修改Mycat配置文件schema.xml

    <table name="test" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long"/>
    <table name="mycat_sequence" primaryKey="name" dataNode="dn2"/>
    

    <3.3> 修改Mycat 配置文件 sequence_db_conf.properties,添加MYCAT=dn2

    #sequence stored in datanode
    GLOBAL=dn1
    COMPANY=dn1
    CUSTOMER=dn1
    ORDERS=dn1
    MYCAT=dn2
    

    <3.4> 在dn2节点的 db2 数据库中添加 MYCAT_SEQUENCE表

    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;
    

    <3.5> 在dn2节点的 db2 数据库中的 MYCAT_SEQUENCE 表插入sequence初始记录

    INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('mycat', -99, 100);
    

    代表插入了一个名为mycat的sequence,当前值为-99,步长为100。

    <3.6> 在dn2节点的 db2 数据库中创建存储过程

    (3.6.1) 获取当前sequence的值:

    DROP FUNCTION IF EXISTS mycat_seq_currval;
    DELIMITER $
    CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
    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 ;

      (3.6.2) 设置sequence值:

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

      (3.6.3) 获取下一个sequence值:

    DROP FUNCTION IF EXISTS mycat_seq_nextval;
    DELIMITER $
    CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = current_value + increment WHERE name = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $
    DELIMITER ;

    获取全局id的配置已经准备完毕。

    4.测试获取全局自增ID

    (4.1) 向dn1,dn2,dn3 中的db1,db2,db3 分别添加测试表 test

    create table test(id int,name varchar(10));
    

    (4.2) 重启mycat ,使用WorkBench链接mycat

    SELECT * FROM db2.mycat_sequence;

    这是Mycat重启之前的的 mycat_sequence初始化数据

    这室mycat 重启之后的  mycat_sequence 数据

    (4.3) 向test表中添加测试数据,多次执行以下语句,这里我执行了9次添加数据

    insert into test(id,name) values(next value for MYCATSEQ_MYCAT,(select database()));
    

    (4.4) 查询添加的数据

    SELECT * FROM test order by id asc;
    

    全局自增id生成成功,同时数据被水平切分到 3个分片上

    (4.5) 再次重启mycat,执行(4.3)步骤,添加多次数据,之后查看 mycat_sequence 数据

    发现在上次的基础上增加了100

    重启后的id重101开始计数

  • 相关阅读:
    腾讯分析系统架构解析
    GreenPlum简单性能测试与分析--续
    我的一些提高效率的设置
    Windows 上借助注册表来修改键盘按键的映射
    WPF入门——Converter、XAML和Style
    30个极大提高开发效率的Visual Studio Code插件(转)
    USB PD充电
    macOS Mojave 美化一下终端
    WPF入门(4)——资源
    使用Duilib开发Windows软件(5)——使用VLC做视频播放
  • 原文地址:https://www.cnblogs.com/heyangyi/p/9343145.html
Copyright © 2011-2022 走看看