mycat水平切分(分库分表)规则配置rule.xml

10 篇文章 0 订阅
4 篇文章 0 订阅

rule.xml的tableRule标签配置表的分片规则

<tableRule name="hash-mode-5_id">
	<rule>
		<columns>id</columns>
		<algorithm>hash-mode-5</algorithm>
	</rule>
</tableRule>

name指定分片规则名字,唯一性;
columns指定用于分片的mysql实体表的字段,
algorithm指定使用的分片算法,取自标签定义的函数,函数的实现是编写在java代码中的

rule.xml的function标签配置表的分片算法

<function name="hash-mod-5" class="io.mycat.route.function.PartitionByHashMod" >
	<property name="count">5</property>
</function>

定义了hash-mod-5使用io.mycat.route.function.PartitionByHashMod"这个java类来实现分片算法 ,count是其参数

常用分片算法以及rule.xml中的配置

1.简单取模-PartitionByMod

适用于根据整数字段进行分片,取模的值对应分片库的序号,比如某条记录的id=100, mod 3 = 1,那这条记录就在分片db2(分片节点的序号从0开始)上

简单取模算法简单,存储均匀,但是伸缩不方便

<tableRule name="users">
	<rule>
		<columns>users_Fid</columns>
		<algorithm>mod-long</algorithm>
	</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
	<property name="count">3</property>
</function>
2.哈希取模-PartitionByHashMod

针对非整数字段,通过哈希算法得到一个整数值,然后再进行取模分片

通过哈希取模,因为哈希得到的整数值是随机的,所以数据更具分散性,但是多条记录的分片字段的值相同的时候它们哈希取模的值也相同,会被储存到同一分片,比如有100条订单记录,其中98条是用户A的,其他分别是B、C的,如果根据用户名字段进行哈希取模分片,那么A的98条记录都会集中在同一分片中,只有其它2条在别的分片中,造成数据存储不均匀

<tableRule name="users">
	<rule>
		<columns>users_Fname</columns>
		<algorithm>hash-mod</algorithm>
	</rule>
</tableRule>
<function name="hash-mod" class="io.mycat.route.function.PartitionByHashMod">
	<property name="count">3</property>
</function>
3.枚举分片-PartitionByFileMap

人为指定分片字段值对应哪个分片节点,比如:根据所在城市字段Fcity_id进行分片,直接通过mapFile配置城市id和db一一对应,所在城市的记录就存在对应的db中

<tableRule name="users">
	<rule>
		<columns>users_Fcity_id</columns>
		<algorithm>map-city</algorithm>
	</rule>
</tableRule>
<function name="map-city" class="io.mycat.route.function.PartitionByFileMap">
	<property name="mapFile">partition-map-city.txt</property>
	<property name="type">0</property>
	<property name="defaultNode">0</property>
</function>

partition-map-city.txt这个mapFile文件放在/usr/local/mycat/conf/目录下,
type属性指定枚举值类型:0表示整型,非0表示字符串型
defaultNode属性配置是否使用默认的节点:<0不使用,>=0使用(具体的节点值在mapFile中定义)

4.字符串范围取模分片-PartitionByPrefixPattern

根据指定字符串的前N个字符确定分片,比如根据订单号的前3个字符来分片存储
订单号前3位是ABC,进行模运算:mod(ASCII(A)+ASCII(B)+ASCII©,128)=70
逻辑顺序:
首先,计算ABC的ascii码值之和=65+66+67=198;
然后,根据一个自定义的基数取模,198%128=70
最后,将取模的值匹配mapFile中设置(0-63=0 64-127=1)的对应的分片DB2

<tableRule name="bill">
	<rule>
		<columns>Fbid</columns>
		<algorithm>prefixpattern-mod</algorithm>
	</rule>
</tableRule>
<function name="prefixpattern-mod" class="io.mycat.route.function.PartitionByPrefixPattern">
	<property name="patternValue">128</property>
	<property name="prefixLength">3</property>
	<property name="mapFile">prefix-partition-pattern.bill.txt</property>
</function>

patternValue属性是取模基数
prefixLength属性是取分片字段的前几个字符来运算

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分库分表是一种常见的数据库架构设计,可以提高系统的性能和可扩展性。以下是基于 MySQL 的 MyCat 如何进行分库分表配置: 1. 安装 MyCat:在官网下载 MyCat 并解压,在 conf 目录下创建两个文件夹:schema 和 rule。schema 目录用于存放分库分表配置文件,rule 目录用于存放分片规则配置文件。 2. 配置数据源:在 schema 目录下创建一个新的 XML 配置文件,配置数据源信息,包括数据库地址、端口、用户名、密码等。例如: ``` <schema name="db1" checkSQLschema="false" sqlMaxLimit="100"> <dataNode name="dn1" dataHost="localhost1" database="db1"/> <table name="t_order" primaryKey="order_id" dataNode="dn1" rule="rule1"/> </schema> ``` 其中,dataNode 表示数据节点,可以配置多个数据节点,用于分散数据存储。table 表示数据表,可以指定数据节点以及分片规则。 3. 配置分片规则:在 rule 目录下创建一个新的 XML 配置文件,配置分片规则信息。例如: ``` <rule name="rule1"> <tableRule name="t_order" ruleAlgorithm="mod-long"> <ruleColumn>order_id</ruleColumn> <ruleValue>dn${order_id % 2 + 1}</ruleValue> </tableRule> </rule> ``` 其中,ruleAlgorithm 表示分片算法,可以选择 mod、hash、range 等。ruleColumn 表示分片列,ruleValue 表示分片值。 4. 启动 MyCat:在 MyCat 的 bin 目录下执行 start.bat 或 start.sh 启动 MyCat。此时,MyCat 会读取 schema 和 rule 目录下的配置文件,并根据配置文件进行分库分表的数据路由。 需要注意的是,分库分表的设计需要根据业务场景和数据量进行合理的划分,避免出现瓶颈和单点故障。此外,分片规则的设计也需要考虑数据均衡和查询效率等因素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值