首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MyCAT 實現 MySQL 讀寫分離全流程:配置、驗證與主從故障測試

     編輯:MySQL 綜合教學

架構背景

三節點 MySQL 主從集群:

角色主機名IP
Mastermysql-server1192.168.244.145
Slave1mysql-server2192.168.244.146
Slave2mysql-server3192.168.244.144

應用僅連接 MyCAT(8066 端口),由中間件路由讀寫請求,實現解耦。

核心配置 schema.xml —— dataHost 關鍵屬性


  select user()
  
  
  

關鍵參數解讀

參數值含義
balance1所有 standby writeHost(hostS1/S2)參與 SELECT 負載均衡 → 讀寫分離生效
switchType-1**不自動切換**主庫。Master 掛掉後 Slave 不提升為主,避免誤寫入從庫
writeType0所有寫操作路由到第一個 writeHost(hostM1)

balance 取值速查:0=不分離;1=standby 參與讀;2=全部節點隨機讀;3=僅 readHost 讀(writer 不承擔讀壓力)。

驗證讀寫分離

  1. 創建測試表並插入數據(利用 @@hostname 標識寫入節點):
    CREATE TABLE travelrecord (id BIGINT PRIMARY KEY, user_id VARCHAR(100), traveldate DATE, fee DECIMAL, days INT);
    INSERT INTO travelrecord VALUES (1, @@hostname, '2016-01-01', 100, 10);
    INSERT INTO travelrecord VALUES (5000001, @@hostname, '2016-01-02', 100, 10);
  2. 通過 MyCAT 反復查詢:
    SELECT * FROM travelrecord;

    結果輪流顯示 mysql-server2、mysql-server3 的數據,**從未出現 master (server1)**,證明讀請求分發到 Slave。

  3. MyCAT Debug 日誌確認:route to hostS1 / route to hostS2。

主庫故障測試:Slave 仍可讀

  1. 關閉 Master:systemctl stop mysqld
  2. 嘗試寫入:ERROR 1184 (HY000): Connection refused —— 寫入失敗,符合預期
  3. 繼續查詢:SELECT * FROM travelrecord; —— **正常返回 Slave 數據**
✅ 讀寫分離 + 主掛不影響讀,滿足高可用讀服務需求。

避坑指南

  1. 不要用 readHost 標籤:舊版配置 <readHost> 會導致 Master 掛掉後 Slave 也不可用。統一用 writeHost + balance=1 才是正解。
  2. 事務中讀走 Master:SET autocommit=0 開啟事務後,事務內 SELECT 會路由到 Master(保證一致性),而非 Slave。
  3. 心跳檢測:<heartbeat>select user()</heartbeat> 必須輕量、高頻,確保故障快速感知。

生產建議

  • 監控 MyCAT 連接池、路由分布、慢查詢
  • 配合 switchType=2(基於 show slave status 同步狀態切換)實現**自動故障轉移**(需雙主架構)
  • 讀寫分離不等於「強一致讀」,業務若需讀寫強一致請走 Master 或使用半同步復制 + 讀從延遲監控

MyCAT 以極簡配置交付企業級讀寫分離,關鍵在於理解 balance 與 switchType 的語義組合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved