(9)Mycat常用分片规则

1、 取模

此规则为对分片字段求摸运算。也是水平分表最常用规则。5.1 配置分表中,orders 表采用了此规

则。

2、 分片枚举

通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务

需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则。

(1).修改 Mycat 的配置文件 /usr/local/mycat/conf/schema.xml

<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table>

 

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
		<table name="customer" dataNode="dn2"></table>
		<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
			<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
		</table>
		<table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table>
		<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table>
	</schema>
	<dataNode name="dn1" dataHost="host1" database="orders" />
	<dataNode name="dn2" dataHost="host2" database="orders" />
	
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		
		<writeHost host="hostM1" url="172.16.94.131:3306" user="root"
				   password="Zan_123456">
		</writeHost>
		
	</dataHost>
	<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
       <heartbeat>select user()</heartbeat>       
	   <writeHost host="hostM2" url="172.16.94.133:3306" user="root"
				   password="Zan_123456">
		</writeHost>
	</dataHost>
</mycat:schema>

(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>

# columns:分片字段,algorithm:分片函数

# mapFile:标识配置文件名称,type:0为int型、非0为String,

#defaultNode:默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,

# 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就报错

 

(3)修改partition-hash-int.txt配置文件

110=0
120=1

 

(4).重启 Mycat,让配置生效

[root@shuidi01 bin]# ./mycat stop
Stopping Mycat-server...
Stopped Mycat-server.
[root@shuidi01 bin]# ./mycat start
Starting Mycat-server...

(5)访问Mycat创建表

#订单归属区域信息表

CREATE TABLE orders_ware_info
(
`id` INT AUTO_INCREMENT comment '编号',
`order_id` INT comment '订单编号',
`address` VARCHAR(200) comment '地址',
`areacode` VARCHAR(20) comment '区域编号',
PRIMARY KEY(id)

#(6)插入数据

INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (1,1,'beijing','110');
INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (2,2,'tianjing','120');

 

(7)查询Mycat、dn1、dn2可以看到数据分片效果

select * from orders_ware_info;

 

 

 

 

 

 

3、 范围约定

此分片适用于,提前规划好分片字段某个范围属于哪个分片。

 

(1).修改 Mycat 的配置文件 /usr/local/mycat/conf/schema.xml

<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table>
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
		<table name="customer" dataNode="dn2"></table>
		<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
			<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
		</table>
		<table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table>
		<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table>
		<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table>
	</schema>
	<dataNode name="dn1" dataHost="host1" database="orders" />
	<dataNode name="dn2" dataHost="host2" database="orders" />
	
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		
		<writeHost host="hostM1" url="172.16.94.131:3306" user="root"
				   password="Zan_123456">
		</writeHost>
		
	</dataHost>
	<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
       <heartbeat>select user()</heartbeat>       
	   <writeHost host="hostM2" url="172.16.94.133:3306" user="root"
				   password="Zan_123456">
		</writeHost>
	</dataHost>
</mycat:schema>

 

(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:默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,

# 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就

报错

(3)修改autopartition-long.txt配置文件

0-102=0
103-200=1

(4).重启 Mycat,让配置生效

[root@shuidi01 bin]# ./mycat stop
Stopping Mycat-server...
Stopped Mycat-server.
[root@shuidi01 bin]# ./mycat start
Starting Mycat-server...

(5)访问Mycat创建表

#支付信息表

CREATE TABLE payment_info
(
`id` INT AUTO_INCREMENT comment '编号',
`order_id` INT comment '订单编号',
`payment_status` INT comment '支付状态',
PRIMARY KEY(id)
);

(6)插入数据

INSERT INTO payment_info (id,order_id,payment_status) VALUES (1,101,0);
INSERT INTO payment_info (id,order_id,payment_status) VALUES (2,102,1);
INSERT INTO payment_info (id,order_id ,payment_status) VALUES (3,103,0);
INSERT INTO payment_info (id,order_id,payment_status) VALUES (4,104,1);

(7)查询Mycat、dn1、dn2可以看到数据分片效果

 

 

 

 

4、 按日期(天)分片

此规则为按天分片。设定时间格式、范围

(1).修改 Mycat 的配置文件 /usr/local/mycat/conf/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-01</property>
		<property name="sEndDate">2019-01-04</property>
		<property name="sPartionDay">2</property> 
	</function>

 

# columns:分片字段,algorithm:分片函数

#dateFormat :日期格式

#sBeginDate :开始日期

#sEndDate:结束日期,则代表数据达到了这个日期的分片后循环从开始分片插入

#sPartionDay :分区天数,即默认从开始日期算起,分隔 2 天一个分区

 

 

(3).重启 Mycat,让配置生效

[root@shuidi01 bin]# ./mycat stop
Stopping Mycat-server...
Stopped Mycat-server.
[root@shuidi01 bin]# ./mycat start
Starting Mycat-server...

 

(4)访问Mycat创建表

#用户信息表

CREATE TABLE login_info
(
`id` INT AUTO_INCREMENT comment '编号',
`user_id` INT comment '用户编号',
`login_date` date comment '登录日期',
PRIMARY KEY(id)
);

(5)插入数据

INSERT INTO login_info(id,user_id,login_date) VALUES (1,101,'2019-01-01');
INSERT INTO login_info(id,user_id,login_date) VALUES (2,102,'2019-01-02');
INSERT INTO login_info(id,user_id,login_date) VALUES (3,103,'2019-01-03');
INSERT INTO login_info(id,user_id,login_date) VALUES (4,104,'2019-01-04');
INSERT INTO login_info(id,user_id,login_date) VALUES (5,103,'2019-01-05');
INSERT INTO login_info(id,user_id,login_date) VALUES (6,104,'2019-01-06');

(6)查询Mycat、dn1、dn2可以看到数据分片效果

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章