當前位置:首頁 » 操作系統 » 資料庫讀寫分離方案

資料庫讀寫分離方案

發布時間: 2023-06-17 19:45:28

❶ 一台伺服器,怎麼實現資料庫的讀寫分離

方法1 :裡面建立兩個資料庫實例,一個作寫,一個作讀
方法2:伺服器上建兩個虛擬機,一個虛擬機放寫資料庫,一個放讀資料庫
方法3:伺服器上放寫資料庫,再建一個虛擬機放寫資料庫
----------------------
實現方法:
資料庫之間同步,然後修改代碼讀寫分別指向相應的資料庫,就可以了。

sqlserver怎麼實現資料庫讀寫分離

至於對資料庫的讀寫操作分離,還是前台代碼來確定。
對於只負責讀的資料庫可以對該訪問用戶設置為datareader角色即可,也可以防止數據寫了,不過這是資料庫方面許可權的問題

❸ mysql讀寫分離和用Redis做緩存,這兩種方案有什麼異同

讀寫分離一般都是結合Master/Slave模式使用,Master處理寫請求,Slave處理讀請求,這樣做的好處是:
1、提高資料庫的並發處理能力;
2、避免寫請求鎖表阻塞讀請求;
3、避免單點,提高資料庫的可用性;
而使用Redis作為DB前面的緩存,是為了減少對MySQL的壓力,提高系統的處理效率。

二者解決的問題域不同,不存在誰替代誰。

一般高並發應用都是結合二者使用。

❹ 分布式系統中應用程序怎麼實現資料庫讀寫分離

本文實例分析了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文件如下: 復制代碼 代碼如下:<?php return 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如下: 復制代碼 代碼如下:<?php return 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]; } else throw 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]; } else throw 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程序設計有所幫助。

❺ 什麼是資料庫的讀寫分離

amoeba 跟 mysql proxy在讀寫分離的使用上面的區別。
在mysql proxy 上面如果想要讀寫分離並且 讀集群、寫集群 機器比較多情況下,用mysql proxy 需要相當大的工作量,目前mysql proxy沒有現成的 lua腳本。mysql proxy根本沒有配置文件,lua腳本就是它的全部,當然lua是相當方便的。那麼同樣這種東西需要編寫大量的腳本才能完成一個復雜的配置。amoeba目標是走產品化這條路。只需要進行相關的配置就可以滿足需求。一、Master/Slave 結構讀寫分離:
Master: server1 (可讀寫)
slaves:server2、server3、server4(3個平等的資料庫。只讀/負載均衡)
amoeba提供讀寫分離pool相關配置。並且提供負載均衡配置。
可配置server2、server3、server4形成一個虛擬的 virtualSlave,該配置提供負載均衡、failOver、故障恢復功能Xml代碼
<dbServer name="virtualSlave" virtual="true">
<poolConfig>
<className>com.meisa.amoeba.server.MultipleServerPool</className>
<!-- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED -->
<property name="loadbalance">1</property>
<!-- 參與該pool負載均衡的poolName列表以逗號分割 -->
<property name="poolNames">server2,server3,server4</property>
</poolConfig>
</dbServer>
如果不啟用數據切分,那麼只需要配置QueryRouter屬性
wirtePool=server1
readPool=virtualSlave
<queryRouter>
<className>com.meisa.amoeba.mysql.parser.MysqlQueryRouter</className>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>
<property name="writePool">server1</property>
<property name="readPool">virtualSlave</property>
<property name="needParse">true</property>

❻ mysql 如何實現讀寫分離,用mysql-proxy 或者直接用php連接兩個資料庫

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安裝,我建議不要在線下載安裝,還是離線安裝的好。大家可以參考 http://www.linuxidc.com/Linux/2013-01/78716.htm 這位不知道大哥還是姐妹,寫的挺好按照這個就能裝上。在安裝的時候可能會出現幾種現象,大家可以參考解決一下:
(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,通過該用戶讀取二進制日誌,實現數據同步。

熱點內容
紅米note安卓80怎麼刷機 發布:2025-03-22 00:49:46 瀏覽:213
linux字體緩存 發布:2025-03-22 00:49:09 瀏覽:978
明銳pro為什麼比高爾夫配置還要高 發布:2025-03-22 00:24:43 瀏覽:131
賣房解壓擔保 發布:2025-03-22 00:18:57 瀏覽:451
java打開頁面 發布:2025-03-22 00:18:41 瀏覽:449
mt4ea源碼 發布:2025-03-21 23:59:08 瀏覽:533
文件夾加密隱藏 發布:2025-03-21 23:56:24 瀏覽:19
setjava用法 發布:2025-03-21 23:54:59 瀏覽:183
spring配置的主要標簽有哪些 發布:2025-03-21 23:54:57 瀏覽:174
python3range 發布:2025-03-21 23:42:56 瀏覽:347