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