mycat分庫分表

2021-09-05 11:01:31 字數 2822 閱讀 3605

mycat是資料庫分庫分表的中介軟體,mycat使用最多的兩個功能是:讀寫分離和分庫分表功能,支援全域性表和e-r關係(這兩個比較實用)

mycat相當於是乙個**,可以將多個實際資料庫組合成乙個完整的虛擬資料庫

我們可以直接訪問mycat的埠,其使用的是mysql原生的協議連線資料庫進行通訊

mycat主要用來解決水平拆分的問題,因為水平拆分和架構無關資料量大了就必須要做,而垂直拆分更多的是架構設計的問題

配置mycat可以實現分庫分表

配置檔案:

類似mycat的有tddl、sharding-jdbc、cobar

mycat核心概念:

mycat通過定義表的分片規則來實現分片,每個**可以**乙個分片規則,每個分片規則指定乙個分片欄位並繫結乙個函式,來實現動態分片演算法

1.schema:邏輯庫,與mysql中的database(資料庫)對應,乙個邏輯庫中定義了所包括的table,schema可以有多個,具體配置如下:

《-- rule 分片規則, subtables="news$1-3" 資料表儲存在資料庫dn1的news1,news2,news3表中 --》

《-- datanode="dn1,dn2" ,一張表存在於多個資料庫裡--》

2.table:邏輯表,即物理資料庫中儲存的某一張表,與傳統資料庫不同,這裡的**需要宣告其所儲存的邏輯資料節點datanode。在此可以指定表的分片規則。

3.datanode:mycat的邏輯資料節點,是存放table的具體物理節點,也稱之為分片節點(也就是物理資料庫),通過datasource來關聯到後端某個具體資料庫上 ,如下所示:

《--datahost指的是伺服器端口是乙個連線,database是乙個資料庫乙個伺服器可以有多個資料庫--》

select user()

**4.datasource:**定義某個物理庫的訪問位址,用於**到datanode上

5.datahost物理資料庫配置

6.er表

childtable是附屬於其父表,也就是說子表和父表之間存在關聯關係,mycat會將子表和父表關聯資料存放在同乙個節點上

分片規則 rule.xml

id

func1

操作

分片表 在schema,xml裡面定義的分片表如下:

上面的**定義了乙個邏輯分片表hotnews,宣告了其資料分別儲存於資料節點dn1,dn2,dn3裡面

分片規則定義在rule.xml中,mod-long是將id作為分片鍵,按照某個數進行取模,動態計算資料應該存放在何處

全域性表 在schema,xml裡面定義的全域性表如下:

company表是全域性表,通過mycat對全域性表的操作所有的資料節點都會同步改變

使用示例:

例如:我們將一張user表拆分成了三張,根據一定規則路由,假如插入了六條資料

當我們使用select * from user

mycat會給語句加上limit100,然後從三張表中載入資料,組合起來返回

如果使用select * from user where id = 1;

mycat會路由到指定的表,因為我們定義的id是分片鍵

但是如果使用查詢語句select * from user where name = 『***』;

mycat無法使用路由,會在三個資料表中都執行查詢語句

因此在定義分片鍵的時候需要考慮這個問題

分片方式

1.連續分片

日期,數字範圍等

例如:在rule.xml裡面有定義例如sharding-by-month按月分片

autopartition-long.txt

按照數字範圍進行劃分,具體的劃分規則例如 0-- 10000 放在第1個,10001-20000放在第二個分片

2.離散分片

取模,列舉,hash等

3.綜合分片

先取模,然後再定義範圍

分片總結

1.根據業務資料特性選擇分片規則

2.善用全域性表,er關係表解決join操作

3.用好primarykey讓效能起飛

mycat註解

mycat是無法執行函式的,那麼怎麼辦呢?

可以使用mycat註解直接指定函式語句需要在哪個節點執行,mycat識別到指定註解的時候會直接把後面的sql語句傳送到指定的節點解析執行

例如:

/*!mycat:sql=select * from users where userid =1*/ select fun() from dual;
mycat關聯查詢

1.用好er表

2.善用全域性表

3.使用註解

/*!mycat:catlet=io.mycat.catlets.sharejioin*/
目前只支援兩張表的關聯查詢

Mycat分庫分表

schema.xml 配置 name dn1 datahost localhost1 database db1 name dn2 datahost localhost1 database db2 name dn3 datahost localhost1 database db3 把localhost...

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 分庫分表

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