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