php數(shù)據(jù)庫(kù)讀寫分離狀態(tài) 數(shù)據(jù)庫(kù)讀寫分離是什么意思

php手把手教你做網(wǎng)站(二十九)thinkphp6部署多個(gè)數(shù)據(jù)庫(kù)

前邊介紹了負(fù)載均衡,mysql同步,接下來(lái)介紹tp6分布式部署多個(gè)數(shù)據(jù)庫(kù),實(shí)現(xiàn)讀寫分離。

南寧ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

tp6的分布式部署讀和寫仍然是一個(gè)系統(tǒng),這里我們分開操作,給用戶展示的就是從數(shù)據(jù)庫(kù),后端添加文章就是主庫(kù),然后同步到從庫(kù)。

1、配置數(shù)據(jù)庫(kù)鏈接參數(shù)

目標(biāo):實(shí)現(xiàn)隨機(jī)使用數(shù)據(jù)庫(kù)展示信息,只是讀操作。

測(cè)試:前臺(tái)可以讀取表中內(nèi)容(存放的不一致),查看是否是隨機(jī)顯示的。

打開.env文件進(jìn)行編輯

說(shuō)明:

2、編輯database.php

找到deploy設(shè)置為1分布式部署,下邊不要改,都是讀,寫入的也就是后端的我們單獨(dú)建站連接主庫(kù)。

配置完成,tp6使用的是mt_rand取隨機(jī)數(shù)判斷使用哪個(gè)數(shù)據(jù)庫(kù)。

3、數(shù)據(jù)庫(kù)交互寫操作

比如瀏覽量沒(méi)必要每次都去更新數(shù)據(jù)庫(kù),可以先使用redis緩存,存夠1000的整數(shù)倍,再去更新數(shù)據(jù)庫(kù)。

4、后臺(tái)獨(dú)立,也就是寫

可以前后端分離,單獨(dú)做一個(gè)網(wǎng)站(沒(méi)有前端)使用ip訪問(wèn)或者獨(dú)立的域名連接后臺(tái)。

5、上傳附件(jquery ajax跨域上傳)

使用了nginx負(fù)載均衡,肯定是多個(gè)一樣的網(wǎng)站,如果圖片存放到一個(gè)站,別的就不能訪問(wèn)了,可以單獨(dú)設(shè)置一個(gè)附件(壓縮包,圖片等)服務(wù)器,可以使用二級(jí)域名連接,這就要求我們上傳附件的時(shí)候,是上傳到附件服務(wù)器。

jqueryURL

API控制器apdpic方法

說(shuō)明:

也可以先傳到后臺(tái)服務(wù)器然后使用(php)ftp上傳,或者是通過(guò)curl上傳到附件服務(wù)器,感覺(jué)那樣畢竟麻煩,直接設(shè)置跨域會(huì)比較簡(jiǎn)單。

也測(cè)試了使用jsonp跨域,但是不能上傳附件。

6、thinkphp6實(shí)現(xiàn)讀寫分離(在一個(gè)站點(diǎn))

我個(gè)人是不喜歡這樣的,負(fù)載均衡應(yīng)該是均衡地讀,也就是前臺(tái)單獨(dú)一個(gè)站點(diǎn),后端的寫是另一個(gè)獨(dú)立的站點(diǎn),看個(gè)人喜好吧。

獨(dú)立后臺(tái)的優(yōu)點(diǎn):可以提升安全性,因?yàn)槲覀兊暮笈_(tái)網(wǎng)址是不公開的,避免用戶猜測(cè)一些后臺(tái)的信息。

.env配置按照1所述編輯,默認(rèn)第一個(gè)是主庫(kù)。

database.php

愿大家在新的一年心想事成,萬(wàn)事如意?。?!

Zend Framework中如何實(shí)現(xiàn)MySQL的讀寫分離 - PHP框架開發(fā)

繼承Zend_Db_Table_Abstract,新建一個(gè)類,添加2個(gè)方法,getReaderDb()和getWriterDb()。

分布式系統(tǒng)中應(yīng)用程序怎么實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫分離

