zoukankan      html  css  js  c++  java
  • Mycat 全局系列号

    标签:utf8

    概述  

    本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点。

    配置  

    文件方式获取

    1.修改server配置文件

     vim server.xml

    <system><property name="sequnceHandlerType">0</property></system>
    注:sequnceHandlerType 配置为0表示使用本地文件读取。

    2.配置sequence_conf.properties配置文件

    3.在mycat中运行语句测试(在逻辑库中测试)

    insert into company(id,name) values(next value for MYCATSEQ_GLOBAL,'test');

    缺点:在 MyCAT 重启后,配置文件中癿 sequence 会恢复到初始值。
    优点:本地加载,读取速度较快。

    数据库方式获取

    1.修改server配置文件

     vim server.xml

    <system><property name="sequnceHandlerType">1</property></system>
    注:sequnceHandlerType 配置为1表示从数据库表中读取。

    2.配置读取的节点,就是配置全局表在哪个节点上面,我这里配置在dn1节点上面。

    vim sequence_db_conf.properties

     3.创建全局表和函数

    选择mysql物理库的dn1节点上执行下面语句,我配置的dn1即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 ;
    
    
    INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GLOBAL', 100000, 100);
    
    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 ;
    
    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 ;
    
    
    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 ;

     4.测试插入数据,也是在mycat逻辑库上执行

    insert into user(id,name) values(next value for MYCATSEQ_GLOBAL,'中文');


    优点:在 MyCAT 重启后,sequence 值不会被初始化,比如当前MYCAT_SEQUENCE的初始值是100000,当mycat的重启之后再执行插入数据后MYCAT_SEQUENCE的初始值就加100变成100100,新插入到表的值也是在加100的基础上开始递增,

    缺点:当配置了主从复制时(A主B从),一开始主从上面的MYCAT_SEQUENCE表的current_value初始值是100000;当前配置的读写分离方案是A负责写B负责读当A宕机之后B负责写A变成了读,加入现在的全局ID已经到了 100103,这个时候如果A宕机了,

    mycat应该是存在缓存current_value还是记录的是A的值,不会立马切换使用B上的current_value的值,如果这个时候mycat重启了,这个时候全局系列号就开始使用B中的current_value值由于B值也是从100100开始那么这个时候插入全局记录到B中的表中就会和之前生成的100100到100103主键冲突了。不知道这算不算是一个BUG,所以当A宕机之后需要赶紧把A重启好,这样的话就算mycat重启之后还是从A开始读,这个时候全局ID就从100200开始了。

    还有一种方法是当A宕机之后由于mycat还没有重启全局序列的ID还是缓存之前A的,这个时候把B的current_value增加100,这个时候如果切换到了A由于B的值是从100100开始不会和之前的冲突,如果这个时候A修复启动了这个时候也要把A的current_value增加200避免切换到A之后又和现在的值冲突。

    本地时间戳方式获取

    1.修改server配置文件

     vim server.xml

    <system><property name="sequnceHandlerType">2</property></system>
    注:sequnceHandlerType 配置为2表示时间戳方式。

    2.测试插入数据,也是在mycat逻辑库上执行,注意时间戳的长度有18位,保证表的字段长度足够

    insert into user(id,name) values(next value for MYCATSEQ_GLOBAL,'中文');

    优点:不存在上面两种方案因为mycat的重启导致id重复的现象

    缺点:数据类型太长

    总结

     三种方式各有优缺点,根据自己的需求选择。

    备注:

        作者:pursuer.chen

        博客:http://www.cnblogs.com/chenmh

    本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

    《欢迎交流讨论》

  • 相关阅读:
    介绍Asta4D
    Mac下terminal的常用命令
    Mac下的终端(Terminal)简介
    SCA简介及配置示例
    抽象
    自助式微软BI工具PowerPivot简介!
    C编译: 使用gdb调试
    operamasksui2.0 +MVC4.0+EF5.0实战 当EntityFramework遇上Json,引爆 循环引用 这颗雷
    ASP.NET MVC分部类的使用
    GWT入门教程
  • 原文地址:https://www.cnblogs.com/chenmh/p/5142943.html
Copyright © 2011-2022 走看看