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