MySQL主從複製讀寫分離與Yii2實現
阿新 • • 發佈:2018-12-22
關於 MySQL的主從複製的配置以及MySQL proxy的配置
在以下這篇文章當中會詳細講到:
或者可以參考這個
接下來我們要說的是在Yii2中是如何實現這個程式碼層級的讀寫分離.
Yii2中主從複製和讀寫分離
這裡主要圍繞最新的Yii2英文文件中的一小節“主從複製與讀寫分離”展開進行介紹。為什麼是英文文件?目前中文翻譯的文件不是最新的。
首先我們需要在 web.php中配置一下在component(元件)陣列中按照下文進行配置,或者是直接覆蓋到config資料夾當中的db.php檔案。
這個配置項都比較清楚,沒有太難的點去解釋slaves 的每個dsn分別對應的是每個從庫的地址。 在這裡需要注意的是通過yii\db\Command::execute()都會被當做寫操作,也就意味著這樣的命令會在主庫中執行。你也許會createCommand(’select * from users’)->excute(),這樣執行但是這樣的語句都會在主庫中執行。在其他所有的情況下,包含查詢的語句會在從庫中進行查詢。Yii2在支援負載均衡以及故障轉移。當第一次執行查詢時,連線元件隨機選取一個從庫去連線它,如果失敗則連線下一個從庫,直到沒有一個從庫可用才會去連線主庫。在上述的配置檔案中的一項 查照Replication and Read-Write Splitting這一節。如果有什麼意見或者建議歡迎提出。
[ 'class' => 'yii\db\Connection', // configuration for the master //dsn=>’mysql:host=localhost;dbname=xxx’ 'dsn' => 'dsn for master server', 'username' => 'master', 'password' => '', // common configuration for slaves 'slaveConfig' => [ 'username' => 'slave', 'password' => '', 'attributes' => [ // use a smaller connection timeout PDO::ATTR_TIMEOUT => 10, ], ], // list of slave configurations 'slaves' => [ ['dsn' => 'dsn for slave server 1'], ['dsn' => 'dsn for slave server 2'], ['dsn' => 'dsn for slave server 3'], ['dsn' => 'dsn for slave server 4'], ], ]
這個配置項都比較清楚,沒有太難的點去解釋slaves 的每個dsn分別對應的是每個從庫的地址。 在這裡需要注意的是通過yii\db\Command::execute()都會被當做寫操作,也就意味著這樣的命令會在主庫中執行。你也許會createCommand(’select * from users’)->excute(),這樣執行但是這樣的語句都會在主庫中執行。在其他所有的情況下,包含查詢的語句會在從庫中進行查詢。Yii2在支援負載均衡以及故障轉移。當第一次執行查詢時,連線元件隨機選取一個從庫去連線它,如果失敗則連線下一個從庫,直到沒有一個從庫可用才會去連線主庫。在上述的配置檔案中的一項
PDO::ATTR_TIMEOUT的值對於每一個從庫都生效。
其他:
我們有可能需要從主庫讀取資料:
$rows = Yii::$app->db->useMaster(function ($db) {
return $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
});
我們也可以通過
Yii::$app->db->slave獲取當前連線並可用的從庫。
結語
本文總結了一下MySQL的讀寫分離以及如何在Yii2中的實現,Yii2也提供了多主多從的配置方案,在這裡不做贅述有興趣的可以http://www.yiiframework.com/doc-2.0/guide-db-dao.html