《MyCat分库分表策略详解》

《MyCat分库分表策略详解》

 

在我们的项目发展到一定阶段之后,随着数据量的增大,分库分表就变成了一件非常自然的事情。常见的分库分表方式有两种:客户端模式和服务器模式,这两种的典型代表有sharding-jdbc和MyCat。所谓的客户端模式是指在各个连接数据库的客户端中引用额外提供的jar包,以对连接数据库的过程进行封装,从而达到根据客户端的配置,将不同的请求分发到不同的数据库中的目的;而服务端模式是指,搭建一个数据库服务,这个服务只是架设在真实数据库集群前的一个代理层,其能够正常接收和解析客户端传入的SQL语句,然后根据其配置,将该SQL语句解析之后发送到各个真实的服务器执行,最终由代理层收集执行的结果并将该结果返回。服务器模式下,客户端所连接的服务完全就像是一个数据库服务,这种方式对于客户端的侵入性是非常小的。

作为服务端模式的典型代表,MyCat不仅提供了丰富的分库分表策略,也提供了非常灵活的读写分离策略,并且其对客户端的侵入性是非常小的。本文主要讲解MyCat主要提供的分库分表策略,并且还会讲解MyCat如果自定义分库分表策略。

1. 配置格式介绍

在讲解MyCat分库分表策略之前,我们首先介绍一下其配置文件的格式。在MyCat中,配置文件主要有两个:schema.xml和rule.xml。顾名思义,这两个配置文件分别指定了MyCat所代理的数据库集群的配置和分库分表的相关策略。schema.xml中的典型配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 <!-- 指定了对外所展示的数据库名称,也就是说,客户端连接MyCat数据库时,制定的database为mydb
 而当前数据库中的表的配置就是根据下面的配置而来的 -->
 <schema name="mydb" checkSQLschema="true" sqlMaxLimit="100">
 <!-- 定义了一个t_goods表,该表的主键是id,该字段是自增长的,并且该表的数据会被分配到dn1,dn2和
 dn3上,这三个指的是当前MyCat数据库所代理的真实数据库的节点名,每个节点的具体配置在下面的
 配置中。这里rule属性指定了t_goods表中的数据分配到dn1,dn2和dn3上的策略,mod-long指的是
 按照长整型取余的方式分配,也就是按照id对节点数目进行取余 -->
 <table name="t_goods" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" 
 rule="mod-long"/>
 </schema>
 <!-- 分别指定了dn1,dn2和dn3三个节点与对应的数据库的关系,dataHost对应的就是下面的数据库节点配置 -->
 <dataNode name="dn1" dataHost="dhost1" database="db1"/>
 <dataNode name="dn2" dataHost="dhost2" database="db2"/>
 <dataNode name="dn3" dataHost="dhost3" database="db3"/>
 <!-- 这里分别指定了各个数据库节点的配置 -->
 <dataHost name="dhost1" maxCon="1000" minCon="10" balance="0" writeType="0" 
 dbType="mysql" dbDriver="native">
 <heartbeat>select user()</heartbeat>
 <writeHost host="hostM1" url="localhost:3306" user="root" password="password"/>
 </dataHost>
 <dataHost name="dhost2" maxCon="1000" minCon="10" balance="0" writeType="0" 
 dbType="mysql" dbDriver="native">
 <heartbeat>select user()</heartbeat>
 <writeHost host="hostM2" url="localhost:3306" user="root" password="password"/>
 </dataHost>
 <dataHost name="dhost3" maxCon="1000" minCon="10" balance="0" writeType="0" 
 dbType="mysql" dbDriver="native">
 <heartbeat>select user()</heartbeat>
 <writeHost host="hostM3" url="localhost:3306" user="root" password="password"/>
 </dataHost>
</mycat:schema>

可以看到,schema.xml指定的是各个数据库节点与MyCat中虚拟数据库和表的关联关系,并且指定了当前表的分表策略,比如这里的mod-long。在rule.xml中则指定了具体的分表策略及其所使用的算法实现类,如下是一个典型的rule.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
 <!-- 这里的mod-long对应的就是上面schema.xml的表配置中rule属性所使用的规则名称,其columns节点
 指定了当前规则所对应的字段名,也就是id,algorithm节点则指定了当前规则所使用的算法,具体的
 算法对应于下面的function节点所指定的实现类-->
	<tableRule name="mod-long">
		<rule>
			<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值