分布式數(shù)據(jù)庫(kù)

ThinkPHP內(nèi)置了分布式數(shù)據(jù)庫(kù)的支持,包括主從式數(shù)據(jù)庫(kù)的讀寫(xiě)分離,但是分布式數(shù)據(jù)庫(kù)必須是相同的數(shù)據(jù)庫(kù)類(lèi)型。

配置database.deploy 為1 可以采用分布式數(shù)據(jù)庫(kù)支持。如果采用分布式數(shù)據(jù)庫(kù),定義數(shù)據(jù)庫(kù)配置信息的方式如下:

//分布式數(shù)據(jù)庫(kù)配置定義return [// 啟用分布式數(shù)據(jù)庫(kù)'deploy'    =>  1,// 數(shù)據(jù)庫(kù)類(lèi)型'type'        => 'mysql',// 服務(wù)器地址'hostname'    => '192.168.1.1,192.168.1.2',// 數(shù)據(jù)庫(kù)名'database'    => 'demo',// 數(shù)據(jù)庫(kù)用戶(hù)名'username'    => 'root',// 數(shù)據(jù)庫(kù)密碼'password'    => '',// 數(shù)據(jù)庫(kù)連接端口'hostport'    => '',
]

連接的數(shù)據(jù)庫(kù)個(gè)數(shù)取決于hostname定義的數(shù)量,所以即使是兩個(gè)相同的IP也需要重復(fù)定義,但是其他的參數(shù)如果存在相同的可以不用重復(fù)定義,例如:

'hostport'=>'3306,3306'

'hostport'=>'3306'

等效。

'username'=>'user1', 
'password'=>'pwd1',

'username'=>'user1,user1', 
'password'=>'pwd1,pwd1',

等效。

還可以設(shè)置分布式數(shù)據(jù)庫(kù)的讀寫(xiě)是否分離,默認(rèn)的情況下讀寫(xiě)不分離,也就是每臺(tái)服務(wù)器都可以進(jìn)行讀寫(xiě)操作,對(duì)于主從式數(shù)據(jù)庫(kù)而言,需要設(shè)置讀寫(xiě)分離,通過(guò)下面的設(shè)置就可以:

    'rw_separate' => true,

在讀寫(xiě)分離的情況下,默認(rèn)第一個(gè)數(shù)據(jù)庫(kù)配置是主服務(wù)器的配置信息,負(fù)責(zé)寫(xiě)入數(shù)據(jù),如果設(shè)置了master_num參數(shù),則可以支持多個(gè)主服務(wù)器寫(xiě)入。其它的都是從數(shù)據(jù)庫(kù)的配置信息,負(fù)責(zé)讀取數(shù)據(jù),數(shù)量不限制。每次連接從服務(wù)器并且進(jìn)行讀取操作的時(shí)候,系統(tǒng)會(huì)隨機(jī)進(jìn)行在從服務(wù)器中選擇。

還可以設(shè)置slave_no 指定某個(gè)服務(wù)器進(jìn)行讀操作。

如果從數(shù)據(jù)庫(kù)連接錯(cuò)誤,會(huì)自動(dòng)切換到主數(shù)據(jù)庫(kù)連接。

調(diào)用模型的CURD操作的話,系統(tǒng)會(huì)自動(dòng)判斷當(dāng)前執(zhí)行的方法的讀操作還是寫(xiě)操作,如果你用的是原生SQL,那么需要注意系統(tǒng)的默認(rèn)規(guī)則: 寫(xiě)操作必須用模型的execute方法,讀操作必須用模型的query方法,否則會(huì)發(fā)生主從讀寫(xiě)錯(cuò)亂的情況。

注意:主從數(shù)據(jù)庫(kù)的數(shù)據(jù)同步工作不在框架實(shí)現(xiàn),需要數(shù)據(jù)庫(kù)考慮自身的同步或者復(fù)制機(jī)制。

文檔最后更新時(shí)間:2022-05-31 09:22:06

文檔
目錄

深色
模式

切換
寬度