發(fā)現(xiàn)一些用戶有個(gè)普遍認(rèn)知:分庫(kù)分表配置繁瑣,而且需要大量文檔來(lái)描述配置。這個(gè)認(rèn)知是錯(cuò)誤的!
本文僅描述最核心的內(nèi)容:
右側(cè)的MySQL
在Mycat2
的配置里面叫做prototype
,專門用來(lái)響應(yīng)兼容性SQL和系統(tǒng)表SQL。
客戶端或者所在應(yīng)用框架運(yùn)行所需必須的SQL,但是用戶一般接觸不到,它們會(huì)影響客戶端的啟動(dòng)和運(yùn)行。而Mycat2對(duì)于這種SQL盡可能不影響用戶使用。
分庫(kù)分表中間件中用于處理MySQL的兼容性SQL和系統(tǒng)表SQL的服務(wù)器,這個(gè)配置項(xiàng)可以指向一個(gè)服務(wù)器,也可以是一個(gè)集群,Mycat依賴它處理非select
,insert
,update
,delete
語(yǔ)句。當(dāng)這個(gè)服務(wù)器是與第一個(gè)存儲(chǔ)節(jié)點(diǎn)是同一個(gè)服務(wù)器/集群的時(shí)候,我們一般把它稱之為0號(hào)節(jié)點(diǎn)。
prototype.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[
"prototypeDs"
],
"maxCon":200,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"switchType":"SWITCH"
}
當(dāng)需要進(jìn)行數(shù)據(jù)分片的時(shí)候,通過(guò)擴(kuò)展存儲(chǔ)節(jié)點(diǎn)。
準(zhǔn)備兩個(gè) MySQL 服務(wù)器(prototype 服務(wù)器)
端口:3306
,3307
用戶名:root
密碼:123456
Mycat2
的jar包。
保證配置文件由server.json
,內(nèi)容至少是:
{
"server":{
"ip":"127.0.0.1",
"mycatId":1,
"port":8066,
"serverVersion": "5.7.33-mycat-2.0" //注意設(shè)置模擬的MySQL版本,與后端,客戶端版本對(duì)應(yīng)
}
}
啟動(dòng)請(qǐng)參考文檔安裝與啟動(dòng)
啟動(dòng)的過(guò)程中,Mycat會(huì)在配置文件夾生成默認(rèn)配置,加載上述的MySQL中的系統(tǒng)表,并建立用戶名為root
,密碼為123456
。
此時(shí)使用客戶端登錄 Mycat 即可。
CREATE DATABASE db1
該語(yǔ)句執(zhí)行兩個(gè)操作:
Mycat可以在控制臺(tái)操作。
USE `db1`;
該語(yǔ)句執(zhí)行兩個(gè)操作:
DROP DATABASE db1
該語(yǔ)句執(zhí)行兩個(gè)操作:
CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建表語(yǔ)句執(zhí)行兩個(gè)操作:
使用注釋動(dòng)態(tài)配置 Mycat
如果使用 MySQL 官方客戶端添加 -c
參數(shù)避免客戶端過(guò)濾注釋。
/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://127.0.0.1:3306",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://127.0.0.1:3306",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://127.0.0.1:3307",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://127.0.0.1:3307",
"user":"root",
"password":"123456"
} */;
/*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */;
/*! mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]} */;
drop table db1.travelrecord
刪除語(yǔ)句執(zhí)行兩個(gè)操作:
CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;
建全局表語(yǔ)句執(zhí)行操作:
c
的集群納入到全局表的存儲(chǔ)節(jié)點(diǎn)中。CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 2 dbpartitions 2;
建分片表語(yǔ)句執(zhí)行操作:
c
的集群納入到分片表的存儲(chǔ)節(jié)點(diǎn)中。默認(rèn)分片表的自增序列是雪花算法。
/*+ mycat:showDataNodes{//1.18前
"schemaName":"db1",
"tableName":"normal"
} */;
/*+ mycat:showTopology{//1.18后
"schemaName":"db1",
"tableName":"normal"
} */;
上述的原型庫(kù)與c0
實(shí)際上是同一個(gè)數(shù)據(jù)庫(kù)使用創(chuàng)建了兩個(gè)數(shù)據(jù)源進(jìn)行連接。
由于直接更改本地配置比較繁瑣,所以 mycat2 實(shí)現(xiàn)了使用注解來(lái)更改配置,可以把注解攜程腳本,在客戶端導(dǎo)入此腳本就可以,Mycat2 支持多語(yǔ)句執(zhí)行。
通過(guò)注釋配置。
如果物理表不存在,在 mycat2 能正常啟動(dòng)的情況下,根據(jù)當(dāng)前配置自動(dòng)創(chuàng)建分片表,全局表的物理表(但不自動(dòng)創(chuàng)建單表的物理表)。
/*+ mycat:repairPhysicalTable{} */;
更多建議: