Mycat超详细最常用的水平分表规则

  • Mycat水平分表ER表
<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 规则表示对分片字段进行取模运算
  • Mycat水平分表全局表

①全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性。
②全局表的查询操作,只从一个节点获取。
③全局表可以跟任何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 会再向数据库要一次。
# 在dnl 上创建全局序列表。
CREATE TABLE MYCAT_SEQUENCE (NAME VARCHAR(50)NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 100, PRIMARY KEY(NAME))ENGINE=INNODB;
# 创建函数 该部分内容过多请自行去官网摘取
获取当前sequence的值(返回当前值,增量):
DROP FUNCTION IF EXISTS mycat_seq_currval;
    DELIMITER $
    CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
    DETERMINISTIC
    BEGIN
    DECLARE retval VARCHAR(64);
    SET retval="-999999999,null";
    SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
    RETURN retval;
    END $
    DELIMITER ;

设置sequence值:
DROP FUNCTION IF EXISTS mycat_seq_setval;
DELIMITER $
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS     varchar(64) CHARSET utf8
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = value
    WHERE name = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $
    DELIMITER ;

获取下一个sequence值:
 DROP FUNCTION IF EXISTS mycat_seq_nextval;
    DELIMITER $
    CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64)     CHARSET utf8
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = current_value + increment WHERE name = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $
    DELIMITER ;

# 向MYCAT_SEQUENCE表中插入数据  注意:表面是大写且只能是MYCAT_SEQUENCE
INSERT INTO MYCAT_SEQUENCE(NAME,current_ value,increment) VALUES("ORDERS",400000,100);

# 修改sequence_db_conf.properties .vim sequence_db_conf.properties
# 意思是ORDERS这个序列在dnl这个节点上,具体dn1节点是哪台机子,请参考schema.xml

<property name="sequnceHandlerType">1</property>
#全局序列类型:0-本地文件,1-数据库方式,2-时间戳方式。此处应该修改成1。

# 插入数据   'MYCATSEQ_'+MYCAT_SEQUENCE.NAME
insert into table1(id,name) values(next value for MYCATSEQ_ORDERS,'test');
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值