1. 程式人生 > >Mycat分庫路由規則

Mycat分庫路由規則

mycat分庫路由規則

一、auto-sharding-long:

1、路由規則:

<tableRule name="auto-sharding-long-userid">

<rule>

<columns>userid</columns>

<algorithm>rang-long-userid</algorithm>

</rule>

</tableRule>

<function name="rang-long-userid"

class="io.mycat.route.function.AutoPartitionByLong">

<property name="mapFile">autopartition-long-userid.txt</property>

</function>

[root@host01 conf]# more autopartition-long-userid.txt

# range start-end ,data node index

# K=1000,M=10000.

0-1000=0

1001-2000=1

2001-3000=2

3001-4000=3

4001-5000=4

5001-6000=5

2、例子:

CREATE TABLE tb_user_detail_t (

userid bigint not null primary key,

name varchar(64) DEFAULT NULL,

createtime datetime DEFAULT CURRENT_TIMESTAMP,

moditytime datetime DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

寫入數據

insert into tb_user_detail_t(userid,name) values(999,'name999');

insert into tb_user_detail_t(userid,name) values(1999,'name999');

insert into tb_user_detail_t(userid,name) values(2999,'name999');

insert into tb_user_detail_t(userid,name) values(3999,'name999');

insert into tb_user_detail_t(userid,name) values(4999,'name999');

insert into tb_user_detail_t(userid,name) values(5999,'name999');

、sharding-by-date:

1、路由規則:

<tableRule name="sharding-by-date-test">

<rule>

<columns>createtime</columns>

<algorithm> partbydate </algorithm>

</rule>

</tableRule>

<function name=" partbydate" class="io.mycat.route.function.PartitionByDate">

<property name="dateFormat"> yyyy-MM-dd HH:mm:ss </property>

<property name="sBeginDate">2016-01-01 00:00:00</property>

<property name="sPartionDay">2</property>

</function>

分片日期從2016-01-01開始,每2天一個分片。

2、例子:

CREATE TABLE `tb_user_partbydate` (

`id` varchar(32) NOT NULL,

`name` varchar(64) DEFAULT NULL,

`createtime` varchar(10)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into tb_user_partbydate (id,name,createtime) values('a0001','name1','2016-01-01 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0002','name1','2016-01-02 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0003','name1','2016-01-03 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0004','name1','2016-01-04 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0005','name1','2016-01-05 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0006','name1','2016-01-06 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0007','name1','2016-01-07 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0005','name1','2016-01-08 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0006','name1','2016-01-09 00:01:00');
insert into tb_user_partbydate (id,name,createtime) values('a0007','name1','2016-01-10 00:01:00');

、sharding-by-month:

1、路由規則:

<tableRule name="sharding-by-month">

<rule>

<columns>createtime</columns>

<algorithm>partbymonth</algorithm>

</rule>

</tableRule>

<function name="partbymonth"

class="io.mycat.route.function.PartitionByMonth">

<property name="dateFormat">yyyy-MM-dd HH:mm:ss</property>

<property name="sBeginDate">2015-01-01 00:00:00</property>

</function>

dateFormat為日期格式,sBeginDate為開始日期。

2、例子:

CREATE TABLE ` tb_partbymonth ` (

`id` varchar(32) NOT NULL,

`name` varchar(64) DEFAULT NULL,

`createtime` datetime DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

寫入數據(註意這裏不能使用now函數)

insert into tb_partbymonth(id,name,createtime) values('a0001','name1','2015-01-01 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0002','name1','2015-02-02 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0003','name1','2015-03-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0004','name1','2015-04-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0005','name1','2015-05-01 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0006','name1','2015-06-02 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0007','name1','2015-07-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0008','name1','2015-08-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0009','name1','2015-09-01 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0010','name1','2015-10-02 10:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0011','name1','2015-11-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0012','name1','2015-12-01 00:00:00');

insert into tb_partbymonth(id,name,createtime) values('a0013','name1','2016-01-01 00:00:00');

、sharding-by-intfile(枚舉):

1、路由規則:

<tableRule name="sharding-by-intfile-provcode">

<rule>

<columns>provcode</columns>

<algorithm>hash-int-provcode</algorithm>

</rule>

</tableRule>

<function name="hash-int-provcode"

class="io.mycat.route.function.PartitionByFileMap">

<property name="mapFile">partition-hash-int-provcode.txt</property>

<property name="type">0</property>

</function>

type=0 代表整形

type=1 代表字符串類型

[root@host01 conf]# more partition-hash-int-provcode.txt

1=0

2=1

3=2

4=3

5=4

6=5

7=0

8=1

9=2

10=3

11=4

12=5

DEFAULT_NODE=0 ##找不到省份匹配的情況下,默認放到數據庫1

這裏是6個庫,序號0-5,將不同的省份映射到對應的庫。所有的省份和庫哦對應關系都要枚舉出來。

2、例子:

CREATE TABLE `tb_user_t` (

id bigint auto_increment not null primary key,

`name` varchar(64) DEFAULT NULL,

provcode int ,

`createtime` datetime DEFAULT CURRENT_TIMESTAMP,

`moditytime` datetime DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

發現分庫情況下定義自動增長的id不管用,因為每個庫都有自己的自增長id,通過mycat查詢的話會有重復的id.

如下:

mysql> select * from tb_user_t order by id;

+----+----------+----------+---------------------+---------------------+

| id | name | provcode | createtime | moditytime |

+----+----------+----------+---------------------+---------------------+

| 1 | name0005 | 5 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

| 1 | name0001 | 1 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

| 1 | name0004 | 4 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

| 1 | name0002 | 2 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

| 1 | name0003 | 3 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

| 1 | name0006 | 6 | 2017-08-09 10:54:44 | 2017-08-09 10:54:44 |

| 2 | name0011 | 11 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

| 2 | name0007 | 7 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

| 2 | name0010 | 10 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

| 2 | name0008 | 8 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

| 2 | name0009 | 9 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

| 2 | name0012 | 12 | 2017-08-09 10:54:53 | 2017-08-09 10:54:53 |

| 3 | name0013 | 13 | 2017-08-09 11:12:17 | 2017-08-09 11:12:17 |

+----+----------+----------+---------------------+---------------------+

、sharding-by-murmur:

murmur算法是將字段進行hash後分發到不同的數據庫,字段類型支持int和varchar.

1、路由規則:

<tableRule name="sharding-by-murmur-userid">

<rule>

<columns>userid</columns>

<algorithm>murmur</algorithm>

</rule>

</tableRule>

<function name="murmur"

class="io.mycat.route.function.PartitionByMurmurHash">

<property name="seed">0</property><!-- 默認是0 -->

<property name="count">6</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->

<property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射為這麽多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 -->

<!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件

的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替 -->

<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>

用於測試時觀察各物理節點與虛擬節點的分布情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映

射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西 -->

</function>

2、例子:

CREATE TABLE `tb_user_murmur_string_t` (

`userid` varchar(32) NOT NULL,

`name` varchar(64) DEFAULT NULL,

`createtime` datetime DEFAULT CURRENT_TIMESTAMP,

`moditytime` datetime DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`userid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

寫入數據

insert into tb_user_murmur_string_t(userid,name) values('user002','name002');

insert into tb_user_murmur_string_t(userid,name) values('user003','name003');

insert into tb_user_murmur_string_t(userid,name) values('user004','name004');

insert into tb_user_murmur_string_t(userid,name) values('user005','name005');

insert into tb_user_murmur_string_t(userid,name) values('user006','name006');

insert into tb_user_murmur_string_t(userid,name) values('user007','name007');

insert into tb_user_murmur_string_t(userid,name) values('user008','name008');

insert into tb_user_murmur_string_t(userid,name) values('user009','name009');

insert into tb_user_murmur_string_t(userid,name) values('user010','name010');

、crc32slot:

crs32算法,分庫字段類型支撐int和varchar.

1、路由規則:

<tableRule name="crc32slot">

<rule>

<columns>id</columns>

<algorithm>crc32slot</algorithm>

</rule>

</tableRule>

<function name="crc32slot"

class="io.mycat.route.function.PartitionByCRC32PreSlot">

<property name="count">6</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->

</function>

count=6指定需要分庫的個數.

2、例子:

CREATE TABLE `tb_user_crc32slot_t` (

`id` varchar(32) NOT NULL,

`name` varchar(64) DEFAULT NULL,

`createtime` datetime DEFAULT CURRENT_TIMESTAMP,

`moditytime` datetime DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

寫入數據:

insert into tb_user_crc32slot_t(id,name) values('a0002','name1');

insert into tb_user_crc32slot_t(id,name) values('a0003','name1');

insert into tb_user_crc32slot_t(id,name) values('a0004','name1');

insert into tb_user_crc32slot_t(id,name) values('a0005','name1');

insert into tb_user_crc32slot_t(id,name) values('a0006','name1');

insert into tb_user_crc32slot_t(id,name) values('a0007','name1');

insert into tb_user_crc32slot_t(id,name) values('a0008','name1');

insert into tb_user_crc32slot_t(id,name) values('a0009','name1');

insert into tb_user_crc32slot_t(id,name) values('a0010','name1');

insert into tb_user_crc32slot_t(id,name) values('a0011','name1');

insert into tb_user_crc32slot_t(id,name) values('a0012','name1');

insert into tb_user_crc32slot_t(id,name) values('a0013','name1');

insert into tb_user_crc32slot_t(id,name) values('a0014','name1');

insert into tb_user_crc32slot_t(id,name) values('a0015','name1');


Mycat分庫路由規則