zoukankan      html  css  js  c++  java
  • 使用MYCAT轻松实现MYSQL水平分片

    完整文章下载地址:http://download.csdn.net/detail/dreamcode/9383516
    简单来说,我们能够将数据的水平切分理解为是依照数据行的切分。就是将表中的某些行切分到一个数据库,而另外的某些行切分到其它的数据库中。当中选择合适的切分规则至关重要,由于它决定了兴许数据聚合的难易程度。


    有几种典型的分片规则包含:
    (1)依照用户主键ID求模。将数据分散到不同的数据库。具有同样数据用户的数据都被分散到一个库中。
    (2)依照日期。将不同月甚至日的数据分散到不同的库中。
    (3)依照某个特定的字段求摸,或者依据特定范围段分散到不同的库中。
    一、 MYCAT经常使用分片规则
    MYCAT经常使用的分片规则例如以下,另外另一些其它分片方式这里不所有列举:
    (1)分片枚举:sharding-by-intfile
    (2)主键范围:auto-sharding-long
    (3)一致性hash:sharding-by-murmur
    (4)字符串hash解析:sharding-by-stringhash
    (5)按日期(天)分片:sharding-by-date
    (6)按单月小时拆分:sharding-by-hour
    (6)自然月分片:sharding-by-month
    二、 MYCAT分片配置说明
    下文以使用分片枚举规则和主键范围规则分片为例:
    1、分片枚举规则(sharding-by-intfile)
    (1)使用规则:/src/main/resources/schema.xml

            <table name="employee" primaryKey="ID" dataNode="dn1,dn2"
                rule="sharding-by-intfile" />
    

    (2)定义规则:/src/main/resources/rule.xml

        <tableRule name="sharding-by-intfile">
            <rule>
                <columns>sharding_id</columns>
                <algorithm>hash-int</algorithm>
            </rule>
        </tableRule>    
    
        <function name="hash-int"
            class="org.opencloudb.route.function.PartitionByFileMap">
            <property name="mapFile">partition-hash-int.txt</property>
        </function>
    

    (3)规则文件:/src/main/resources/autopartition-long.txt

    10000=0
    10010=1
    

    2、主键范围规则(auto-sharding-long)
    (1)使用规则:/src/main/resources/schema.xml

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <!-- auto sharding by id (long) -->
    <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    

    (2)定义规则:/src/main/resources/rule.xml

        <tableRule name="auto-sharding-long">
            <rule>
                <columns>id</columns>
                <algorithm>rang-long</algorithm>
            </rule>
        </tableRule>
    
        <function name="rang-long"
            class="org.opencloudb.route.function.AutoPartitionByLong">
            <property name="mapFile">autopartition-long.txt</property>
        </function>
    

    (3)规则文件:/src/main/resources/autopartition-long.txt

    # range start-end ,data node index
    # K=1000,M=10000.
    0-500M=0
    500M-1000M=1
    1000M-1500M=2
    

    三、 MYCAT分片測试
    下文以使用分片枚举规则和主键范围规则分片为例:
    1、分片枚举规则(sharding-by-intfile)
    (1)插入两条sharding_id=10000的数据。数据被插入到dn1节点
    1)语句1:explain insert into employee(id,name,sharding_id) values(1,’test1’,10000);
    这里写图片描写叙述

    2)语句2:explain insert into employee(id,name,sharding_id) values(1,’test2’,10000);
    这里写图片描写叙述

    (2)插入两条id范围在500M-1000M的数据,数据被插入到dn2节点
    1)语句1:explain insert into travelrecord (id,user_id,traveldate,fee,days) values(5000001,’zhao’,’2015-12-10’,510.5,3);
    这里写图片描写叙述

    2)语句2:explain insert into travelrecord (id,user_id,traveldate,fee,days) values(6000001,’zhao’,’2015-12-10’,510.5,3);
    这里写图片描写叙述

    四、 分片全局序列号(数据库方式)
    分库以后MySQL的自增主键就不能使用了。我们能够把SEQUENCE生成功能存储过程放到一个数据库分片中。数据插入前先查询当前的SEQUENCE,然后再运行操作。


    1、配置server.xml:
    sequnceHandlerType 配置为 1,表示使用数据库库生成 sequence

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

    2、创建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、创建 function
    (1)创建mycat_seq_currval。获取当前 sequence的值

    DROP FUNCTION
    IF EXISTS `mycat_seq_currval`;
    DELIMITER ;;
    
    CREATE DEFINER = `root`@`%` 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
    

    (2)创建mycat_seq_currval。获取下一个sequence值

    DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
    DELIMITER ;;
    
    CREATE DEFINER = `root`@`%` 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 ;
    

    (3)创建mycat_seq_currval,设置sequence 值

    DROP FUNCTION
    IF EXISTS `mycat_seq_setval`;
    DELIMITER ;;
    
    CREATE DEFINER = `root`@`%` 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 ;
    

    (4)添加权限。否则不能运行

    mysql > GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY ".";
    
    QUERY OK,
     0 rows affected (0.00 sec) mysql > FLUSH PRIVILEGES;
    
    QUERY OK,
     0 rows affected (0.00 sec)
    

    (5)插入初始值。測试function

    INSERT INTO MYCAT_SEQUENCE VALUES ('article_seq', 1, 1);

    运行下面查询測试:
    1) 查询1:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);
    这里写图片描写叙述

    2) 查询2:SELECT MYCAT_SEQ_SETVAL(‘article_seq’, 2);
    这里写图片描写叙述

    3) 查询3:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);
    这里写图片描写叙述

    4) 查询4:SELECT MYCAT_SEQ_NEXTVAL(‘article_seq’);
    这里写图片描写叙述

    5)查询5:SELECT MYCAT_SEQ_NEXTVAL(‘article_seq’);
    这里写图片描写叙述

    6)查询6:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);
    这里写图片描写叙述

  • 相关阅读:
    学习笔记10.28
    学习目标
    ajax传值修改数据
    php 4种传值方式
    01-17权限管理
    01-16作业:文件管理
    01-15文件操作
    01-12文件上传
    1-6 号 详情
    ajax登陆提示
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7260381.html
Copyright © 2011-2022 走看看