本文實(shí)例分析了Yii實(shí)現(xiàn)MySQL多數(shù)據(jù)庫(kù)和讀寫分離的方法。分享給大家供大家參考。具體分析如下:Yii Framework是一個(gè)基于組件、用于開發(fā)大型 Web 應(yīng)用的高性能 PHP 框架。Yii提供了今日Web 2.0應(yīng)用開發(fā)所需要的幾乎一切功能,也是最強(qiáng)大的框架之一,下文我們來(lái)介紹Yii實(shí)現(xiàn)MySQL多庫(kù)和讀寫分離的方法前段時(shí)間為SNS產(chǎn)品做了架構(gòu)設(shè)計(jì),在程序框架方面做了不少相關(guān)的壓力測(cè)試,最終選定了YiiFramework,至于為什么沒(méi)選用公司內(nèi)部的 PHP框架,其實(shí)理由很充分,公司的框架雖然是"前輩"們辛苦的積累,但畢竟不夠成熟,沒(méi)有大型項(xiàng)目的歷練,猶如一個(gè)涉世未深的年輕小伙。Yii作為一個(gè) 頗有名氣開源產(chǎn)品,必定有很多人在使用,意味著有一批人在維護(hù),而且在這之前,我也使用Yii開發(fā)過(guò)大型項(xiàng)目,Yii的設(shè)計(jì)模式和它的易擴(kuò)展特性足以堪當(dāng)重任。SNS同一般的社交產(chǎn)品不同的就是它最終要承受大并發(fā)和大數(shù)據(jù)量的考驗(yàn),架構(gòu)設(shè)計(jì)時(shí)就要考慮這些問(wèn)題, web分布式、負(fù)載均衡、分布式文件存儲(chǔ)、MySQL分布式或讀寫分離、NoSQL以及各種緩存,這些都是必不可少的應(yīng)用方案,本文所講的就是MySQL 分庫(kù)和主從讀寫分離在Yii的配置和使用。Yii默認(rèn)是不支持讀寫分離的,我們可以利用Yii的事件驅(qū)動(dòng)模式來(lái)實(shí)現(xiàn)MySQL的讀寫分離。Yii提供了一個(gè)強(qiáng)大的CActiveRecord數(shù)據(jù)庫(kù)操作類,通過(guò)重寫getDbConnection方法來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的切換,然后通過(guò)事件 beforeSave、beforeDelete、beforeFind 來(lái)實(shí)現(xiàn)讀寫服務(wù)器的切換,還需要兩個(gè)配置文件dbconfig和modelconfig分別配置數(shù)據(jù)庫(kù)主從服務(wù)器和model所對(duì)應(yīng)的數(shù)據(jù)庫(kù)名稱,附代碼DBConfig.php文件如下:復(fù)制代碼 代碼如下:?phpreturn array('passport' = array('write' = array('class' = 'CDbConnection','connectionString' = 'mysql:host=10.1.39.2;dbname=db1′,'emulatePrepare' = true,//'enableParamLogging' = true,'enableProfiling' = true,'username' = 'root','password' = '','charset' = 'utf8′,'schemaCachingDuration'=3600,),'read' = array(array('class' = 'CDbConnection','connectionString' = 'mysql:host=10.1.39.3;dbname=db1,'emulatePrepare' = true,//'enableParamLogging' = true,'enableProfiling' = true,'username' = 'root','password' = '','charset' = 'utf8′,'schemaCachingDuration'=3600,),array('class' = 'CDbConnection','connectionString' = 'mysql:host=10.1.39.4;dbname=db3′,'emulatePrepare' = true,//'enableParamLogging' = true,'enableProfiling' = true,'username' = 'root','password' = '','charset' = 'utf8′,'schemaCachingDuration'=3600,),),),);ModelConfig.php如下:復(fù)制代碼 代碼如下:?phpreturn array(//key為數(shù)據(jù)庫(kù)名稱,value為Model'passport' = array('User','Post'),'microblog' = array('…'),);?ActiveRecord.php如下:復(fù)制代碼 代碼如下:/*** 基于CActiveRecord類的封裝,實(shí)現(xiàn)多庫(kù)和主從讀寫分離* 所有Model都必須繼承些類.**/class ActiveRecord extends CActiveRecord{//model配置public $modelConfig = '';//數(shù)據(jù)庫(kù)配置public $dbConfig = '';//定義一個(gè)多數(shù)據(jù)庫(kù)集合static $dataBase = array();//當(dāng)前數(shù)據(jù)庫(kù)名稱public $dbName = '';//定義庫(kù)類型(讀或?qū)?public $dbType = 'read'; //'read' or 'write'/*** 在原有基礎(chǔ)上添加了一個(gè)dbname參數(shù)* @param string $scenario Model的應(yīng)用場(chǎng)景* @param string $dbname 數(shù)據(jù)庫(kù)名稱*/public function __construct($scenario='insert', $dbname = ''){if (!empty($dbname))$this-dbName = $dbname;parent::__construct($scenario);}/*** 重寫父類的getDbConnection方法* 多庫(kù)和主從都在這里切換*/public function getDbConnection(){//如果指定的數(shù)據(jù)庫(kù)對(duì)象存在則直接返回if (self::$dataBase[$this-dbName]!==null)return self::$dataBase[$this-dbName];if ($this-dbName == 'db'){self::$dataBase[$this-dbName] = Yii::app()-getDb();}else{$this-changeConn($this-dbType);}if(self::$dataBase[$this-dbName] instanceof CDbConnection){self::$dataBase[$this-dbName]-setActive(true);return self::$dataBase[$this-dbName];} elsethrow new CDbException(Yii::t('yii','Model requires a "db" CDbConnection application component.'));}/*** 獲取配置文件* @param unknown_type $type* @param unknown_type $key*/private function getConfig($type="modelConfig",$key="){$config = Yii::app()-params[$type];if($key)$config = $config[$key];return $config;}/*** 獲取數(shù)據(jù)庫(kù)名稱*/private function getDbName(){if($this-dbName)return $this-dbName;$modelName = get_class($this-model());$this-modelConfig = $this-getConfig('modelConfig');//獲取model所對(duì)應(yīng)的數(shù)據(jù)庫(kù)名if($this-modelConfig)foreach($this-modelConfig as $key=$val){if(in_array($modelName,$val)){$dbName = $key;break;}}return $dbName;}/*** 切換數(shù)據(jù)庫(kù)連接* @param unknown_type $dbtype*/protected function changeConn($dbtype = 'read'){if($this-dbType == $dbtype self::$dataBase[$this-dbName] !== null)return self::$dataBase[$this-dbName];$this-dbName = $this-getDbName();if(Yii::app()-getComponent($this-dbName.'_'.$dbtype) !== null){self::$dataBase[$this-dbName] = Yii::app()-getComponent($this-dbName.'_'.$dbtype);return self::$dataBase[$this-dbName];}$this-dbConfig = $this-getConfig('dbConfig',$this-dbName);//跟據(jù)類型取對(duì)應(yīng)的配置(從庫(kù)是隨機(jī)值)if($dbtype == 'write'){$config = $this-dbConfig[$dbtype];}else{$slavekey = array_rand($this-dbConfig[$dbtype]);$config = $this-dbConfig[$dbtype][$slavekey];}//將數(shù)據(jù)庫(kù)配置加到component中if($dbComponent = Yii::createComponent($config)){Yii::app()-setComponent($this-dbName.'_'.$dbtype,$dbComponent);self::$dataBase[$this-dbName] = Yii::app()-getComponent($this-dbName.'_'.$dbtype);$this-dbType = $dbtype;return self::$dataBase[$this-dbName];} elsethrow new CDbException(Yii::t('yii','Model requires a "changeConn" CDbConnection application component.'));}/*** 保存數(shù)據(jù)前選擇 主 數(shù)據(jù)庫(kù)*/protected function beforeSave(){parent::beforeSave();$this-changeConn('write');return true;}/*** 刪除數(shù)據(jù)前選擇 主 數(shù)據(jù)庫(kù)*/protected function beforeDelete(){parent::beforeDelete();$this-changeConn('write');return true;}/*** 讀取數(shù)據(jù)選擇 從 數(shù)據(jù)庫(kù)*/protected function beforeFind(){parent::beforeFind();$this-changeConn('read');return true;}/*** 獲取master庫(kù)對(duì)象*/public function dbWrite(){return $this-changeConn('write');}/*** 獲取slave庫(kù)對(duì)象*/public function dbRead(){return $this-changeConn('read');}}這是我寫好的類,放在components文件夾里,然后所有的Model都繼承ActiveRecord類就可以實(shí)現(xiàn)多庫(kù)和主從讀寫分離了,至于如何支持原生的SQL也同時(shí)使用讀寫分離,此類都已經(jīng)實(shí)現(xiàn)。希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。

discuz3.1 怎么判斷數(shù)據(jù)庫(kù)讀寫分離成功

方法/步驟

1

第一步: MySQL主從設(shè)置之主服務(wù)器A設(shè)置

1. 找到主服務(wù)器A的MySQL的配置文件my.ini

2

2. 打開my.ini,在[mysqld]下面添加以下參數(shù)

3

3. 在主服務(wù)器A中添加一個(gè)用于主從復(fù)制的帳號(hào):

登陸mysql命令行,執(zhí)行

GRANT REPLICATION SLAVE ON *.* TO ‘帳號(hào)’@’從服務(wù)器IP’ IDENTIFIED BY ‘密碼';

4

4. 重啟MySQL ,讓配置生效

5

5. 可以通過(guò)show master status\G;查看主從數(shù)據(jù)庫(kù)是否配置成功。

6

第二步: MySQL主從設(shè)置之主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)數(shù)據(jù)一致。

