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