一,MyCat入門
1.什么是mycat
官網(wǎng):http://www.mycat.org.cn/
? mycat是數(shù)據(jù)庫中間件
它可以干什么?
- 讀寫分離
- 數(shù)據(jù)分片:垂直拆分,水平拆分
- 多數(shù)據(jù)源整合
2.數(shù)據(jù)庫中間件
? 中間件:是一類連接軟件組件和應用的計算機軟件,以便于軟件各部件之間的溝通。
? 例子:tomcat,kafka,redis等中間件
3.為什么使用macat
- java與數(shù)據(jù)庫緊耦合
- 高訪問量高并發(fā)對數(shù)據(jù)庫的壓力
- 讀寫請求數(shù)據(jù)不一致
4.常見數(shù)據(jù)庫中間件對比
- cobar:屬于阿里B2B事業(yè)群,始于2008年,在阿里服役3年多,接管3000+個MySQL數(shù)據(jù)庫的shema,集群日處理在線SQL請求50億次以上,由于cobar發(fā)起人的離職,cobar停止維護
- mycat:開源社區(qū)在阿里cobar基礎上進行二次開發(fā),解決了cobar存在的問題,并且加入了許多新的功能在其中
- oneproxy:基于MySQL官網(wǎng)的proxy思想利用c進行開發(fā)的,oneproxy是一款商業(yè)收費的中間件。舍去了一些功能,專注在性能和穩(wěn)定性上。
- kingshard:由小團隊用go語言開發(fā),需要不斷完善
- viress:是YouTube生產(chǎn)在使用,結構很復雜。不支持MySQL原生協(xié)議,使用需要改造成本。
- atllas:是360團隊基于MySQL proxy改寫,功能還需完善,高并發(fā)下不穩(wěn)定
- maxscale:是mariadb研發(fā)的中間件
- MySQLroute:是MySQL官網(wǎng)oracle公司發(fā)布的中間件
5.mycat原理
? mycat的原理中最重要的一個動詞是‘攔截’,它攔截了用戶發(fā)送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分片分析,路由分析,讀寫分離分析,緩存分析等,然后將此SQL發(fā)往后端的真實數(shù)據(jù)庫,并將返回的結構做適當?shù)奶幚?,最終再返回給用戶。
6.mycat1.X與mycat2.X的功能對比
功能 | 1.6 | 2.x |
---|---|---|
多語句 | 不支持 | 支持 |
blob值 | 支持一部分 | 支持 |
全局二級索引 | 不支持 | 支持 |
任意跨庫join(包含復雜查詢) | catlet支持 | 支持 |
分片表與分片表JOIN查詢 | ER表支持 | 支持 |
關聯(lián)子查詢 | 不支持 | 支持一部分 |
分庫同時分表 | 不支持 | 支持 |
存儲過程 | 支持固定形式的 | 支持更多 |
支持邏輯視圖 | 不支持 | 支持 |
支持物理視圖 | 支持 | 支持 |
批量插入 | 不支持 | 支持 |
執(zhí)行計劃管理 | 不支持 | 支持 |
路由注釋 | 支持 | 支持 |
集群功能 | 支持 | 支持更多集群類型 |
自動hash分片算法 | 不支持 | 支持 |
支持第三方監(jiān)控 | 支持mycat-web | 支持普羅米斯,kafka日志等監(jiān)控 |
流式合拼結果集 | 支持 | 支持 |
范圍查詢 | 支持 | 支持 |
單表映射物理表 | 不支持 | 支持 |
XA事務 | 弱XA | 支持,事務自動恢復 |
支持MySQL8 | 需要更改mysql8的服務器配置支持 | 支持 |
虛擬表 | 不支持 | 支持 |
joinClustering | 不支持 | 支持 |
union all語法 | 不支持 | 支持 |
BKAJoin | 不支持 | 支持 |
優(yōu)化器注釋 | 不支持 | 支持 |
ER表 | 支持 | 支持 |
全局序列號 | 支持 | 支持 |
保存點 | 不支持 | 支持 |
離線遷移 | 支持 | 支持(實驗) |
增量遷移 | CRC32算法支持 | BINLOG追平(實驗) |
安全停機 | 不支持 | 支持(實驗) |
HAProxy協(xié)議 | 不支持 | 支持 |
會話粘滯 | update后select會粘滯 | update后select會粘滯且支持設置時間 |
全局表插入支持全局序列號 | 不支持 | 支持 |
全局表插入支持主表插入自增結果作為序列號 | 不支持 | 支持 |
外部調(diào)用的分片算法 | 不支持但可定制 | 支持 |
二,MyCat安裝和管理命令
提前安裝JDK
[root@localhost ~]# tar -zxf jdk-8u171-linux-x64.tar.gz
[root@localhost ~]# ls
anaconda-ks.cfg jdk-8u171-linux-x64.tar.gz mysql80-community-release-el7-7.noarch.rpm
jdk1.8.0_171 mycat2-install-template-1.20.zip original-ks.cfg
[root@localhost ~]# mv jdk1.8.0_171/ /usr/local/java
[root@localhost ~]# vi /etc/profile
PATH=$PATH:/usr/local/java/bin
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
1.下載安裝包
tar(zip)包 :
http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template1.20.zip
jar 包 :
http://dl.mycat.org.cn/2.0/1.21-release/ (下載最新的 jar 包)
2.上傳服務器解壓
[root@localhost ~]# ls
anaconda-ks.cfg mycat2-install-template-1.20.zip original-ks.cfg
mycat2-1.21-release-jar-with-dependencies.jar mysql80-community-release-el7-7.noarch.rpm
[root@localhost ~]# unzip mycat2-install-template-1.20.zip
[root@localhost ~]# mv mycat /usr/local/
[root@localhost mycat]# ls
bin conf lib logs
[root@localhost mycat]# mv /root/mycat2-1.21-release-jar-with-dependencies.jar ./lib/
[root@localhost mycat]# chmod 777 -R ./lib/
3.為mycat連接的MySQL添加用戶
#直接將root改為所有地址可以登錄,方便,但是在真實環(huán)境中需要根據(jù)權限來創(chuàng)建用戶
mysql>
4.修改mycat的portotype的配置
? 啟動mycat之前需要確認prototype數(shù)據(jù)源所對應的mysql數(shù)據(jù)庫配置,修改對應的 user(用戶),password(密碼),url中的ip
[root@localhost mycat]# vi conf/datasources/prototypeDs.datasource.json
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"1234.Com",
"type":"JDBC",
"url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
5.啟動MyCat
[root@localhost mycat]# cd bin/
[root@localhost bin]# chmod 555 *
[root@localhost bin]# ./mycat start
6.MyCat管理
./mycat start #開啟
./mycat stop #關閉
./mycat restart #重啟
./mycat status #查看狀態(tài)
./mycat console #前臺運行
./mycat pause #暫停
7.mycat登錄
[root@localhost bin]# mysql -uroot -p1234.Com -P 8066 -h 192.168.2.1
選項:
-u:用戶名
-p:密碼
-P:端口
-h:IP地址
[root@localhost bin]# mysql -uroot -p1234.Com -P 9066 #后臺管理端口
三,MyCat名詞概念描述
1.分庫分表
? 按照一定規(guī)則把數(shù)據(jù)庫中的表拆分為多個帶有數(shù)據(jù)庫實例,物理庫,物理表訪問路徑的分表
解讀:
? 分庫:一個電商項目,分為用戶庫、訂單庫等等。
? 分表:一張訂單表數(shù)據(jù)數(shù)百萬,達到 MySQL 單表瓶頸,分到多個數(shù)據(jù)庫中 的多張表
2.邏輯庫
? 數(shù)據(jù)庫代理中的數(shù)據(jù)庫,它可以包含多個邏輯表
? 解讀:Mycat 里定義的庫,在邏輯上存在,物理上在 MySQL 里并不存在。有可能是 多個 MySQL 數(shù)據(jù)庫共同組成一個邏輯庫。類似多個小孩疊羅漢穿上外套,扮演一個大 人。
3.邏輯表
? 數(shù)據(jù)庫代理中的表,它可以映射代理連接的數(shù)據(jù)庫中的表(物理表)
? 解讀:Mycat 里定義的表,在邏輯上存在,可以映射真實的 MySQL 數(shù)據(jù)庫的表???以一對一,也可以一對多。
4.物理庫
? 數(shù)據(jù)庫代理連接的數(shù)據(jù)庫中的庫,比如mysql上的information_schema
? 解讀:MySQL 真實的數(shù)據(jù)庫
5.物理表
? 數(shù)據(jù)庫代理連接的數(shù)據(jù)庫中的表,比如mysql上的information_schema.TABLES
? 解讀:MySQL 真實的數(shù)據(jù)庫中的真實數(shù)據(jù)表。
6.分庫分表中間件
? 實現(xiàn)了分庫分表功能的中間件,功能上相當于分庫分表型數(shù)據(jù)庫中的計算節(jié)點
?
7.分庫分表型數(shù)據(jù)庫
? 以分庫分表技術構建的數(shù)據(jù)庫,在組件上一般有計算節(jié)點,存儲節(jié)點.它的存儲節(jié)點一般是一個可獨立部署的數(shù)據(jù)庫產(chǎn)品,比如mysql
8.拆分鍵
? 即分片鍵,描述拆分邏輯表的數(shù)據(jù)規(guī)則的字段
? 解讀:比如訂單表可以按照歸屬的用戶 id 拆分,用戶 id 就是
9.分區(qū)
? 一般指數(shù)據(jù)分區(qū),計算節(jié)點上,水平分片表拆分數(shù)據(jù)的最小區(qū)域
?
10.分區(qū)鍵
? 當使用等值查詢的時候,能直接映射一個分區(qū)的拆分鍵
?
11.系統(tǒng)表,元數(shù)據(jù)表
? 一般指mysql中的information_schema,performance_schema,mysql三個庫下的表
12.物理分表
? 指已經(jīng)進行數(shù)據(jù)拆分的,在數(shù)據(jù)庫上面的物理表,是分片表的一個分區(qū)
? 解讀:多個物理分表里的數(shù)據(jù)匯總就是邏輯表的全部數(shù)據(jù)
13.物理分庫
? 一般指包含多個物理分表的庫
? 解讀:參與數(shù)據(jù)分片的實際數(shù)據(jù)庫
14.單庫分表
? 在同一個數(shù)據(jù)庫下同一個庫表拆分成多個物理分表
?
15.分庫
? 一般指通過多個數(shù)據(jù)庫拆分分片表,每個數(shù)據(jù)庫一個物理分表,物理分庫名字相同
? 解讀:分庫是個動作,需要多個數(shù)據(jù)庫參與。就像多個數(shù)據(jù)庫是多個盤子,分庫就是 把一串數(shù)據(jù)葡萄,分到各個盤子里,而查詢數(shù)據(jù)時,所有盤子的葡萄又通過 Mycat2 組 成了完整的一串葡萄。
16.分片表,水平分片表
? 按照一定規(guī)則把數(shù)據(jù)拆分成多個分區(qū)的表,在分庫分表語境下,它屬于邏輯表的一種
17.單表
? 沒有分片,沒有數(shù)據(jù)冗余的表,
? 解讀:沒有拆分數(shù)據(jù),也沒有復制數(shù)據(jù)到別的庫的表。
18.全局表,廣播表
? 每個數(shù)據(jù)庫實例都冗余全量數(shù)據(jù)的邏輯表.
? 它通過表數(shù)據(jù)冗余,使分片表的分區(qū)與該表的數(shù)據(jù)在同一個數(shù)據(jù)庫實例里,達到join運算能夠直接在該數(shù)據(jù)庫實例里執(zhí)行.它的數(shù)據(jù)一致一般是通過數(shù)據(jù)庫代理分發(fā)SQL實現(xiàn).也有基于集群日志的實現(xiàn).
? 解讀:例如系統(tǒng)中翻譯字段的字典表,每個分片表都需要完整的字典數(shù)據(jù)翻譯字段。
19.集群
? 多個數(shù)據(jù)節(jié)點組成的邏輯節(jié)點.在mycat2里,它是把對多個數(shù)據(jù)源地址視為一個數(shù)據(jù)源地址(名稱),并提供自動故障恢復,轉移,即實現(xiàn)高可用,負載均衡的組件
? 解讀:集群就是高可用、負載均衡的代名詞
20.數(shù)據(jù)源
? 連接后端數(shù)據(jù)庫的組件,它是數(shù)據(jù)庫代理中連接后端數(shù)據(jù)庫的客戶端
? 解讀:Mycat 通過數(shù)據(jù)源連接 MySQL 數(shù)據(jù)庫
21.schema(庫)
? 在mycat2中配置表邏輯,視圖等的配置
22.物理視圖
? 后端數(shù)據(jù)庫中的視圖
23.邏輯視圖
? 在mycat2中的邏輯視圖是把一個查詢語句視為邏輯表的功能
?
24.前端會話
? 一般指Mycat服務器中,該會話指向連接mycat的客戶端
25.后端會話
? 一般指Mycat服務器中,該會話指向連接數(shù)據(jù)庫的客戶端
26.后端數(shù)據(jù)庫
? 在數(shù)據(jù)庫代理中,數(shù)據(jù)庫代理連接的數(shù)據(jù)庫
27.透傳SQL
? 在數(shù)據(jù)庫代理中,指從客戶端接收的SQL,它不經(jīng)過改動,在代理中直接發(fā)送到后端數(shù)據(jù)庫
28.透傳結果集
? 在數(shù)據(jù)庫代理中,指從后端數(shù)據(jù)庫返回的結果集,不經(jīng)過改動,轉換,寫入到前端會話
?
29.ER表
? 狹義指父子表中的子表,它的分片鍵指向父表的分片鍵,而且兩表的分片算法相同
廣義指具有相同數(shù)據(jù)分布的一組表.
? 解讀:關聯(lián)別的表的子表,例如:訂單詳情表就是訂單表的 ER 表
30.原型庫(prototype)
? 原型庫是 Mycat2 后面的數(shù)據(jù)庫,比如 mysql 庫
? 解讀:原型庫就是存儲數(shù)據(jù)的真實數(shù)據(jù)庫,配置數(shù)據(jù)源時必須指定原型庫
四,MyCat配置文件介紹
1.配置文件
[root@localhost ~]# cd /usr/local/mycat/conf/
[root@localhost conf]# ll
總用量 32
drwxr-xr-x 2 root root 36 6月 28 2021 clusters
drwxr-xr-x 2 root root 41 5月 29 11:01 datasources
-rw-r--r-- 1 root root 3338 3月 5 2021 dbseq.sql
-rw-r--r-- 1 root root 316 11月 2 2021 logback.xml
-rw-r--r-- 1 root root 0 3月 5 2021 mycat.lock
drwxr-xr-x 2 root root 31 6月 28 2021 schemas
drwxr-xr-x 2 root root 6 6月 28 2021 sequences
-rw-r--r-- 1 root root 776 12月 28 2021 server.json
-rw-r--r-- 1 root root 1643 3月 5 2021 simplelogger.properties
drwxr-xr-x 2 root root 233 6月 28 2021 sql
drwxr-xr-x 2 root root 6 6月 28 2021 sqlcaches
-rw-r--r-- 1 root root 49 3月 5 2021 state.json
drwxr-xr-x 2 root root 28 6月 28 2021 users
-rw-r--r-- 1 root root 211 3月 5 2021 version.txt
-rw-r--r-- 1 root root 4165 1月 13 2022 wrapper.conf
clusters:集群
datasources:數(shù)據(jù)源
server.json:服務配置
user:用戶目錄
2.用戶(user)
? 配置用戶相關信息
1.所在目錄
? mycat /conf/users
2.命名方式
? {用戶名}.user.json
3.配置內(nèi)容
[root@localhost conf]# vi users/root.user.json
{
"dialect":"mysql",
"ip":null,
"password":"123456",
"transactionType":"xa",
"username":"root"
}
#字段含義:
#username:用戶名
#password:密碼
#isolation:設置初始化的事務隔離級別
#transactionType:事務類型
可選值:
proxy 本地事務,在涉及大于 1 個數(shù)據(jù)庫的事務,commit 階段失敗會導致不一致,但是兼容性最好
xa 事務,需要確認存儲節(jié)點集群類型是否支持 XA
可以通過語句實現(xiàn)切換
set transaction_policy = 'xa'
set transaction_policy = 'proxy' 可以通過語句查詢
SELECT @@transaction_policy
3.數(shù)據(jù)源(datasource)
? 配置mycat連接的數(shù)據(jù)源信息
1.所在目錄
? mycat /conf/datasources
2.命名方式
? {數(shù)據(jù)源名字}.datasource.json
3.配置內(nèi)容
[root@localhost conf]# vi datasources/prototypeDs.datasource.json
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"1234.Com",
"type":"JDBC",
"url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
字段含義:
dbtype:數(shù)據(jù)庫類型,mysql
name:用戶名
password:密碼
type:數(shù)據(jù)源類型,默認JDBC
url:訪問數(shù)據(jù)庫地址
idletimeout:空閑連接超時時間
initsqls:初始化sql
initsqlsgetconnection:對于JDBC每次獲取連接是否都執(zhí)行initSqls
instanceType:配置實例只讀還是讀寫 可選值:READ_WRITE,READ,WRITE
4.集群(cluster)
? 配置集群信息
1.所在目錄
? mycat /conf/clusters
2.命名方式
? {集群名字}.clusteer.json
3.配置內(nèi)容
[root@localhost conf]# vi clusters/prototype.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[ #配置多個節(jié)點,在主掛的時候會選一個檢測存活的數(shù)據(jù)源作為主節(jié)點
"prototypeDs"
],
"maxCon":200,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"switchType":"SWITCH"
}
字段:
clusterType:集群類型
可選值:
single_node:單一節(jié)點
master_slave:普通主從
garela_cluster:garela cluster /PXC 集群
MHA:MHA集群
MGR:MGR集群
readBalanceType:查詢負責均衡策略
可選值:
BALANCE_ALL(默認值):獲取集群中所有數(shù)據(jù)源
BALANCE_ALL_READ:獲取集群中允許讀的數(shù)據(jù)源
BALANCE_READ_WEITE:獲取集群中允許讀寫的數(shù)據(jù)源,但允許讀的數(shù)據(jù)源優(yōu)先
BALANCE——NODE:獲取集群中允許寫數(shù)據(jù)源,即主節(jié)點中選擇
switchType:切換類型
可選值:
NOT_SWITCH:不進行主從切換
SWITCH:進行主從切換
5.邏輯庫表(schema)
? 配置邏輯庫表,實現(xiàn)分庫分表
1.所在目錄
? mycat /conf/shemas
2.命名方式
? {庫名}.schema.json
3.配置內(nèi)容
[root@localhost conf]# vi schemas/mysql.schema.json
#庫配置
"locality":{
"schemaName":"mysql",
"tableName":"spm_baseline",
"targetName":"prototype"
}
#schemaName:邏輯庫名
#targetName:目的數(shù)據(jù)源或集群
targetName自動從prototype目標加載test庫下的物理表或者視圖作為單表,prototype必須是MySQL服務器
#單表配置
{
"schemaName": "mysql-test",
"normalTables": {
"role_edges": {
"createTableSQL":null,//可選
"locality": {
"schemaName": "mysql",//物理庫,可選
"tableName": "role_edges",//物理表,可選
"targetName": "prototype"//指向集群,或者數(shù)據(jù)源
}
}
五,搭建讀寫分離
? 我們通過mycat和mycat的主從復制配合搭建數(shù)據(jù)庫的讀寫分離,實現(xiàn)MySQL的高可用性,我們將搭建,一主一從,雙主雙從兩種讀寫分離模式。
1.搭建一主一從
? 一個主機用于處理所有寫請求,一臺從機負責所有讀請求
1.搭建MySQL數(shù)據(jù)庫主從復制
1.主MySQL配置
[root@localhost ~]# vi /etc/my.cnf
server-id=1
log-bin=mysql-bin
[root@localhost ~]# systemctl restart mysqld
2.其他配置
#設置不要復制的數(shù)據(jù)庫(可以設置為多個)
binlog-ignore-db=dbname
binlog-ignore-db=information_schema
#設置需要復制的數(shù)據(jù)庫
binlog-do-db=dbname
#設置binlog格式
binlog_format=statement
2.從MySQL配置
[root@localhost ~]# vi /etc/my.cnf
server-id=2
log-bin=mysql-bin
[root@localhost ~]# systemctl restart mysqld
3.主MySQL添加授權用戶和二進制日志信息
mysql> grant replication slave on *.* to slave@'%' identified by '1234.Com';
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 438 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
4.在從機上做主從
mysql> change master to master_host='192.168.2.1',master_user='slave',master_password='1234.Com',master_log_pos=438,master_log_file='mysql-bin.000002';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
Slave_IO_Running: Yes #數(shù)據(jù)傳輸
Slave_SQL_Running: Yes #SQL執(zhí)行
5.測試驗證(主MySQL)
mysql> create database mydb1;
Query OK, 1 row affected (0.00 sec)
mysql> use mydb1;
Database changed
mysql> create table mytb1(id int,name varchar(50));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into
-> mytb1 values(1,'zhangsan');
Query OK, 1 row affected (0.03 sec)
mysql> insert into mytb1 values(2,'lisi');
Query OK, 1 row affected (0.00 sec)
mysql> select * from mytb1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
+------+----------+
2 rows in set (0.00 sec)
2.配置mycat讀寫分離
1.創(chuàng)建數(shù)據(jù)源
[root@localhost mycat]# mysql -uroot -p123456 -P8066 -h192.168.2.1
mysql> create database mydb1;
[root@localhost mycat]# vi conf/schemas/mydb1.schema.json
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"normalTables":{},
"schemaName":"mydb1",
"targetName": "prototype",
"shardingTables":{},
"views":{}
}
2.登錄mycat添加數(shù)據(jù)源
[root@localhost mycat]# mysql -uroot -p123456 -P8066 -h192.168.2.1
mysql> /*+ mycat:createDataSource{ "name":"rwSepw","url":"jdbc:mysql://192.168.2.1:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql> /*+ mycat:createDataSource{ "name":"rwSepr","url":"jdbc:mysql://192.168.2.2:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
Query OK, 0 rows affected (0.03 sec)
#查詢配置數(shù)據(jù)源結果
mysql> /*+ mycat:showDataSources{} */\G
3.更新集群信息,添加dr0從節(jié)點,實現(xiàn)讀寫分離
mysql> /*!mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
Query OK, 0 rows affected (0.03 sec)
mysql> /*+ mycat:showClusters{} */; #查看集群配置文件
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
| NAME | SWITCH_TYPE | MAX_REQUEST_COUNT | TYPE | WRITE_DS | READ_DS | WRITE_L | READ_L | AVAILABLE |
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
| prototype | SWITCH | 2000 | BALANCE_ALL | rwSepw | rwSepw,rwSepr | io.mycat.plug.loadBalance.BalanceRandom$1 | io.mycat.plug.loadBalance.BalanceRandom$1 | true |
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
1 row in set (0.01 sec)
ava.lang.RuntimeException: java.lang.IllegalArgumentException: ignored rw
Sepr
? 修改集群配置文件
[root@localhost mycat]# vi /usr/local/mycat/conf/clusters/prototype.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetryCount":3,
"minSwitchTimeInterval":300,
"showLog":false,
"slaveThreshold":0.0
},
"masters":[
"rwSepw"
],
"replicas":[
"rwSepr"
],
"maxCon":2000,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"switchType":"SWITCH"
}
readBalanceType
查詢負載均衡策略
可選值:
BALANCE_ALL(默認值)
獲取集群中所有數(shù)據(jù)源
BALANCE_ALL_READ
獲取集群中允許讀的數(shù)據(jù)源
BALANCE_READ_WRITE
獲取集群中允許讀寫的數(shù)據(jù)源,但允許讀的數(shù)據(jù)源優(yōu)先
BALANCE_NONE
獲取集群中允許寫數(shù)據(jù)源,即主節(jié)點中選擇
switchType
NOT_SWITCH:不進行主從切換
SWITCH:進行主從切換
4.重啟mycat
[root@localhost mycat]# ./bin/mycat restart
Stopping mycat2...
Stopped mycat2.
Starting mycat2...
5.驗證讀寫分離
在從MySQL上修改數(shù)據(jù)
mysql> update mytb1 set name='wangwu' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
然后使用mycat登錄
查詢來查看數(shù)據(jù)不同
六,雙主雙從讀寫分離
? 一個主機 m1 用于處理所有寫請求,它的從機 s1 和另一臺主機 m2 還有它的從機 s2 負責所有讀請求。當 m1 主機宕機后,m2 主機負責寫請求,m1、m2 互為備機。架構圖 如下
1.環(huán)境
角色 | IP地址 |
---|---|
master1 | 192.168.2.1 |
slave1 | 192.168.2.2 |
master2 | 192.168.2.3 |
slave2 | 192.168.2.4 |
2.搭建雙主雙從
1.一主一從
根據(jù)上面的讀寫分離的步驟做兩遍
2.雙主雙從
? master1與master2互作主從
1.master1配置
mysql> change master to master_host='192.168.2.3',master_user='slave',master_password='1234.Com',master_log_pos=438,master_log_file='mysql-bin.000001';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2.master2配置
mysql> change master to master_host='192.168.2.1',master_user='slave',master_password='1234.Com',master_log_pos=6394,master_log_file='mysql-bin.000001';
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
3.測試
查看是否master1創(chuàng)建庫,四臺同步
3.實現(xiàn)多種主從
1.雙主雙從
*m1:主機
*m2:備機,也負責讀
*s1,s2:從機
2.添加兩個數(shù)據(jù)源
? 注意:如果不是從一主一從做的需要添加四個數(shù)據(jù)源
1.登錄mycat操作
/*+ mycat:createDataSource{ "name":"rwSepw2","url":"jdbc:mysql://192.168.2.3:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
/*+ mycat:createDataSource{ "name":"rwSepr2","url":"jdbc:mysql://192.168.2.4:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
2.修改集群配置文件
[root@localhost mycat]# vi /usr/local/mycat/conf/clusters/prototype.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetryCount":3,
"minSwitchTimeInterval":300,
"showLog":false,
"slaveThreshold":0.0
},
"masters":[
"rwSepw","rwSepw2"
],
"replicas":[
"rwSepr","rwSepr2","rwSepw2"
],
"maxCon":2000,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"switchType":"SWITCH"
}
七,分庫分表
1.分庫分表原理
? 一個數(shù)據(jù)庫由很多表的構成,每個表對應著不同的業(yè)務,垂直切分是指按照業(yè) 務將表進行分類,分布到不同 的數(shù)據(jù)庫上面,這樣也就將數(shù)據(jù)或者說壓力分擔到不同 的庫上面,如下圖:
? 系統(tǒng)被切分成了,用戶,訂單交易,支付幾個模塊
2.如何分庫
? 一個問題:在兩臺主機上的兩個數(shù)據(jù)庫中的表,能否關聯(lián)查詢?
? 答案:不可以關聯(lián)查詢。
分庫的原則:有緊密關聯(lián)關系的表應該在一個庫里,相互沒有關聯(lián)關系的表可以分到 不同的庫里。
例子:
#客戶表 rows:20萬
CREATE TABLE customer(
id INT AUTO_INCREMENT
NAME VARCHAR(200),
PRIMARY KEY(id)
);
#訂單表 rows:600萬
CREATE TABLE orders(
id INT AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id)
);
#訂單詳細表 rows:600萬
CREATE TABLE orders_detail(
id INT AUTO_INCREMENT,
detail VARCHAR(2000),
order_id INT,
PRIMARY KEY(id)
);
#訂單狀態(tài)字典表 rows:20
CREATE TABLE dict_order_type(
id INT AUTO_INCREMENT,
order_type VARCHAR(200),
PRIMARY KEY(id)
);
? 以上四個表如何分庫?客戶表分在一個數(shù)據(jù)庫,另外三張都需要關聯(lián)查詢,分在另外 一個數(shù)據(jù)庫。
3.如何分表
1.選擇要拆分的表
? MySQL 單表存儲數(shù)據(jù)條數(shù)是有瓶頸的,單表達到 1000 萬條數(shù)據(jù)就達到了瓶頸,會 影響查詢效率,需要進行水平拆分(分表)進行優(yōu)化。
? 例如:例子中的 orders、orders_detail 都已經(jīng)達到 600 萬行數(shù)據(jù),需要進行分表 優(yōu)化。
2.分庫字段
? 以 orders 表為例,可以根據(jù)不同自字段進行分表
分表字段 | 效果 |
---|---|
id(主鍵,或創(chuàng)建時間) | 查詢訂單注重是時效,歷史訂單被查詢的次數(shù)少,如此分片會造成一個節(jié)點訪問多,一個訪問少,不平均 |
customer_id(客戶id) | 根據(jù)客戶id去分,兩個節(jié)點訪問平均,一個客戶的所有訂單都在同一個節(jié)點 |
4.實現(xiàn)分庫分表
? Mycat2 一大優(yōu)勢就是可以在終端直接創(chuàng)建數(shù)據(jù)源、集群、庫表,并在創(chuàng)建時指定 分庫、分表。與 1.6 版本比大大簡化了分庫分表的操作
1.添加數(shù)據(jù)庫,存儲數(shù)據(jù)源
/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://192.168.2.1:3306",
"user":"root",
"password":"1234.Com"
} */;
/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://192.168.2.1:3306",
"user":"root",
"password":"1234.Com"
} */;
/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://192.168.2.2:3306",
"user":"root",
"password":"1234.Com"
} */;
/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://192.168.2.2:3306",
"user":"root",
"password":"1234.Com"
} */;
2.添加集群配置
? 把新添加的數(shù)據(jù)源配置成集群文章來源:http://www.zghlxwxcb.cn/news/detail-490195.html
/*!mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */;
/*!
{mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]}
*/;
3.創(chuàng)建全局表
#添加數(shù)據(jù)庫db1
CREATE DATABASE db1;
#在建表語句中加上關鍵字 BROADCAST(廣播,即為全局表)
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
4.創(chuàng)建分片表(分庫分表)
#在 Mycat 終端直接運行建表語句進行數(shù)據(jù)分片
CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 2;
#數(shù)據(jù)庫分片規(guī)則,表分片規(guī)則,以及各分多少片
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(6,102,100,100020);
SELECT * FROM orders;
#同樣可以查看生成的配置信息
#進入相關目錄查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json
ongblob,
PRIMARY KEY (id
),
KEY id
(id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST文章來源地址http://www.zghlxwxcb.cn/news/detail-490195.html
#### 4.創(chuàng)建分片表(分庫分表)
```sql
#在 Mycat 終端直接運行建表語句進行數(shù)據(jù)分片
CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 2;
#數(shù)據(jù)庫分片規(guī)則,表分片規(guī)則,以及各分多少片
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(6,102,100,100020);
SELECT * FROM orders;
#同樣可以查看生成的配置信息
#進入相關目錄查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json
到了這里,關于MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!