<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" >
</table>
# childTable 表示与orders有紧密关联的表,该表的order_id外键关联了orders表的id主键,这样对两个表
# 进行join关联操作时,两表中关联的行都分布在同一服务器中
# mod_rule 规则表示对分片字段进行取模运算
①全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性。 ②全局表的查询操作,只从一个节点获取。 ③全局表可以跟任何r个表进行JOIN操作。
<table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table>
# 全局表dict_order_type 要被dn1,dn2中的数据库使用,标记该表位global
通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则。
# (1)修改schema.xml配置文件。
<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile"></table>
# (2)修改rule.xml配置文件
<tableRule name="sharding_by_intfile">
<rule>
<columns>areacode</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
.........
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">1</property>
<property name="defaultNode">0</property>
</function>
# 对areacode自己指定分片规则
# partition-hash-int.txt配置文件需要自己配置
# columns:分片字段,algorithm:分片函数。
# mapFile:标识配置文件名称,type: 0为int型、非0为String
# defaultNode:默认节点:小于О表示不设置默认节点,大于等于О表示设置默认节点
# 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就报错
# 数据节点是以0开始计数的
# partition-hash-int.txt的内容
# 110=0 表示areacode=110的行就放在dn1
# 120=1 表示areacode=120的行就放在dn2
此分片适用于,提前规划好分片字段某个范围属于哪个分片。
#(1)修改schema.xml配置文件
<table name="payment_info" dataNode="dn1.dn2" rule="auto_sharding_long" ></table>
# (2)修改rule.xml配置文件。
<tableRule name="auto_sharding_long">
<rule>
<columns>order_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>
<property name="defaultNode">0</property>
</function>
# columns:分片字段,algorithm:分片函数。# mapFile:标识配置文件名称。
# defaultNode:默认节点:小于О表示不设置默认节点,大于等于О表示设置默认节点,设置默认节点如果碰到不识别的枚举值,就让它路由到默# 认节点,如不设置不识别就报错。
# (3)修改autopartition-long.txt配置文件。
0-102=0
103-200=1
设置时间,日期划分分片
#(1)修改schema.xml配置文件·
<table name="login_info" dataNode="dn1.dn2" rule="sharding_by_date" ></table>
# (2)修改rule.xml配置文件,
<tableRule name="sharding_by_date">
<rule>
<columns>login_date</columns>
<algorithm>shardingByDate</algorithm>
</rule>
</tableRule>
................
<function name="shardingByDate"class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2019-01-O1</property>
<property name="sEndDate">2019-O1-04</property>
<property name="sPartionDay">2</property>
</function>
# columns:分片字段,algorithm:分片函数。
# dateFormat : 日期格式
# sBeginDate :开始日期。
# sEndDate:结束日期,则代表数据达到了这个日期的分片后循环从开始分片插入
# sPartionDay :分区天数,即默认从开始日期算起,分隔2天一个分区。
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,Mycat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式
1、本地文件:
此方式Mycat 将 sequence 配置到文件中,当使用到 sequence 中的配置后,Mycat会更下。classpath中的sequence_conf.properties文件中sequence当前的值。
①优点:本地加载,读取速度较快。
②缺点:抗风险能力差,Mycat所在主机安机后,无法读取本地文件。
2、时间戳方式
全局序列D= 64位二进制(42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)换算成十进制为18位数的long类型,每毫秒可以并发12位二进制的累加。
①优点:配置简单
②缺点:18位ID过长
3、数据库方式:
利用数据库一个表来进行计数累加。但是并不是每次生成序列都读写数据库,这样效率太低。Mycat 会预加载一部分号段到Mycat 的内存中,这样大部分读写序列都是在内存中完成的。·如果内存中的号段用完了Mycat 会再向数据库要一次。
|