1. 關(guān)閉論壇訪問(wèn),停止更新數(shù)據(jù)

7

2. 在主服務(wù)器中加入只讀鎖

8

3. 導(dǎo)出數(shù)據(jù)庫(kù)

通過(guò)命令導(dǎo)出數(shù)據(jù)庫(kù) mysqldump -u root -p 數(shù)據(jù)庫(kù)名 導(dǎo)出來(lái)的位置

9

4. 將主服務(wù)器的數(shù)據(jù)庫(kù)導(dǎo)入到從服務(wù)器的數(shù)據(jù)庫(kù)

10

5. 將主數(shù)據(jù)庫(kù)服務(wù)器解除只讀鎖

11

6. 開啟論壇訪問(wèn)。

12

第三步:MySQL主從設(shè)置之從服務(wù)器B設(shè)置

1. 找到從服務(wù)器mysql配置文件my.cnf (主服務(wù)器是windows,從服務(wù)器是Linux。所以配置文件的后綴不一致)

13

2. 打開my.cnf,在[mysqld]下面添加以下參數(shù)

14

3. 重啟從數(shù)據(jù)庫(kù)

15

4、登錄從庫(kù)的MySQL命令行,執(zhí)行:

change

master to master_host=’主服務(wù)器IP’, master_user=’主服務(wù)器賬號(hào)’,

