數(shù)據(jù)庫讀寫分離php 數(shù)據(jù)庫讀寫分離是什么意思

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

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

我們擁有十余年網(wǎng)頁設(shè)計(jì)和網(wǎng)站建設(shè)經(jīng)驗(yàn),從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設(shè)計(jì)師為您提供的解決方案。為企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、成都手機(jī)網(wǎng)站制作、HTML5、等業(yè)務(wù)。無論您有什么樣的網(wǎng)站設(shè)計(jì)或者設(shè)計(jì)方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計(jì)服務(wù)并滿足您的需求。

原理:主服務(wù)器(Master)負(fù)責(zé)網(wǎng)站NonQuery操作,從服務(wù)器負(fù)責(zé)Query操作,用戶可以根據(jù)網(wǎng)站功能模特性塊固定訪問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ù)庫。

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

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

windows安裝mysql就不談了,一般地球人都應(yīng)該會(huì)。鄙人稍微說一下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)限有問題,mysql會(huì)認(rèn)為該文件有危險(xiǎn)不會(huì)執(zhí)行。但是mysql還會(huì)啟動(dòng)成功,但如果下面配置從服務(wù)器參數(shù)修改my.cnf文件的時(shí)候,你會(huì)發(fā)現(xiàn)文件改過了,但是重啟服務(wù)時(shí),修改過后的配置沒有執(zhí)行,而且您 list一下mysql的文件夾下會(huì)發(fā)現(xiàn)很多.my.cnf.swp等中間文件。這都是因?yàn)镸ySQL啟動(dòng)時(shí)沒有讀取my.cnf的原因。這時(shí)只要將my.cnf的文件權(quán)限改成my_new.cnf的權(quán)限一樣就Ok,命令:chmod 644 my.cnf就Ok

(4)Ubuntu中修改文檔內(nè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ù)器可以通過遠(yuǎn)程訪問Master,通過該用戶讀取二進(jìn)制日志,實(shí)現(xiàn)數(shù)據(jù)同步。

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

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

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

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

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

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

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

說明:

2、編輯database.php

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

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

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

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

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

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

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

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

jqueryURL

API控制器apdpic方法

說明:

也可以先傳到后臺(tái)服務(wù)器然后使用(php)ftp上傳,或者是通過curl上傳到附件服務(wù)器,感覺那樣畢竟麻煩,直接設(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è)是主庫。

database.php

愿大家在新的一年心想事成,萬事如意?。?!

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

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

當(dāng)前文章:數(shù)據(jù)庫讀寫分離php 數(shù)據(jù)庫讀寫分離是什么意思
分享URL:http://muchs.cn/article20/dophhjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)建站App開發(fā)、定制網(wǎng)站、定制開發(fā)、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管