mycat水平分库
一般來說,水平切分并不要對所有表進(jìn)行
(只有業(yè)務(wù)原因,不能進(jìn)行歷史歸檔的表才需要考慮是否水平切分)
(訂單經(jīng)常要按用戶來查,此處選customer_id作為分片鍵)
node1修改schema.xml配置:
(并沒有增加主機(jī),所以不需要增加dataHost。需要增加dataNode)
node1配置rule.xml來水平切分:
(order_master是在schema.xml中定義的。partitionByMod:取模的方式)
重啟mycat,并查看是否重啟成功:
插入模擬數(shù)據(jù)后在node2查看:
然而,通過mycat查詢邏輯庫數(shù)據(jù),會發(fā)現(xiàn)order_id有重復(fù),不是有序自增的:
所以要全局自增:
可以在一個統(tǒng)一的地方生成order_id,可以是redis等,這里用的是mycat提供的功能:
在node1,也就是mycat節(jié)點:
在mycat安裝目錄下的conf目錄下有個dbseq.sql,將其導(dǎo)入數(shù)據(jù)庫:
這個庫有一個表:
在server.xml(當(dāng)然是node1中)中配置:
(sequnceHandlerType標(biāo)簽配置生成全局序列號的方式:0.本地文件,1.數(shù)據(jù)庫,2.時間戳,3.zk遞增方式)
還要增加一個配置文件(指定相關(guān)表和函數(shù)所在的數(shù)據(jù)節(jié)點 ):
還要在schema.xml中新增一個數(shù)據(jù)節(jié)點:
(剛才建立的mycat數(shù)據(jù)庫的節(jié)點)
還要增加一個數(shù)據(jù)節(jié)點:
查看是否存在該用戶:
查看其權(quán)限:
但是,新增的全局庫/表中包含mysql的函數(shù),而帳號未授權(quán),插入數(shù)據(jù)會報錯,所以,增加執(zhí)行函數(shù)/存儲過程的權(quán)限:
在全局表中增加一條記錄:
(ORDER_MASTER:order水平分庫的全局自增。當(dāng)前值1,以1遞增。注意:使用的是大寫的表名,在配置中也要大寫)
怎么告訴mycat要使用全局自增id呢?
(增加autoIncrement="true")
重啟mycat,查看是否啟動成功:
接下來插入數(shù)據(jù),全局自增order_id成功
但是,如果需要關(guān)聯(lián)查詢:
order_master做了切片操作,而order_detail并沒有對它進(jìn)行切片操作,所以是跨分片關(guān)聯(lián)!
那用什么方式解決呢?
可以用全局表,但顯然這是很大的表,并且是隨著增長的,修改頻繁,顯然不適合全局表場景,這里用到mycat提供的另外一個解決跨分片關(guān)聯(lián)問題的方法——ER分片表(通過ER關(guān)系來分片,可以把需要關(guān)聯(lián)的兩個表,根據(jù)它們的關(guān)聯(lián)鍵,把關(guān)聯(lián)的數(shù)據(jù)分布到同一個分片內(nèi),這樣就可以在同一個分片內(nèi)解決關(guān)聯(lián)問題):
在orderdb01、orderdb02、orderdb03、orderdb04中創(chuàng)建表order_detail(node2、node3中):
同樣在orderdb02、orderdb03、orderdb04中創(chuàng)建表order_master......
編輯schema.xml(廢話,當(dāng)然還是node1):
(刪掉dataNode)
(增加名為order_detail的子表/childTable,primarykey為該表本來的主鍵,關(guān)聯(lián)鍵joinkey,父表主鍵parentKey,同樣要使用全局自增id(autoIncrement="true"))
配置全局自增id:
插入測試數(shù)據(jù)后,order_master和order_detail都生成了10條數(shù)據(jù):
看下數(shù)據(jù)的分布:
相同order_id的數(shù)據(jù)是放在同一個數(shù)據(jù)庫分片的:
現(xiàn)在可以進(jìn)行關(guān)聯(lián)查詢了:
轉(zhuǎn)載于:https://blog.51cto.com/5660061/2391986
總結(jié)
- 上一篇: ICCV
- 下一篇: 苏轼号什么居士是什么家之一