前邊介紹了負載均衡,mysql同步,接下來介紹tp6分布式部署多個數據庫,實現讀寫分離。
南寧ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
tp6的分布式部署讀和寫仍然是一個系統,這里我們分開操作,給用戶展示的就是從數據庫,后端添加文章就是主庫,然后同步到從庫。
1、配置數據庫鏈接參數
目標:實現隨機使用數據庫展示信息,只是讀操作。
測試:前臺可以讀取表中內容(存放的不一致),查看是否是隨機顯示的。
打開.env文件進行編輯
說明:
2、編輯database.php
找到deploy設置為1分布式部署,下邊不要改,都是讀,寫入的也就是后端的我們單獨建站連接主庫。
配置完成,tp6使用的是mt_rand取隨機數判斷使用哪個數據庫。
3、數據庫交互寫操作
比如瀏覽量沒必要每次都去更新數據庫,可以先使用redis緩存,存夠1000的整數倍,再去更新數據庫。
4、后臺獨立,也就是寫
可以前后端分離,單獨做一個網站(沒有前端)使用ip訪問或者獨立的域名連接后臺。
5、上傳附件(jquery ajax跨域上傳)
使用了nginx負載均衡,肯定是多個一樣的網站,如果圖片存放到一個站,別的就不能訪問了,可以單獨設置一個附件(壓縮包,圖片等)服務器,可以使用二級域名連接,這就要求我們上傳附件的時候,是上傳到附件服務器。
jqueryURL
API控制器apdpic方法
說明:
也可以先傳到后臺服務器然后使用(php)ftp上傳,或者是通過curl上傳到附件服務器,感覺那樣畢竟麻煩,直接設置跨域會比較簡單。
也測試了使用jsonp跨域,但是不能上傳附件。
6、thinkphp6實現讀寫分離(在一個站點)
我個人是不喜歡這樣的,負載均衡應該是均衡地讀,也就是前臺單獨一個站點,后端的寫是另一個獨立的站點,看個人喜好吧。
獨立后臺的優點:可以提升安全性,因為我們的后臺網址是不公開的,避免用戶猜測一些后臺的信息。
.env配置按照1所述編輯,默認第一個是主庫。
database.php
愿大家在新的一年心想事成,萬事如意!!!
繼承Zend_Db_Table_Abstract,新建一個類,添加2個方法,getReaderDb()和getWriterDb()。
本文實例分析了Yii實現MySQL多數據庫和讀寫分離的方法。分享給大家供大家參考。具體分析如下:Yii Framework是一個基于組件、用于開發大型 Web 應用的高性能 PHP 框架。Yii提供了今日Web 2.0應用開發所需要的幾乎一切功能,也是最強大的框架之一,下文我們來介紹Yii實現MySQL多庫和讀寫分離的方法前段時間為SNS產品做了架構設計,在程序框架方面做了不少相關的壓力測試,最終選定了YiiFramework,至于為什么沒選用公司內部的 PHP框架,其實理由很充分,公司的框架雖然是"前輩"們辛苦的積累,但畢竟不夠成熟,沒有大型項目的歷練,猶如一個涉世未深的年輕小伙。Yii作為一個 頗有名氣開源產品,必定有很多人在使用,意味著有一批人在維護,而且在這之前,我也使用Yii開發過大型項目,Yii的設計模式和它的易擴展特性足以堪當重任。SNS同一般的社交產品不同的就是它最終要承受大并發和大數據量的考驗,架構設計時就要考慮這些問題, web分布式、負載均衡、分布式文件存儲、MySQL分布式或讀寫分離、NoSQL以及各種緩存,這些都是必不可少的應用方案,本文所講的就是MySQL 分庫和主從讀寫分離在Yii的配置和使用。Yii默認是不支持讀寫分離的,我們可以利用Yii的事件驅動模式來實現MySQL的讀寫分離。Yii提供了一個強大的CActiveRecord數據庫操作類,通過重寫getDbConnection方法來實現數據庫的切換,然后通過事件 beforeSave、beforeDelete、beforeFind 來實現讀寫服務器的切換,還需要兩個配置文件dbconfig和modelconfig分別配置數據庫主從服務器和model所對應的數據庫名稱,附代碼DBConfig.php文件如下:復制代碼 代碼如下:?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如下:復制代碼 代碼如下:?phpreturn array(//key為數據庫名稱,value為Model'passport' = array('User','Post'),'microblog' = array('…'),);?ActiveRecord.php如下:復制代碼 代碼如下:/*** 基于CActiveRecord類的封裝,實現多庫和主從讀寫分離* 所有Model都必須繼承些類.**/class ActiveRecord extends CActiveRecord{//model配置public $modelConfig = '';//數據庫配置public $dbConfig = '';//定義一個多數據庫集合static $dataBase = array();//當前數據庫名稱public $dbName = '';//定義庫類型(讀或寫)public $dbType = 'read'; //'read' or 'write'/*** 在原有基礎上添加了一個dbname參數* @param string $scenario Model的應用場景* @param string $dbname 數據庫名稱*/public function __construct($scenario='insert', $dbname = ''){if (!empty($dbname))$this-dbName = $dbname;parent::__construct($scenario);}/*** 重寫父類的getDbConnection方法* 多庫和主從都在這里切換*/public function getDbConnection(){//如果指定的數據庫對象存在則直接返回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;}/*** 獲取數據庫名稱*/private function getDbName(){if($this-dbName)return $this-dbName;$modelName = get_class($this-model());$this-modelConfig = $this-getConfig('modelConfig');//獲取model所對應的數據庫名if($this-modelConfig)foreach($this-modelConfig as $key=$val){if(in_array($modelName,$val)){$dbName = $key;break;}}return $dbName;}/*** 切換數據庫連接* @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);//跟據類型取對應的配置(從庫是隨機值)if($dbtype == 'write'){$config = $this-dbConfig[$dbtype];}else{$slavekey = array_rand($this-dbConfig[$dbtype]);$config = $this-dbConfig[$dbtype][$slavekey];}//將數據庫配置加到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.'));}/*** 保存數據前選擇 主 數據庫*/protected function beforeSave(){parent::beforeSave();$this-changeConn('write');return true;}/*** 刪除數據前選擇 主 數據庫*/protected function beforeDelete(){parent::beforeDelete();$this-changeConn('write');return true;}/*** 讀取數據選擇 從 數據庫*/protected function beforeFind(){parent::beforeFind();$this-changeConn('read');return true;}/*** 獲取master庫對象*/public function dbWrite(){return $this-changeConn('write');}/*** 獲取slave庫對象*/public function dbRead(){return $this-changeConn('read');}}這是我寫好的類,放在components文件夾里,然后所有的Model都繼承ActiveRecord類就可以實現多庫和主從讀寫分離了,至于如何支持原生的SQL也同時使用讀寫分離,此類都已經實現。希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。
方法/步驟
1
第一步: MySQL主從設置之主服務器A設置
1. 找到主服務器A的MySQL的配置文件my.ini
2
2. 打開my.ini,在[mysqld]下面添加以下參數
3
3. 在主服務器A中添加一個用于主從復制的帳號:
登陸mysql命令行,執行
GRANT REPLICATION SLAVE ON *.* TO ‘帳號’@’從服務器IP’ IDENTIFIED BY ‘密碼';
4
4. 重啟MySQL ,讓配置生效
5
5. 可以通過show master status\G;查看主從數據庫是否配置成功。
6
第二步: MySQL主從設置之主數據庫和從數據庫數據一致。
1. 關閉論壇訪問,停止更新數據
7
2. 在主服務器中加入只讀鎖
8
3. 導出數據庫
通過命令導出數據庫 mysqldump -u root -p 數據庫名 導出來的位置
9
4. 將主服務器的數據庫導入到從服務器的數據庫
10
5. 將主數據庫服務器解除只讀鎖
11
6. 開啟論壇訪問。
12
第三步:MySQL主從設置之從服務器B設置
1. 找到從服務器mysql配置文件my.cnf (主服務器是windows,從服務器是Linux。所以配置文件的后綴不一致)
13
2. 打開my.cnf,在[mysqld]下面添加以下參數
14
3. 重啟從數據庫
15
4、登錄從庫的MySQL命令行,執行:
change
master to master_host=’主服務器IP’, master_user=’主服務器賬號’,
master_password=’主服務器密碼’, master_log_file=’file的值’,
master_log_pos=position的值;
//設置連接信息,file及position的值是之前記錄下來(在主服務器上通過show master status\G;),position的值沒有單引號,其他的值要單引號
16
5. 啟動從庫連接
start slave; //啟動從庫連接
17
6、查看從庫狀態:
show slave status\G; //查看連接情況
18
7、編輯從MYSQL服務器的MySQL配置文件my.cnf,在[mysqld]下面添加以下參數:
19
8. 測試,可以在主服務器上添加數據或者刪除數據,從服務器會對應更新過來。
20
第四步: 讀寫分離
打開discuz x3.1的配置文件config/config_global.php
\vendor\laravel\framework\src\Illuminate\Database\Connection.php
public function select($query, $bindings = [], $useReadPdo = true){}
$useReadPdo 執行查詢語句時指定為false即可
Mysql主從配置,實現讀寫分離
原理:主服務器(Master)負責網站NonQuery操作,從服務器負責Query操作,用戶可以根據網站功能模特性塊固定訪問Slave服務器,或者自己寫個池或隊列,自由為請求分配從服務器連接。主從服務器利用MySQL的二進制日志文件,實現數據同步。二進制日志由主服務器產生,從服務器響應獲取同步數據庫。
具體實現:
1、在主從服務器上都裝上MySQL數據庫,windows系統鄙人安裝的是mysql_5.5.25.msi版本,Ubuntu安裝的是mysql-5.6.22-linux-glibc2.5-i686.tar
windows安裝mysql就不談了,一般地球人都應該會。鄙人稍微說一下Ubuntu的MySQL安裝,我建議不要在線下載安裝,還是離線安裝的好。大家可以參考 這位不知道大哥還是姐妹,寫的挺好按照這個就能裝上。在安裝的時候可能會出現幾種現象,大家可以參考解決一下:
(1)如果您不是使用root用戶登錄,建議 su - root 切換到Root用戶安裝,那就不用老是 sudo 了。
(2)存放解壓的mysql 文件夾,文件夾名字最好改成mysql
(3)在./support-files/mysql.server start 啟動MySQL的時候,可能會出現一個警告,中文意思是啟動服務運行讀文件時,忽略了my.cnf文件,那是因為my.cnf的文件權限有問題,mysql會認為該文件有危險不會執行。但是mysql還會啟動成功,但如果下面配置從服務器參數修改my.cnf文件的時候,你會發現文件改過了,但是重啟服務時,修改過后的配置沒有執行,而且您 list一下mysql的文件夾下會發現很多.my.cnf.swp等中間文件。這都是因為MySQL啟動時沒有讀取my.cnf的原因。這時只要將my.cnf的文件權限改成my_new.cnf的權限一樣就Ok,命令:chmod 644 my.cnf就Ok
(4)Ubuntu中修改文檔內容沒有Vim,最好把Vim 裝上,apt-get install vim,不然估計會抓狂。
這時候我相信MySQL應該安裝上去了。
2、配置Master主服務器
(1)在Master MySQL上創建一個用戶‘repl’,并允許其他Slave服務器可以通過遠程訪問Master,通過該用戶讀取二進制日志,實現數據同步。
分享文章:php數據庫讀寫分離狀態 數據庫讀寫分離是什么意思
網站路徑:http://vcdvsql.cn/article4/doodeoe.html
成都網站建設公司_創新互聯,為您提供品牌網站設計、網站設計、靜態網站、小程序開發、虛擬主機、微信小程序
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