库分表是一个词,最好不要拆分去理解,它指的是对数据的拆分;
分库分表分为两种:水平拆分和垂直拆分;
一种是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库服务器上面,这种切分称之为数据的水平切分,也可以称为横向切分;
水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。
一种是按照不同的表来切分到不同的数据库服务器之上,这种切可以称之为数据的垂直切分,也可以称为纵向切分;
垂直切分一般是按照业务维度进行数据库表的切分;把相同类型的表放在一个数据库,另一些表放在另一个数据库;也就是在不同库建不同表,把表分散到各个数据库;
Mycat 通过数据切分解决传统数据库的缺陷,又有了NoSQL易于扩展的优点。通过中间代理层规避了多数据源的处理问题,对应用完全透明,同时对数据切分后存在的问题,也做了解决方案。
指定主键生成策略
<!--配置数据库的主键怎么生成,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数据查询出来。
指定主键生成策略
<!--配置数据库的主键怎么生成,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
垂直切分带来的价值:可以屏蔽掉多数据源的问题,只需要一个统一入口mycat就可以操作下面的多个数据库。
不管是何种方式的切分,主键生成必须交给MyCat实现。