Yii2 實現 MySQL 主從讀寫分離配置指南
Yii2 框架內建支援讀寫分離,僅需在配置文件中聲明主從數據庫組件即可自動路由:寫操作(INSERT/UPDATE/DELETE)走 Master,讀操作(SELECT)走 Slave。本文演示最小化配置與驗證方法。
核心原理
- Master:處理事務性寫操作(INSERT、UPDATE、DELETE、DDL)
- Slave:處理 SELECT 查詢,分擔讀壓力
- 好處:備份容災、讀寫分壓、支撐更高併發
配置實戰:db.php
return [
'class' => 'yii\db\Connection',
// 主庫配置
'dsn' => 'mysql:host=127.0.0.1;dbname=master_db',
'username' => 'root',
'password' => 'master_pass',
'charset' => 'utf8mb4',
// 從庫配置(可配置多個,自動負載均衡)
'slaveConfig' => [
'username' => 'root',
'password' => 'slave_pass',
'charset' => 'utf8mb4',
],
'slaves' => [
['dsn' => 'mysql:host=127.0.0.1;dbname=slave_db'],
// 可添加更多 slave
],
];
驗證測試
1. 準備數據
- Master 庫:
INSERT INTO user (id, username) VALUES (1, 'master');
- Slave 庫:
INSERT INTO user (id, username) VALUES (1, 'slave');
2. 執行查詢
$user = User::findOne(1);
var_dump($user->username);
3. 結果驗證
輸出:string(5) "slave"
說明:SELECT 自動路由至 Slave 庫,讀取到 'slave' 值。若執行 $user->save() 則會路由至 Master。
進階配置選項
| 參數 | 說明 | 預設值 |
| slaveConfig | 從庫共用配置(用戶、密碼、charset 等) | [] |
| slaves | 從庫 DSN 列表,支援多台 | [] |
| enableSlaves | 是否啟用讀寫分離 | true |
| shuffleMasters | 多主時是否隨機打散 | false |
多從庫負載均衡
'slaves' => [
['dsn' => 'mysql:host=192.168.1.10;dbname=slave_db'],
['dsn' => 'mysql:host=192.168.1.11;dbname=slave_db'],
['dsn' => 'mysql:host=192.168.1.12;dbname=slave_db'],
],
// Yii2 會隨機選擇一個 Slave 連接
強制指定連接(特殊場景)
// 強制使用 Master 讀取(如讀寫分離延遲導致讀不到剛寫入的數據)
$user = User::find()->useMaster()->where(['id' => 1])->one();
// 強制使用 Slave 寫入(極少見,僅特殊邏輯)
$db->useSlave()->createCommand()->insert(...)->execute();
主從同步延遲應對
- 關鍵業務強制 Master 讀:
useMaster()
- 半同步複寫:
rpl_semi_sync_master=ON
- GTID 複寫:MySQL 5.6+ 標準,故障切換更可靠
- 監控延遲:
SHOW SLAVE STATUS\G 關注 Seconds_Behind_Master
生產環境檢查清單
- [ ] Master/Slave 獨立物理機/雲主機
- [ ] 專用複賬號:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'xxx';
- [ ] binlog 格式:
binlog_format=ROW
- [ ] 防火牆僅開放內網 3306
- [ ] 監控:主從延遲、Slave_IO/Running 狀態、磁碟空間
- [ ] 定期驗證:
pt-table-checksum 數據一致性校驗
Yii2 的讀寫分離實現極其簡潔,核心在於正確配置主從拓撲與應對同步延遲。配合資料庫層面的高可用架構(MHA/Orchestrator/GTID),可構建企業級穩定的數據庫訪問層。
- 上一篇文章: MySQL 基礎 SQL 語句速查手冊(DDL/DML/DCL)
- 下一篇文章: Navicat 導入 Excel 至 MySQL 避坑指南:Sheet 名稱編碼問題
Copyright ©
程式碼之家 All Rights Reserved