Mycat分库分表 - 极悦
Mycat教程
Mycat读写分离
Mycat分库分表
Mycat全局序列号

Mycat分库分表

库分表是一个词,最好不要拆分去理解,它指的是对数据的拆分;

分库分表分为两种:水平拆分和垂直拆分;

一种是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库服务器上面,这种切分称之为数据的水平切分,也可以称为横向切分;

水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。

一种是按照不同的表来切分到不同的数据库服务器之上,这种切可以称之为数据的垂直切分,也可以称为纵向切分;

垂直切分一般是按照业务维度进行数据库表的切分;把相同类型的表放在一个数据库,另一些表放在另一个数据库;也就是在不同库建不同表,把表分散到各个数据库;

Mycat 通过数据切分解决传统数据库的缺陷,又有了NoSQL易于扩展的优点。通过中间代理层规避了多数据源的处理问题,对应用完全透明,同时对数据切分后存在的问题,也做了解决方案。

Mycat分库分表(水平)

1、配置server.xml

指定主键生成策略

<!--配置数据库的主键怎么生成,0为本地文件方式,1为数据库方式,2为时间戳序列方式-->
<property name="sequnceHandlerType">0</property>

2、配置schema.xml

指定逻辑库,分片结点,结点主机等

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100">
    <!-- 要实现分库分表,那么就需要在<schema>标签下配置表了,现在是水平切分,表示要对哪张表进行切分 -->
    <table name="orders" primaryKey="id" autoIncrement="true"                                   dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>

<!--配置真实的数据库名称 test -->
<dataNode name="dn1" dataHost="localhost1" database="test01" />
<dataNode name="dn2" dataHost="localhost1" database="test02" />
<dataNode name="dn3" dataHost="localhost1" database="test03" />

<dataHost name="localhost1"
          maxCon="1000"
          minCon="10"
          balance="1"
          writeType="0"
          dbType="mysql"
          dbDriver="native"
          switchType="1"
          slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM3307" url="localhost:3307" user="root" password="123456">
        <readHost host="hostS3308" url="localhost:3308" user="root" password="123456" />
        <readHost host="hostS3309" url="localhost:3309" user="root" password="123456" />
    </writeHost>
    <writeHost host="hostM3308" url="localhost:3308" user="root" password="123456">
        <readHost host="hostS3307" url="localhost:3307" user="root" password="123456" />
        <readHost host="hostS3310" url="localhost:3310" user="root" password="123456" />
    </writeHost>
</dataHost>
</mycat:schema>

3、配置rule.xml

指定分片结点数

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    <!-- how many data nodes -->
    <property name="count">3</property>
</function>

4、水平切分测试

 ● 通过Navicat在3307上创建三个库test01,test02和test03,并在每个库中创建orders表。

不管是何种方式的切分,主键生成必须交给MyCat实现。

● 插入数据验证

next value for MYCATSEQ_GLOBAL:Mycat主键生成的方式。

insert into orders (id,money) values (next value for MYCATSEQ_GLOBAL,90.1);

insert into orders (id,money) values (next value for MYCATSEQ_GLOBAL,90.2);

insert into orders (id,money) values (next value for MYCATSEQ_GLOBAL,90.3);

insert into orders (id,money) values (next value for MYCATSEQ_GLOBAL,90.4);

分别插入到不同的数据库的orders表中。

● 查询测试

查询操作,会将所有库中的orders数据查询出来。

Mycat分库分表(垂直)

1、配置server.xml

指定主键生成策略

<!--配置数据库的主键怎么生成,0为本地文件方式,1为数据库方式,2为时间戳序列方式-->
<property name="sequnceHandlerType">0</property>

2、配置schema.xml

也同样需要配置table标签,水平切分是要对哪张表进行切分就配置那张表;垂直切分需要将数据库中的所有表都配置上,指定不同的datanode。
需求:整个P2P平台的数据库(p2p)进行垂直切分,分为前台数据库(p2p-web)、后台数据库(p2p-admin)。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100">

    <!-- 要实现分库分表,那么就需要在<schema>标签下配置表了,现在是垂直切分 -->

    <!--需求:整个P2P平台的数据库(p2p)进行垂直切分,分为前台数据库(p2p-web)、后台数据库(p2p-admin)-->

    <!--P2P前台数据库-->
    <table name="orders" primaryKey="id" autoIncrement="true" dataNode="dn1"/>
    <table name="users" primaryKey="id" autoIncrement="true" dataNode="dn1"/>

    <!--P2P后台数据库-->
    <table name="products" primaryKey="id" autoIncrement="true" dataNode="dn2"/>
    <table name="creditor" primaryKey="id" autoIncrement="true" dataNode="dn2"/>
</schema>

<!--配置真实的数据库名称 testdb01 -->
<dataNode name="dn1" dataHost="localhost1" database="p2p-web" />
<dataNode name="dn2" dataHost="localhost1" database="p2p-admin" />

<dataHost name="localhost1"
          maxCon="1000"
          minCon="10"
          balance="1"
          writeType="0"
          dbType="mysql"
          dbDriver="native"
          switchType="1"
          slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM3307" url="localhost:3307" user="root" password="123456">
        <readHost host="hostS3308" url="localhost:3308" user="root" password="123456" />
        <readHost host="hostS3309" url="localhost:3309" user="root" password="123456" />
    </writeHost>
    <writeHost host="hostM3308" url="localhost:3308" user="root" password="123456">
        <readHost host="hostS3307" url="localhost:3307" user="root" password="123456" />
        <readHost host="hostS3310" url="localhost:3310" user="root" password="123456" />
    </writeHost>
</dataHost>

</mycat:schema>

3、垂直切分测试

● 在3307上创建两个个数据库p2p-web,p2p-admin

● 在p2p-web库中创建users和orders表

● 在p2p-admin库中创建products和news表

● 插入、查询测试

next value for MYCATSEQ_GLOBAL

4、注意

垂直切分带来的价值:可以屏蔽掉多数据源的问题,只需要一个统一入口mycat就可以操作下面的多个数据库。

不管是何种方式的切分,主键生成必须交给MyCat实现。

全部教程