Mycat分庫分表

2021-07-23 21:59:15 字數 3639 閱讀 7973

[schema.xml]配置

name="dn1"

datahost="localhost1"

database="db1"/>

name="dn2"

datahost="localhost1"

database="db2"/>

name="dn3"

datahost="localhost1"

database="db3"/>

把localhost1中的 db1-3 資料庫對映到mycat dn1-3 節點

規則種類,在rule.xml檔案中

mycat全域性表

如果你的業務中有些資料類似於資料字典,比如配置檔案的配置,常用業務的配置或者資料量不大很少變動的表,這些表往往不是特別大,而且大部分的業務場景都會用到,那麼這種表適合於 mycat全域性表,無須對資料進行切分,只要在所有的分片上儲存乙份資料即可,mycat 在join 操作中,業務表與全域性表進行join聚合會優先選擇相同分片內的全域性表join,避免跨庫 join,在進行資料插入操作時,mycat將把資料分發到全域性表對應的所有分片執行,在進行資料讀取時候將會隨機獲取乙個節點讀取資料。

配置[schema.xml]

"t_config" primarykey="id"

type="global" datanode="dn1,dn2" />

er分片表

有一類業務,例如訂單(order)跟訂單明細(order_detail),明細表會依賴於訂單,也就是說會存在表的主從關係,這類似業務的切分可以抽象出合適的切分規則,比如根據使用者 id切分,其他相關的表都依賴於使用者id,再或者根據訂單id切分,總之部分業務總會可以抽象出父子關係的表。這類表適用於 er分片表,子表的記錄與所關聯的父表記錄存放在同乙個資料分片上,避免資料 join跨庫操作。

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

配置[schema.xml]

name="t_order"

primarykey="id"

datanode="dn$1-3"

rule="mod-long">

name="t_order_detail"

primarykey="id"

joinkey="order_id"

parentkey="id" />

table>多對多關聯

有一類業務場景是 「主表a+關係表+主表b」,舉例來說就是商戶會員+訂單+商戶,對應這類業務,如何

切分? 從會員的角度,如果需要查詢會員購買的訂單,那按照會員進行切分即可,但是如果要查詢商戶當天售出的訂單,那又需要按照商戶做切分,可是如果既要按照會員又要按照商戶切分,幾乎是無法實現,這類業務如何選擇切分規則非常難。目前還暫時無法很好支援這種模式下的3個表之間的關聯。目前總的原則是需要從業務角度來看,關係表更偏向哪個表,即「a的關係」還是「b的關係」,來決定關係表跟從那個方向儲存,未來 mycat版本中將考慮將中間表進行雙向複製,以實現從a-關係表 以及b-關係表的雙向關聯查詢。

mycat配置

[schema.xml]

name="t_order"

primarykey="id"

autoincrement="true"

datanode="dn$1-3"

rule="mod-long">

name="t_order_detail"

primarykey="id"

autoincrement="true"

joinkey="order_id"

parentkey="id" />

table>[sequence_db_conf.properties]

#table=datanode

t_order_detail=dn1

t_order=dn1[sequence_conf.properties]

t_order.curid=0

t_order.minid=1

t_order.maxid=10000

t_order_detail.curid=0

t_order_detail.minid=1

t_order_detail.maxid=10000

curid表示當前id值,minid表示最小id值,maxid表示最大id值

重啟mycat,執行sql

#建立資料庫

create

table t_order(id bigint not

null auto_increment primary

key,company varchar(255))auto_increment=1

default charset=utf8;

create

table t_order_detail(id bigint not

null auto_increment primary

key,good varchar(255),order_id bigint,constraint fk_ordid11 foreign

key (order_id) references t_order (id))auto_increment=1

default charset=utf8;

#插入資料

結論 登陸mysql檢視db1-3的記錄,可以發現,三條order記錄在不同db上,order_detail的記錄與所關聯的order表記錄存放在同乙個資料分片上

mycat分庫分表

一 修改schema.xml select user 二 修改server.xml 0 0 10 011m 1k0 384m true 123456 testdb user testdb true 三 啟動關閉1 進入bin目錄,2 啟動輸入.mycat start。關閉命令 mycat stop ...

mycat分庫分表

mycat是資料庫分庫分表的中介軟體,mycat使用最多的兩個功能是 讀寫分離和分庫分表功能,支援全域性表和e r關係 這兩個比較實用 mycat相當於是乙個 可以將多個實際資料庫組合成乙個完整的虛擬資料庫 我們可以直接訪問mycat的埠,其使用的是mysql原生的協議連線資料庫進行通訊 mycat...

mycat 分庫分表

記錄一下,方便檢視 1.分庫分表解決方案 應用層 jar包 噹噹 sharding jdbc 阿里 tddl 2.拆分原則 2.1能不拆分盡量不拆分 2.2如果要拆分一定要選擇合適的拆分規則,提前規劃好 2.3資料拆分盡量通過資料冗餘或表分組來降低跨庫join的可能 2.4跨庫join是共同難題,所...