Mycat 分片規則詳解

2021-09-26 03:01:13 字數 4825 閱讀 2038

mycat位於應用和資料庫的中間層,可以理解為資料庫的**。

不是所有的表都需要分片,資料量小並且不需要做水平切分的表稱之為非分片表;資料量大到單庫效能、容量不足以支撐,資料需要通過水平切分到不同資料庫中的表稱之為分片表。

er模型是實體關係模型,廣泛採用概念模型設計方法,基本元素是實體、關係和屬性。mycat創新性地將它引入資料切分規則中,使得有互相依賴的表能夠按照某一規則切分到相同的節點上,避免跨庫join關聯查詢。

以訂單(order)和訂單明細(order_detail)舉例,訂單明細依賴訂單表,存在主從關係。這類表適用於er分片表,子表的記錄與所關聯的父表記錄存放在同乙個資料分片上,避免跨庫josin操作,分片規則可以按照使用者id或者訂單id切分,這個看具體的業務需要。

以order與order_detail為例,在schema.xml中定義如下分片配置:order、order_detail根據order_id進行資料切分,保證相同order_id的資料分到同乙個分片上,在進行資料插入操作時,mycat會獲取order所在的分片,然後將order_detail也插入到order所在的分片。

rule.xml位於$mycat_home/conf目錄,它定義了所有拆分表的規則。在使用的時候可以靈活指定需要使用的分片演算法,或者對同乙個分片演算法使用不同的引數。可以理解為是分片演算法的定義檔案,這個演算法可以用不同的引數過載,在schema.xml中表的rule屬性可以定義所使用的具體演算法name。

partition-range-mod.txt

id

rang-mod

id

mod-long

3

通過在配置檔案中配置可能的列舉id,指定資料分布到不同物理節點上,本規則適用於按照省份或區縣來拆分資料類業務。

sharding_id

hash-int

partition-hash-int.txt00

其中的partition-hash-int.txt內容如下:

10000=0

10010=1

default_node=1

注意:

like this: can`t find datanode for sharding column:column_name val:ffffffff
id

rang-long

autopartition-long.txt

0

autopartition-long.txt的配置如下:

# range start-end, data node index

# k=100,m=10000

0-3000000=0

3000001-4000000=1

4000001-6000000=2

所有的節點配置都是從0開始的,0代表節點1,此配置非常簡單,即預先設計好某個分片的id範圍。

該演算法為先進行範圍分片,計算出分片組,組內再求模,綜合了範圍分片和求模分片的優點。分片組內使用求模可以保證組內的資料分布比較均勻,分片組之間採用範圍分片可以兼顧範圍分片的特點。事先規定好分片的數量,資料擴容時按照分片組擴容,則原有分片組的資料不需要遷移。由於分片組內的資料分布比較均勻,所以分片組內可以避免熱點資料問題。

id

rang-mod

partition-range-mod.txt

21

partition-range-mod.txt配置如下:

range start-end, data node group size

0-200m=5 //代表有5個分片節點

200m1-400m=1

400m1-600m=4

600m1-800m=4

800m1-1000m=6

類似於十進位制的求模運算,但是為二進位制的操作,取id的二進位制低十位,即id二進位制&1111111111。

此演算法的優點在於如果按照十進位製取模運算,則在連續插入110時,110會被分到1~10個分片中,增大了插入事務的控制難度。而此演算法根據二進位制則可能會分到連續的分片,降低了插入事務的控制難度。

user_id

func1

2,1256,512

取模運算與範圍約束的結合主要是為後續的資料遷移做準備,即可以自主決定取模後資料的節點分布,配置如下:

user_id

sharding-by-pattern

2562

partition-pattern.txt

partition-pattern.txt配置如下:

# id partition rage start-end, data node index

###### first host configuration

1-32=0

33-64=1

65-96=2

97-128=3

###### second host configuration

129-160=4

161-192=5

193-224=6

225-256=7

0-0=7

在mapfile配置檔案中,132即代表id%256後分布的範圍。如果在132,則在分割槽1,以此類推,如果id不是資料,則會分配在defaultnode上。

與取模範圍運算類似,該演算法支援數值、符號、字母取模,配置如下:

user_id

sharding-by-prefixpattern

2565

partition-pattern.txt

partition-pattern.txt配置如下:

# rage start-end, data node index

# ascii

8-57=0-9阿拉伯數字

# 64、65-90=@、a-z

# 97-122=a-z

###### first host configuration

1-4=0

5-8=1

9-12=2

13-16=3

###### second host configuration

17-20=4

21-24=5

25-28=6

29-32=7

0-0=7

該演算法與取模範圍演算法類似,擷取長度為prefixlength的子串,再對子串中每個字元的ascii碼進行求和得出sum,然後對sum進行求模運算(sum%patternvalue),可以計算出prefixlength長度的子串分片數。

在執行階段由應用自主決定路由到哪個分片,配置如下:

user_id

sharding-by-substring02

80

直接根據字元子串(必須是數字)計算分割槽號(由應用傳遞引數,顯式指定分割槽號)。例如user_id=05-100000002,其中user_id是從startindex=0開始的,擷取長度為兩位數字,即05,05就是獲取的分割槽,預設分配到defaultpartition。

擷取字串中的int陣列hash分片,配置如下:

user_id

sharding-by-stringhash

512 2

0:2

規則如下:

"2" -> (0,2)

"1:2" -> (1,2)

"1:" -> (1,0)

"-1:" -> (-1,0)

":-1" -> (0,-1)

":" -> (0,0)

一致性hash演算法有效解決了分布式資料的擴容問題,配置如下:

user_id

murmur

0 2

160weightmapfile

create_time

sharding-by-date

yyyy-mm-dd

2014-01-01

2014-01-02

10

單月內按照小時拆分,最小粒度為小時,一天最火可以有24個分片,最少1個分片,下個月從頭開始迴圈,每個月末需要手動清理資料。

create_time

sharding-by-hour

24

使用場景為按月份分割槽,每乙個自然月乙個分割槽,查詢條例時使用between and,配置如下:

create_time

sharding-by-month

yyyy-mm-dd

2014-01-01

其思想與範圍求模一致,由於日期取模方法會出現資料熱點問題,所以先根據日期分組,再根據時間hash使得短期內資料分布得更均勻。其優點是可以避免擴容時的資料遷移,又可以在一定程度上避免範圍分片的熱點問題,要求日期格式盡量精確,不然達不到區域性均勻的目的。

create_time

range-date-hash

2014-01-01 00:00:00

3yyyy-mm-dd hh:mm:ss

6

mycat分片規則

mycat 分片規則 mycat全域性表 如果你的業務中有些資料類似於資料字典,比如配置檔案的配置,常用業務的配置或者資料量不大很少變動的表,這些表往往不 是特別大,而且大部分的業務場景都會用到,那麼這種表適合於mycat全域性表,無須對資料進行切分,只要在所有的分片上儲存一 份資料即可,mycat...

MyCat分片規則之取模分片

除了上一章總結的列舉分片之外,mycat中還有一種比較常見的分片 取模分片規則,本節將總結如何實現取模分片。a 建立資料庫和表結構 create database testmod1 create database testmod2 use testmod1 create table user id ...

MyCat分片規則之程式指定分片

a 建立資料庫和表 b 配置server.xml 0905 testdb user testdb true c 配置schema.xml分片表 分片節點等 d 配置rule.xml分片規則 e 測試插入資料 insert into user id,name values 111,0 zhangsan...