MyCAT完整實驗報告
?
前言
剛剛看了一下前面的那篇MyCAT的文章 感覺有一些問題 所以拿出一篇文章再說一下 單獨構建了完整的實驗環境 這樣會全面一點
?
安裝MyCAT
#跳過
?
主從配置
#不多追溯 因為我們選擇的主從 也可以做雙主機 但我們后邊再說
?
環境搭建
一、環境規劃
服務器角色 | IP 地址 | 部署服務 | 說明 |
---|---|---|---|
server_1 | 192.168.3.168 | MySQL + MyCAT | MyCAT 中間件節點 |
server_2(主庫) | 192.168.3.135 | MySQL | 主庫(MASTER) |
server_3(從庫) | 192.168.3.159 | MySQL | 從庫(SLAVE) |
(用于下一個實驗 目前無需在意) 備用主庫 | 192.168.3.160 | MySQL | 雙主架構備用主庫 |
修改配置文件
vim m1.datasource.json #PS:文件名是 *****.datasource.json
{"dbType":"mysql","idleTimeout":60000,"initSqls":[],"initSqlsGetConnection":true,"instanceType":"READ_WRITE","maxCon":1000,"maxConnectTimeout":3000,"maxRetryCount":5,"minCon":1,"name":"m1","password":"123","queryTimeout":0,"type":"JDBC","url":"jdbc:mysql://192.168.3.135:3306?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true","user":"aa","weight":0
}
----------------------------------------------------
vim m2.datasource.json
{"dbType":"mysql","idleTimeout":60000,"initSqls":[],"initSqlsGetConnection":true,"instanceType":"READ_WRITE","maxCon":1000,"maxConnectTimeout":3000,"maxRetryCount":5,"minCon":1,"name":"m2","password":"123","queryTimeout":0,"type":"JDBC","url":"jdbc:mysql://192.168.3.160:3306?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true","user":"bb","weight":0
}#PS:
#1> MyCat 2 要求每個數據源必須單獨放在一個 JSON 文件中,一個 JSON 文件只能定義一個數據源,不能在一個文件中同時定義多個數據源(如 m1 和 m2)。
#2> MyCat 2 加載數據源時,會掃描 conf/datasources 目錄下的所有 JSON 文件,每個文件被視為一個獨立的數據源配置。
#3> 如果在一個文件中定義多個數據源(即使格式正確),MyCat 會解析失敗,導致啟動報錯。#PS:以下為命令配置/*+ mycat:createDataSource
{"dbType": "mysql","idleTimeout": 60000,"initSqls": [],"initSqlsGetConnection": true,"instanceType": "READ_WRITE","maxCon": 1000,"maxConnectTimeout": 3000,"maxRetryCount": 5,"minCon": 1,"name": "m1","password": "123","type": "JDBC","url": "jdbc:mysql://192.168.3.135:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8","user": "root","weight": 0
}
*/-- 更多操作添加讀的數據源/*+ mycat:createDataSource
{"dbType": "mysql","idleTimeout": 60000,"initSqls": [],"initSqlsGetConnection": true,"instanceType": "READ","maxCon": 1000,"maxConnectTimeout": 3000,"maxRetryCount": 5,"minCon": 1,"name": "m2","password": "123","type": "JDBC","url": "jdbc:mysql://192.168.3.159:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8","user": "root","weight": 0
}
*/
?
集群配置(conf/clusters/prototype.cluster.json)
vim ../clusters/prototype.cluster.json
{"clusterType":"MASTER_SLAVE","heartbeat":{"heartbeatTimeout":1000,"maxRetryCount":0,"minSwitchTimeInterval":300,"showLog":true,"slaveThreshold":0.0},"masters":["m1"],"maxCon":2000,"name":"prototype","readBalanceType":"BALANCE_ALL","replicas":["m1"],"switchType":"SWITCH"
}#PS:雙主機
{"clusterType":"MASTER_MASTER", // 雙主架構,部分版本也支持用 MASTER_SLAVE(但需將雙主都放 masters)"heartbeat":{"heartbeatTimeout":1000,"maxRetry":3,"minSwitchTimeInterval":300,"slaveThreshold":0},"masters":["m1", // 主庫1(讀寫)"m1s1" // 主庫2(讀寫,原從庫升級為雙主)],"maxCon":2000,"name":"prototype","readBalanceType":"BALANCE_ALL", // 讀請求在兩個主庫間均衡分配"switchType":"SWITCH", // 支持故障切換"weight":{ // 可選:給兩個主庫配置權重,控制請求分配比例"m1":1,"m1s1":1}
}
1. 主從集群構建與高可用基礎
- 定義主從角色? :明確集群中
m1
為 主庫(Master) 、m2
為 從庫(Replica/Slave) ,MyCat 會基于此角色維護主從關系。 - 主從心跳檢測:通過配置的
heartbeat
機制(超時 1000ms、重試 3 次、最小切換間隔 300ms),實時檢測主庫m1
和從庫m2
的存活狀態,為后續故障切換打基礎。
2. 讀寫分離(核心功能)
- 讀請求負載均衡:
readBalanceType: "BALANCE_ALL"
表示 所有從庫(此處為 m1s1)都會參與讀請求分發,MyCat 會將查詢(SELECT)等讀操作自動路由到從庫,避免主庫讀壓力過大;若從庫故障,讀請求會自動調整(如 fallback 到主庫,具體依賴額外配置)。 - 寫請求路由到主庫:所有寫操作(INSERT/UPDATE/DELETE)會被 MyCat 強制路由到主庫
m1
,確保主庫數據是最新的,再通過 MySQL 自身的主從同步(如 binlog 復制)將數據同步到從庫m2
,保證主從數據一致性。
?
測試
重啟MyCAT
cd /usr/local/mycat/bin
./mycat restart
netstat -anput | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 8834/java
mysql -u root -p123456 -h 127.0.0.1 -P 8066
?
創建測試庫和表
create database CATTEST; --創CATTEST庫
mysql>
mysql> use CATTEST;
Database changed
mysql> create table test(id int);
Query OK, 0 rows affected (0.38 sec)mysql> insert into test valuse(1);
ERROR 1064 (HY000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'valuse (valuse)' at line 1
mysql> insert into test values(1);
Query OK, 1 row affected (0.01 sec)mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| CATTEST |
| information_schema |
| mycat |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
?
?
總結
彌補了上一期的MyCAT的不完整 所以 這次 做了了一個相對來說完整的 包括怎么配置等等 其實還想寫分庫分表的 但理了一下思路 好像在這篇文章去說的話 就會很多了 所以 下篇文章去完整去說
好了 更新的評論越來越慢 但也沒辦法 博主盡量像寫的詳細易懂一點 OK 希望大家生活是幸福的 知道自己為了什么努力 下期再見!!!
?