Mycat2+Mysql一主一從實現讀寫分離配置

litayun發表於2024-12-04

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

image-20241203184927825

操作步驟

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

image-20241203185033513

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

image-20241203185954578

測試寫入

  • 在mycat的test資料庫中寫入插入命令

Mysql主機結果

image-20241203105929629

Mysql從機查詢結果

image-20241203110259741

  • 同步方式為ROW,可以看出從機並沒有執行insert語句,但是資料已增加。嘗試多次,結果一致,符合預期

測試查詢

先清空mysql.general_log,並在Mycat中查詢表user_info的最後三個結果

select * from `user_info` order by id desc limit 3;

兩個資料庫均有查詢語句,符合預期

  • Mysql主庫

image-20241203190843036

  • Mysql從庫

image-20241203190931986

參考

  • mycat2實現讀寫分離
  • Mycat2權威指南 叢集
  • Mycat2權威指南 邏輯庫與邏輯表

相關文章