Mycat2+Mysql一主一從實現讀寫分離配置
前置配置
- Mysql一主一從搭建
- Mycat2環境搭建
環境資訊
ip地址 | 軟體 | 角色 | 版本 |
---|---|---|---|
192.168.1.19 | Mysql | 主 | 8.0.40-0ubuntu0.20.04.1 |
192.168.1.19 | Mycat2 | —— | 1.21-release-3-14 |
192.168.1.20 | Mysql | 從 | 8.0.40-0ubuntu0.20.04.1 |
操作步驟
1. 修改並增加資料來源
- 新增配置檔案
${mycat安裝目錄}/conf/datasources/ds0.datasource.json
,該檔案在環境搭建時應該已修改好
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"ds0",
"password":"123456",
"type":"JDBC",
"url":"jdbc:mysql://localhost:3306/test?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false",
"user":"mycat",
"weight":0
}
- 增加配置檔案
${mycat安裝目錄}/conf/datasources/ds1.datasource.json
,ds1為隨意取的名字,與檔案中name
的值保持一致即可
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"ds1",
"password":"123456",
"type":"JDBC",
"url":"jdbc:mysql://192.168.1.20:3306/test?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false",
"user":"mycat",
"weight":0
}
- instanceType:instanceType配置例項只讀還是讀寫,讀節點可以設定為READ
2. 修改叢集配置
- 複製prototype.cluster.json檔案為master-slave.cluster.json
cp prototype.cluster.json master-slave.cluster.json
- 修改配置檔案
${mycat安裝目錄}/conf/cluster/master-slave.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[
"ds0"
],
"replicas":[
"ds1"
],
"maxCon":200,
"name":"master-slave",
"readBalanceType":"BALANCE_ALL_READ",
"switchType":"NOT_SWITCH"
}
-
解釋:
-
replicas: 配置datasource目錄下Mysql從機資料來源名稱
-
name:後面schema配置會用到
-
readBalanceType: 查詢負載均衡策略
- BALANCE_ALL(預設值):獲取叢集中所有資料來源
- BALANCE_ALL_READ:獲取叢集中允許讀的資料來源
- BALANCE_READ_WRITE:獲取叢集中允許讀寫的資料來源,但允許讀的資料來源優先
- BALANCE_NONE:獲取叢集中允許寫資料來源,即主節點中選擇
-
switchType:切換模式
- NOT_SWITCH:不進行主從切換
- SWITCH:進行主從切換
-
3. 配置物理庫 schemas和mycat資料來源/叢集的關聯關係
- 新增配置檔案
${mycat安裝目錄}/conf/schemas/test.schema.json
,命名為${資料庫}.schema.json
{
"schemaName": "test",
"targetName": "master-slave",
"normalTables": {}
}
- 解釋
- schemaName:指向物理庫
- targetName:指向叢集或者資料來源, 這裡配置與前面叢集配置的name一致
測試
測試前準備
- 開啟Mysql主從的日誌
#日誌輸出到表中 對應的表是mysql.general_log
SET GLOBAL log_output = 'TABLE';
#開啟general_log,重啟後失效
SET GLOBAL general_log = 'ON';
# 測試完成後將日誌重寫入檔案
SET GLOBAL log_output = 'FILE';
SET GLOBAL general_log = 'OFF'; #關閉
- 透過如下語句檢視最近執行的語句
SELECT event_time,
user_host,
thread_id,
server_id,
command_type,
CAST(argument AS CHAR(500) CHARACTER SET utf8mb4) argument
FROM mysql.general_log
ORDER BY event_time DESC;
- 為避免干擾,可在Mysql主機使用
truncate mysql.general_log
命令先清空表中日誌再查詢
連線Mycat
測試寫入
- 在mycat的test資料庫中寫入插入命令
Mysql主機結果
Mysql從機查詢結果
- 同步方式為ROW,可以看出從機並沒有執行insert語句,但是資料已增加。嘗試多次,結果一致,符合預期
測試查詢
先清空mysql.general_log,並在Mycat中查詢表user_info的最後三個結果
select * from `user_info` order by id desc limit 3;
兩個資料庫均有查詢語句,符合預期
- Mysql主庫
- Mysql從庫
參考
- mycat2實現讀寫分離
- Mycat2權威指南 叢集
- Mycat2權威指南 邏輯庫與邏輯表