master_password=’主服務(wù)器密碼’, master_log_file=’file的值’,

master_log_pos=position的值;

//設(shè)置連接信息,file及position的值是之前記錄下來(lái)(在主服務(wù)器上通過(guò)show master status\G;),position的值沒(méi)有單引號(hào),其他的值要單引號(hào)

16

5. 啟動(dòng)從庫(kù)連接

start slave; //啟動(dòng)從庫(kù)連接

17

6、查看從庫(kù)狀態(tài):

show slave status\G; //查看連接情況

18

7、編輯從MYSQL服務(wù)器的MySQL配置文件my.cnf,在[mysqld]下面添加以下參數(shù):

19

8. 測(cè)試,可以在主服務(wù)器上添加數(shù)據(jù)或者刪除數(shù)據(jù),從服務(wù)器會(huì)對(duì)應(yīng)更新過(guò)來(lái)。

20

第四步: 讀寫分離

打開discuz x3.1的配置文件config/config_global.php

laravel數(shù)據(jù)庫(kù)讀寫分離了,如何指定從寫的數(shù)據(jù)庫(kù)讀取數(shù)據(jù)?

\vendor\laravel\framework\src\Illuminate\Database\Connection.php

public function select($query, $bindings = [], $useReadPdo = true){}

$useReadPdo 執(zhí)行查詢語(yǔ)句時(shí)指定為false即可

