yii2 mysql in_yii2 mysql数据库读写分离配置
復制和讀寫分離(Replication and Read-Write Splitting)
許多數據庫支持數據庫復制來獲得更好的數據庫可用性, 以及更快的服務器響應時間。通過數據庫復制功能, 數據從所謂的主服務器被復制到從服務器。所有的寫和更新必須發生在主服務器上, 而讀可以發生在從服務器上。
為了利用數據庫復制并且完成讀寫分離, 你可以按照下面的方法來配置?yii\db\Connection?組件:
[
'class' => 'yii\db\Connection',
// 主庫的配置
'dsn' => 'dsn for master server',
'username' => 'master',
'password' => '',
// 從庫的通用配置
'slaveConfig' => [
'username' => 'slave',
'password' => '',
'attributes' => [
// 使用一個更小的連接超時
PDO::ATTR_TIMEOUT => 10,
],
],
// 從庫的配置列表
'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'],
],
]
上述的配置指定了一主多從的設置。 這些從庫其中之一將被建立起連接并執行讀操作,而主庫將被用來執行寫操作。 這樣的讀寫分離將通過上述配置自動地完成。比如,
// 使用上述配置來創建一個 Connection 實例
Yii::$app->db = Yii::createObject($config);
// 在從庫中的一個上執行語句
$rows = Yii::$app->db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
// 在主庫上執行語句
Yii::$app->db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
信息:?通過調用?yii\db\Command::execute()?來執行的語句都被視為寫操作, 而其他所有通過調用?yii\db\Command?中任一 "query" 方法來執行的語句都被視為讀操作。 你可以通過?Yii::$app->db->slave?來獲取當前有效的從庫連接。
Connection?組件支持從庫間的負載均衡和失效備援, 當第一次執行讀操作時,Connection?組件將隨機地挑選出一個從庫并嘗試與之建立連接, 如果這個從庫被發現為”掛掉的“,將嘗試連接另一個從庫。 如果沒有一個從庫是連接得上的,那么將試著連接到主庫上。 通過配置?server status cache, 一個“掛掉的”服務器將會被記住,因此,在一個 yii\db\Connection::serverRetryInterval 內將不再試著連接該服務器。
信息:?在上面的配置中, 每個從庫都共同地指定了 10 秒的連接超時時間,這意味著,如果一個從庫在 10 秒內不能被連接上,它將被視為“掛掉的”。 你可以根據你的實際環境來調整該參數。
你也可以配置多主多從。例如,
[
'class' => 'yii\db\Connection',
// 主庫通用的配置
'masterConfig' => [
'username' => 'master',
'password' => '',
'attributes' => [
// use a smaller connection timeout
PDO::ATTR_TIMEOUT => 10,
],
],
// 主庫配置列表
'masters' => [
['dsn' => 'dsn for master server 1'],
['dsn' => 'dsn for master server 2'],
],
// 從庫的通用配置
'slaveConfig' => [
'username' => 'slave',
'password' => '',
'attributes' => [
// use a smaller connection timeout
PDO::ATTR_TIMEOUT => 10,
],
],
// 從庫配置列表
'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'],
],
]
上述配置指定了兩個主庫和兩個從庫。?Connection?組件在主庫之間,也支持如從庫間般的負載均衡和失效備援。 唯一的差別是,如果沒有主庫可用,將拋出一個異常。
注意:?當你使用?masters?屬性來配置一個或多個主庫時, 所有其他指定數據庫連接的屬性 (例如?dsn,?username,?password) 與?Connection?對象本身將被忽略。
默認情況下,事務使用主庫連接, 一個事務內,所有的數據庫操作都將使用主庫連接,例如,
$db = Yii::$app->db;
// 在主庫上啟動事務
$transaction = $db->beginTransaction();
try {
// 兩個語句都是在主庫上執行的
$rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
$db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
$transaction->commit();
} catch(\Exception $e) {
$transaction->rollBack();
throw $e;
} catch(\Throwable $e) {
$transaction->rollBack();
throw $e;
}
如果你想在從庫上開啟事務,你應該明確地像下面這樣做:
$transaction = Yii::$app->db->slave->beginTransaction();
有時,你或許想要強制使用主庫來執行讀查詢。 這可以通過?useMaster()?方法來完成:
$rows = Yii::$app->db->useMaster(function($db){
return $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
});
你也可以明確地將?Yii::$app->db->enableSlaves?設置為 false 來將所有的讀操作指向主庫連接。
操縱數據庫模式(Working with Database Schema)
Yii DAO 提供了一套完整的方法來讓你操縱數據庫模式, 如創建表、從表中刪除一列,等等。這些方法羅列如下:
這些方法可以如下地使用:
// CREATE TABLE
Yii::$app->db->createCommand()->createTable('post', [
'id' => 'pk',
'title' => 'string',
'text' => 'text',
]);
上面的數組描述要創建的列的名稱和類型。 對于列的類型, Yii 提供了一套抽象數據類型來允許你定義出數據庫無關的模式。 這些將根據表所在數據庫的種類,被轉換為特定的類型定義。 請參考?createTable()-method 的 API 文檔來獲取更多信息。
除了改變數據庫模式, 你也可以通過 DB Connection 的?getTableSchema()?方法來檢索某張表的定義信息。例如,
$table = Yii::$app->db->getTableSchema('post');
該方法返回一個?yii\db\TableSchema?對象, 它包含了表中的列、主鍵、外鍵,等等的信息。 所有的這些信息主要被?query builder?和?active record?所使用,來幫助你寫出數據庫無關的代碼。
總結
以上是生活随笔為你收集整理的yii2 mysql in_yii2 mysql数据库读写分离配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 协议错误,在linux客户机
- 下一篇: java.lang.IllegalArg