第一個就是使用優(yōu)化查詢的方法。這個在前期的內(nèi)容中有具體說明,這里不再做說明。 第二、這里簡要說明一個以下幾個方法: 主從復(fù)制、讀寫分離、負(fù)載均衡 目前,大部分的主流關(guān)系型數(shù)據(jù)庫都提供了主從復(fù)制的功能,通過配置兩臺(或多臺)數(shù)據(jù)庫的主從關(guān)系,可以將一臺數(shù)據(jù)庫服務(wù)器的數(shù)據(jù)更新同步到另一臺服務(wù)器上。網(wǎng)站可以利用數(shù)據(jù)庫的這一功能,實現(xiàn)數(shù)據(jù)庫的讀寫分離,從而改善數(shù)據(jù)庫的負(fù)載壓力。一個系統(tǒng)的讀操作遠(yuǎn)遠(yuǎn)多于其寫操作,因此寫操作發(fā)向master,讀操作發(fā)向slaves進(jìn)行操作(簡單的輪循算法來決定使用哪個slave)。 利用數(shù)據(jù)庫的讀寫分離,web服務(wù)器在寫數(shù)據(jù)的時候,訪問著數(shù)據(jù)庫(Master),主數(shù)據(jù)庫通過主從復(fù)制機(jī)制將數(shù)據(jù)更新同步到從數(shù)據(jù)庫(Slave),這樣web服務(wù)器讀數(shù)據(jù)的時候,就可以通過從數(shù)據(jù)庫獲得數(shù)據(jù)。這一方案使得在大量讀操作的web應(yīng)用可以輕松地讀取數(shù)據(jù),而主數(shù)據(jù)庫也只會承受少量的寫入操作,還可以實現(xiàn)數(shù)據(jù)熱備份,可謂是一舉兩得的方案。 1.復(fù)制的基本原則 MySQL復(fù)制是異步的且串行化的; 每個Slave只有一個Master; 每個Slave只有一個唯一的服務(wù)器ID; 每個Master可以有多個Slave; 2.一主一從常見配置: MySQL版本一致且后臺以服務(wù)運行; 主從都配置在[mysqld]結(jié)點下,都是小寫,主機(jī)修改my.ini配置文件,從機(jī)修改my.cnf配置文件,因修改過配置文件,請主機(jī)+從機(jī)都重啟后臺MySQL服務(wù); 主機(jī)從機(jī)都關(guān)閉防火墻; 在Windows主機(jī)上建立賬戶并授權(quán)slave; 在Linux從機(jī)上配置需要復(fù)制的主機(jī); 主機(jī)新建庫,新建表,insert記錄,從機(jī)復(fù)制; 通過stop slave 停止從機(jī)復(fù)制;
主從復(fù)制的原理: 影響MySQL-A數(shù)據(jù)庫的操作,在數(shù)據(jù)庫執(zhí)行后,都會寫入本地的日志系統(tǒng)A中。假設(shè),實時的將變化了的日志系統(tǒng)中的數(shù)據(jù)庫事件操作,通過網(wǎng)絡(luò)發(fā)給MySQL-B。MySQL-B收到后,寫入本地日志系統(tǒng)B,然后一條條地將數(shù)據(jù)庫事件在數(shù)據(jù)庫中完成。那么MySQL-A的變化,MySQL-B也會變化,這樣就是所謂的MySQL的復(fù)制。 在上面的模型中,MySQL-A就是主服務(wù)器,即master,MySQL-B就是從服務(wù)器,即slave。 日志系統(tǒng)A,其實它是MySQL的日志類型的二進(jìn)制日志,也就是專門用來保存修改數(shù)據(jù)庫的所有動作,即bin log?!咀⒁釳ySQL會在執(zhí)行語句之后,釋放鎖之前,寫入二進(jìn)制日志,確保事務(wù)安全?!?/span> 日志系統(tǒng)B,并不是二進(jìn)制日志,由于它是從MySQL-A的二進(jìn)制日志復(fù)制過來的,并不是自己的數(shù)據(jù)庫變化產(chǎn)生的,有點接力的感覺,稱為中繼日志,即relay log。 可以發(fā)現(xiàn),通過上面的機(jī)制,可以保證MySQL-A和MySQL-B的數(shù)據(jù)庫數(shù)據(jù)一致,但是時間上肯定有延遲,即MySQL-B的數(shù)據(jù)是滯后的。 簡化版: MySQL主(稱master)從(稱slave)復(fù)制的原理: 1.master將數(shù)據(jù)改變記錄到二進(jìn)制日志(binary log)中,也即是配置文件log-bin指定的文件(這些記錄叫做二進(jìn)制日志事件,binary log events) PS:從圖中可以看出,Slave服務(wù)器中有一個I/O線程(I/O Thread)在不停地監(jiān)聽Master的二進(jìn)制日志(binary log)是否有更新:如果沒有,它會睡眠等待Master產(chǎn)生新的日志事件;如果有新的日志事件(log events),則會將其拷貝至Slave服務(wù)器中的中繼日志(relay log)。 2.slave將master的二進(jìn)制日志事件(binary log events)拷貝到它的中繼日志(relay log)。 3.slave重做中繼日志中的事件,將Master上的改變反映到它自己的數(shù)據(jù)庫中。所以兩端的數(shù)據(jù)是完全一樣的。 PS:從圖中可以看出,Slave服務(wù)器有一個SQL線程(SQL Thread)從中繼日志讀取事件,并重做其中的事件,從而更新Slave的數(shù)據(jù),使其與Master中的數(shù)據(jù)一致。只要該線程與I/O線程保持一致,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小。 主從復(fù)制的幾種方式: 1.同步復(fù)制 主服務(wù)器在將更新的數(shù)據(jù)寫入它的二進(jìn)制日志(binlog)文件中后,必須等待驗證所有的從服務(wù)器的更新數(shù)據(jù)是否已經(jīng)復(fù)制到其中,之后才可以自由處理其他進(jìn)入的事務(wù)處理請求。 2.異步復(fù)制 主服務(wù)器在將更新的數(shù)據(jù)寫入它的二進(jìn)制日志(binlog)文件中后,無需等待驗證更新數(shù)據(jù)是否復(fù)制到從服務(wù)器中,就可以自由處理其他進(jìn)入的事務(wù)處理請求。 3.半異步復(fù)制 主服務(wù)器在將更新的數(shù)據(jù)寫入它的二進(jìn)制日志(binlog)文件中后,只需等待驗證其中一臺從服務(wù)器的更新數(shù)據(jù)是否已經(jīng)復(fù)制到其中,就可以自由處理其他進(jìn)入的事務(wù)處理請求,其他的從服務(wù)器不用管。 數(shù)據(jù)庫分表、分區(qū)、分庫 分表見上期描述。 分區(qū)就是把一張表的數(shù)據(jù)分成多個區(qū)塊,這些區(qū)塊可以在一個磁盤上,也可以在不同的磁盤上,分區(qū)后,表面上還是一張表,但數(shù)據(jù)散列在多個位置,這樣一來,多塊硬盤同時處理不同請求,從而提高磁盤IO讀寫性能,實現(xiàn)比較簡單。包括水平分區(qū)和垂直分區(qū)。 分庫是根據(jù)業(yè)務(wù)不同把相關(guān)的表且分到不同的數(shù)據(jù)庫中,比如web、bbs、blog等庫。 |
|