mysql 如何實(shí)現(xiàn)讀寫分離,用mysql-proxy 或者直接用php連接兩個(gè)數(shù)據(jù)庫(kù)?

Mysql主從配置,實(shí)現(xiàn)讀寫分離

原理:主服務(wù)器(Master)負(fù)責(zé)網(wǎng)站NonQuery操作,從服務(wù)器負(fù)責(zé)Query操作,用戶可以根據(jù)網(wǎng)站功能模特性塊固定訪問(wèn)Slave服務(wù)器,或者自己寫個(gè)池或隊(duì)列,自由為請(qǐng)求分配從服務(wù)器連接。主從服務(wù)器利用MySQL的二進(jìn)制日志文件,實(shí)現(xiàn)數(shù)據(jù)同步。二進(jìn)制日志由主服務(wù)器產(chǎn)生,從服務(wù)器響應(yīng)獲取同步數(shù)據(jù)庫(kù)。

具體實(shí)現(xiàn):

1、在主從服務(wù)器上都裝上MySQL數(shù)據(jù)庫(kù),windows系統(tǒng)鄙人安裝的是mysql_5.5.25.msi版本,Ubuntu安裝的是mysql-5.6.22-linux-glibc2.5-i686.tar

windows安裝mysql就不談了,一般地球人都應(yīng)該會(huì)。鄙人稍微說(shuō)一下Ubuntu的MySQL安裝,我建議不要在線下載安裝,還是離線安裝的好。大家可以參考 這位不知道大哥還是姐妹,寫的挺好按照這個(gè)就能裝上。在安裝的時(shí)候可能會(huì)出現(xiàn)幾種現(xiàn)象,大家可以參考解決一下:

(1)如果您不是使用root用戶登錄,建議 su - root 切換到Root用戶安裝,那就不用老是 sudo 了。

(2)存放解壓的mysql 文件夾,文件夾名字最好改成mysql

(3)在./support-files/mysql.server start 啟動(dòng)MySQL的時(shí)候,可能會(huì)出現(xiàn)一個(gè)警告,中文意思是啟動(dòng)服務(wù)運(yùn)行讀文件時(shí),忽略了my.cnf文件,那是因?yàn)閙y.cnf的文件權(quán)限有問(wèn)題,mysql會(huì)認(rèn)為該文件有危險(xiǎn)不會(huì)執(zhí)行。但是mysql還會(huì)啟動(dòng)成功,但如果下面配置從服務(wù)器參數(shù)修改my.cnf文件的時(shí)候,你會(huì)發(fā)現(xiàn)文件改過(guò)了,但是重啟服務(wù)時(shí),修改過(guò)后的配置沒(méi)有執(zhí)行,而且您 list一下mysql的文件夾下會(huì)發(fā)現(xiàn)很多.my.cnf.swp等中間文件。這都是因?yàn)镸ySQL啟動(dòng)時(shí)沒(méi)有讀取my.cnf的原因。這時(shí)只要將my.cnf的文件權(quán)限改成my_new.cnf的權(quán)限一樣就Ok,命令:chmod 644 my.cnf就Ok

(4)Ubuntu中修改文檔內(nèi)容沒(méi)有Vim,最好把Vim 裝上,apt-get install vim,不然估計(jì)會(huì)抓狂。

這時(shí)候我相信MySQL應(yīng)該安裝上去了。

2、配置Master主服務(wù)器

(1)在Master MySQL上創(chuàng)建一個(gè)用戶‘repl’,并允許其他Slave服務(wù)器可以通過(guò)遠(yuǎn)程訪問(wèn)Master,通過(guò)該用戶讀取二進(jìn)制日志,實(shí)現(xiàn)數(shù)據(jù)同步。

分享文章:php數(shù)據(jù)庫(kù)讀寫分離狀態(tài) 數(shù)據(jù)庫(kù)讀寫分離是什么意思
網(wǎng)站路徑:http://www.muchs.cn/article4/doodeoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、靜態(tài)網(wǎng)站、小程序開發(fā)、虛擬主機(jī)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)