美文网首页
MyCat实现分库分表读写分离

MyCat实现分库分表读写分离

作者: 阿坤的博客 | 来源:发表于2018-11-27 12:14 被阅读17次

    本文介绍了如何使用MyCat中间件来实现分库分表、读写分离等功能。

    1.安装

    下载地址 http://mycat.io/

    下载完成解压即可。

    2.分表

    2.1.使用id的范围来分表

    1、添加访问用户和使用的逻辑数据库
    conf/server.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/">
        <user name="root">
            <property name="password">root</property>
            <property name="schemas">db</property>
        </user>
    </mycat:server>
    

    2、配置逻辑数据库的表节点、以及指定rang-long分片规则
    conf/schema.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 配置逻辑数据库 -->
        <schema name="db" checkSQLschema="false" sqlMaxLimit="100">
            <!-- 配置逻辑表,以及对应的子表和分片规则 -->
            <table name="tb" dataNode="dn1" primaryKey="id" subTables="tb$0-2" rule="rang-long" />
        </schema>
        <!-- 配置节点 -->
        <dataNode name="dn1" dataHost="dh1" database="db1" />
        <!-- 配置节点的地址 -->
        <dataHost name="dh1" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root">
                <!-- can have multi read hosts -->
                <readHost host="hostS2" url="127.0.0.1:3306" user="root" password="root" />
            </writeHost>
        </dataHost>
    </mycat:schema>
    

    这里逻辑数据库db下的逻辑表tb对应 127.0.0.1:3306 下物理数据库db1下的tb0、tb1、tb2字表,这里分表的规则为根据id使用rang-long规则来分表

    3、配置分片规则
    conf/rule.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:rule SYSTEM "rule.dtd">
    <mycat:rule xmlns:mycat="http://io.mycat/">
        <!-- 定义rang-long规则 -->
        <tableRule name="rang-long">
            <rule>
                <columns>id</columns>
                <!-- 使用rang-long方法 -->
                <algorithm>rang-long</algorithm>
            </rule>
        </tableRule>
        <!-- 定义rang-long方法 -->
        <function name="rang-long"
            class="io.mycat.route.function.AutoPartitionByLong">
            <!-- 配置id范围对应表规则 -->
            <property name="mapFile">autopartition-long.txt</property>
        </function>
    </mycat:rule>
    

    4、配置具体id对应的表范围
    conf/autopartition-rang.txt

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

    配置0-500w选择tb$0、500w-1000w选择tb$1、1000w-1500w选择tb$2

    4、测试

    CREATE TABLE `db1`.`tb0`(  
      `id` BIGINT NOT NULL,
      `name` VARCHAR(100),
      PRIMARY KEY (`id`)
    );
    

    新建 数据库db1以及数据表tb0、tb1、tb2、
    然后连接Mycat的逻辑数据库db,往逻辑表tb里插入3条数据,地址127.0.0.1:8066


    逻辑表
    INSERT INTO tb(id,NAME) VALUES(2500000,'tb0');
    INSERT INTO tb(id,NAME) VALUES(7500000,'tb1');
    INSERT INTO tb(id,NAME) VALUES(12500000,'tb2');
    SELECT * FROM tb;
    

    查看物理表里的数据


    物理表.gif

    可以看到三条数据分别进入到三个物理表,至此单库分表已经完成。

    3.分库

    3.1.根据id取模

    1、添加访问用户和使用的逻辑数据库
    conf/server.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/">
        <user name="root">
            <property name="password">root</property>
            <property name="schemas">db</property>
        </user>
    </mycat:server>
    

    2、配置逻辑数据库的表节点、以及指定mod-long分片规则
    conf/schema.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 配置逻辑数据库 -->
        <schema name="db" checkSQLschema="false" sqlMaxLimit="100">
            <!-- 配置逻辑表,以及对应的子表和分片规则 -->
            <table name="tb" dataNode="dn1,dn2" primaryKey="id" rule="mod-long" />
        </schema>
        <!-- 配置节点 -->
        <dataNode name="dn1" dataHost="dh1" database="db1" />
        <dataNode name="dn2" dataHost="dh2" database="db2" />
        <!-- 配置节点的地址 -->
        <dataHost name="dh1" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root">
                <!-- can have multi read hosts -->
                <readHost host="hostS2" url="127.0.0.1:3306" user="root" password="root" />
            </writeHost>
        </dataHost>
        <dataHost name="dh2" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root">
                <!-- can have multi read hosts -->
                <readHost host="hostS2" url="127.0.0.1:3306" user="root" password="root" />
            </writeHost>
        </dataHost>
    </mycat:schema>
    

    这里逻辑数据库db下的逻辑表tb对应 127.0.0.1:3306 下物理数据库db1下和db2里的tb表,这里分库的规则为根据id使用mod-long规则来分表

    3、配置mod-long分片规则
    conf/rule.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:rule SYSTEM "rule.dtd">
    <mycat:rule xmlns:mycat="http://io.mycat/">
        <tableRule name="mod-long">
            <rule>
                <columns>id</columns>
                <algorithm>mod-long</algorithm>
            </rule>
        </tableRule>
        <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
            <!-- how many data nodes -->
            <property name="count">2</property>
        </function>
    </mycat:rule>
    

    4.测试

    INSERT INTO tb(id,NAME) VALUES(1,'db1.tb');
    INSERT INTO tb(id,NAME) VALUES(2,'db2.tb');
    
    物理数据库

    4.读写分离

    1、添加访问用户和使用的逻辑数据库
    conf/server.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/">
        <user name="root">
            <property name="password">root</property>
            <property name="schemas">db</property>
        </user>
    </mycat:server>
    

    2、配置逻辑数据库的表节点、以及指定mod-long分片规则
    conf/schema.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 配置逻辑数据库 -->
        <schema name="db" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1,dn2">
        </schema>
        <!-- 配置节点 -->
        <dataNode name="dn1" dataHost="dh1" database="db1" />
        <!-- 配置节点的地址 -->
        <dataHost name="dh1" maxCon="1000" minCon="10" balance="3"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root">
                <!-- can have multi read hosts -->
                <readHost host="hostS2" url="127.0.0.1:3307" user="root" password="root" />
            </writeHost>
        </dataHost>
    </mycat:schema>
    

    这里逻辑数据库db对应127.0.0.1:3306 和 127.0.0.1:3307 下的db1数据库,其中3306负责写,3307负责读,3307作为3306的从库。
    这里面,有两个参数需要注意,balance和 switchType。

    其中,balance指的负载均衡类型,目前的取值有4种:

    1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
    2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
    3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
    4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

    switchType指的是切换的模式,目前的取值也有4种:

    1. switchType='-1' 表示不自动切换
    2. switchType='1' 默认值,表示自动切换
    3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
    4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。

    参考:
    MyCAT实现MySQL的读写分离

    相关文章

      网友评论

          本文标题:MyCat实现分库分表读写分离

          本文链接:https://www.haomeiwen.com/subject/mqywqqtx.html