分布式數(shù)據(jù)庫
ThinkPHP內置了分布式數(shù)據(jù)庫的支持,包括主從式數(shù)據(jù)庫的讀寫分離,但是分布式數(shù)據(jù)庫必須是相同的數(shù)據(jù)庫類型。
配置database.deploy
為1 可以采用分布式數(shù)據(jù)庫支持。如果采用分布式數(shù)據(jù)庫,定義數(shù)據(jù)庫配置信息的方式如下:
//分布式數(shù)據(jù)庫配置定義return [// 啟用分布式數(shù)據(jù)庫'deploy' => 1,// 數(shù)據(jù)庫類型'type' => 'mysql',// 服務器地址'hostname' => '192.168.1.1,192.168.1.2',// 數(shù)據(jù)庫名'database' => 'demo',// 數(shù)據(jù)庫用戶名'username' => 'root',// 數(shù)據(jù)庫密碼'password' => '',// 數(shù)據(jù)庫連接端口'hostport' => '', ]
連接的數(shù)據(jù)庫個數(shù)取決于hostname
定義的數(shù)量,所以即使是兩個相同的IP也需要重復定義,但是其他的參數(shù)如果存在相同的可以不用重復定義,例如:
'hostport'=>'3306,3306'
和
'hostport'=>'3306'
等效。
'username'=>'user1', 'password'=>'pwd1',
和
'username'=>'user1,user1', 'password'=>'pwd1,pwd1',
等效。
還可以設置分布式數(shù)據(jù)庫的讀寫是否分離,默認的情況下讀寫不分離,也就是每臺服務器都可以進行讀寫操作,對于主從式數(shù)據(jù)庫而言,需要設置讀寫分離,通過下面的設置就可以:
'rw_separate' => true,
在讀寫分離的情況下,默認第一個數(shù)據(jù)庫配置是主服務器的配置信息,負責寫入數(shù)據(jù),如果設置了master_num
參數(shù),則可以支持多個主服務器寫入。其它的都是從數(shù)據(jù)庫的配置信息,負責讀取數(shù)據(jù),數(shù)量不限制。每次連接從服務器并且進行讀取操作的時候,系統(tǒng)會隨機進行在從服務器中選擇。
還可以設置slave_no
指定某個服務器進行讀操作。
如果從數(shù)據(jù)庫連接錯誤,會自動切換到主數(shù)據(jù)庫連接。
調用模型的CURD操作的話,系統(tǒng)會自動判斷當前執(zhí)行的方法的讀操作還是寫操作,如果你用的是原生SQL,那么需要注意系統(tǒng)的默認規(guī)則: 寫操作必須用模型的execute方法,讀操作必須用模型的query方法,否則會發(fā)生主從讀寫錯亂的情況。
注意:主從數(shù)據(jù)庫的數(shù)據(jù)同步工作不在框架實現(xiàn),需要數(shù)據(jù)庫考慮自身的同步或者復制機制。