本文目录
本文导读
MyCat 的分片规则配置在conf目录下的 rule.xml 文件中定义,学习本文,首先需要复习上一篇:MyCAT三大配置文件详解 的重点知识。
MyCat 拆分策略包含垂直拆分和水平拆分,作垂直拆分时,一般做垂直分库;水平拆分,一般情况下只会进行水平拆分表。垂直分表和水平分库很复杂一般也不会在生产环境中使用,本文仅做了解和基于面试做配置和原理解析。
一、MyCat分库分表拆分策略——垂直分库
垂直分库就是,在数据库中每个表对应于不同的业务,根据业务垂直切分对表进行分类,并将其分发到不同的数据库,从而分担不同数据库的压力。此时需要在多个MySQL服务器中创建数据库,要实现以上功能就需要在 MyCat 的 schema.xml 文件中进行配置。
简单来说,一个电商部门有很多业务场景,例如秒杀、营销、商品、库存、B端管理、订单、交易、配送、售后、结算等等,垂直分库就是不同的业务模块小组单独使用一个库。
仅针对 schema.xml配置文件的核心配置,有关dataHost中的配置和mycat环境的部署,请参阅上一篇
-
<!-- 逻辑库 -->
-
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
-
<!-- 逻辑表的名字, 逻辑表下的节点,逻辑表数据存入节点的规则 -->
-
<table name="TB_ORDER" dataNode="dn1" rule="auto-sharding-long"/>
-
<table name="TB_GOODS" dataNode="dn2" rule="auto-sharding-long"/>
-
<table name="TB_delivery" dataNode="dn3" rule="auto-sharding-long"/>
-
</schema>
-
-
<!-- 节点名称,节点关联的物理主机位置,关联数据库名称 -->
-
<dataNode name="dn1" dataHost="dhost1" database="db01"/>
-
<dataNode name="dn2" dataHost="dhost2" database="db01"/>
-
<dataNode name="dn3" dataHost="dhost3" database="db01"/>
二、MyCat分库分表拆分策略——水平分表分片规则
如果一个表有多条数据,此时单表具有性能上线,水平拆分的目的是根据一定的路由规则将数据分配给不同的数据库和表,提高数据库性能。
1、水平分表的分片规则
在mycat中,主要提供了9中不同的分片规则,他们分别是:按照范围分片、取模分片、一致性hash分片、枚举分片、应用指定算法分片、固定hash算法分片、字符hash解析分片、按天分片、按自然月份分片。
2、分片规则详细说明及配置
2.1、按照范围分片
mycat的默认分片规则:根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。
-
<!-- schema.xml文件 rule="auto-sharding-long" 可以看出分片规则是auto-sharding-long -->
-
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
-
<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
-
</schema>
-
-
<!-- rule.xml文件,可以看出是 根据 id 的值进行分片,具体的分片算法是 rang-long -->
-
<tableRule name="auto-sharding-long">
-
<rule>
-
<columns>id
</columns>
-
<algorithm>rang-long
</algorithm>
-
</rule>
-
</tableRule>
-
-
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
-
<property name="mapFile">autopartition-long.txt
</property>
-
</function>
2.2、取模分片
根据指定的字段及其配置范围以及数据节点的相应情况,确定数据属于哪个分区。
-
<!-- schema.xml文件 -->
-
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
-
<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="mod-long" />
-
</schema>
-
-
<!-- rule.xml文件,可以看出是 id为指定的字段,具体的分片算法是 mod-long -->
-
<tableRule name="mod-long">
-
<rule>
-
<columns>id
</columns>
-
<algorithm>mod-long
</algorithm>
-
</rule>
-
</tableRule>
-
-
<!-- 有多少个主机节点,count的值就应该为多少 count = "3" 就是根据指定的字段对 3 进行取模 -->
-
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
-
<property name="count">3
</property>
-
</function>
2.3、一致性hash分片
假如表的id值是一个uuid,这样就不能够范围查询或者取模运算了,这样子就可以使用一致性hash分片效果会比较好,根据id的一致性hash值来确定将数据分配到哪一个数据节点。
所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。
-
<!-- schema.xml文件 -->
-
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
-
<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur"/>
-
</schema>
-
-
<!-- rule.xml文件,可以看出是 id为指定的字段,分片算法为 murmur -->
-
<tableRule name="sharding-by-murmur">
-
<rule>
-
<columns>id
</columns>
-
<algorithm>murmur
</algorithm>
-
</rule>
-
</tableRule>
-
-
<!-- function中一般一需要修改一个配置 count 的值,有多少个数据节点就设置成多少,其他的使用默认值即可 -->
-
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">
-
<property name="seed">0
</property>
<!-- 默认是0 -->
-
<property name="count">3
</property>
<!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
-
<property name="virtualBucketTimes">160
</property>
<!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
-
</function>
2.4、枚举分片
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
-
<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="sharding-by-enumstatus" />
-
-
<rule>
-
<columns>status
</columns>
-
<algorithm>hash-int
</algorithm>
-
</rule>
总结
MyCat 的分片规则配置在conf目录下的 rule.xml 文件中定义,学习本文,首先需要复习上一篇:MyCAT三大配置文件详解 的重点知识。
MyCat 拆分策略包含垂直拆分和水平拆分,作垂直拆分时,一般做垂直分库;水平拆分,一般情况下只会进行水平拆分表。垂直分表和水平分库很复杂一般也不会在生产环境中使用,本文仅做了解和基于面试做配置和原理解析。
<div class="blog_extension_card_cont">
<span class="text">技术交流 | 粉丝福利 | 面试辅导</span>
<div class="blog_extension_card_cont_r">
<img class="weixin" src="https://g.csdnimg.cn/extension-box/1.1.6/image/weixin.png" alt="">
<span>微信名片</span>
</div>
</div>
<img class="blog_extension_card_right" src="https://g.csdnimg.cn/extension-box/1.1.6/image/ic_move.png" alt="">
</div></div></div>
</article>