三節點 MySQL 主從集群:
| 角色 | 主機名 | IP |
|---|---|---|
| Master | mysql-server1 | 192.168.244.145 |
| Slave1 | mysql-server2 | 192.168.244.146 |
| Slave2 | mysql-server3 | 192.168.244.144 |
應用僅連接 MyCAT(8066 端口),由中間件路由讀寫請求,實現解耦。
schema.xml —— dataHost 關鍵屬性
select user()
| 參數 | 值 | 含義 |
|---|---|---|
| balance | 1 | 所有 standby writeHost(hostS1/S2)參與 SELECT 負載均衡 → 讀寫分離生效 |
| switchType | -1 | **不自動切換**主庫。Master 掛掉後 Slave 不提升為主,避免誤寫入從庫 |
| writeType | 0 | 所有寫操作路由到第一個 writeHost(hostM1) |
balance 取值速查:0=不分離;1=standby 參與讀;2=全部節點隨機讀;3=僅 readHost 讀(writer 不承擔讀壓力)。
@@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);
SELECT * FROM travelrecord;
結果輪流顯示 mysql-server2、mysql-server3 的數據,**從未出現 master (server1)**,證明讀請求分發到 Slave。
route to hostS1 / route to hostS2。systemctl stop mysqldERROR 1184 (HY000): Connection refused —— 寫入失敗,符合預期SELECT * FROM travelrecord; —— **正常返回 Slave 數據**✅ 讀寫分離 + 主掛不影響讀,滿足高可用讀服務需求。
readHost 標籤:舊版配置 <readHost> 會導致 Master 掛掉後 Slave 也不可用。統一用 writeHost + balance=1 才是正解。SET autocommit=0 開啟事務後,事務內 SELECT 會路由到 Master(保證一致性),而非 Slave。<heartbeat>select user()</heartbeat> 必須輕量、高頻,確保故障快速感知。switchType=2(基於 show slave status 同步狀態切換)實現**自動故障轉移**(需雙主架構)MyCAT 以極簡配置交付企業級讀寫分離,關鍵在於理解 balance 與 switchType 的語義組合。