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