(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可以看到數據分片效果

 

 

 

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