1. 程式人生 > >應對資料庫高負載訪問的幾種方法

應對資料庫高負載訪問的幾種方法

1.可以使用優化查詢的方法

2.主從複製, 讀寫分離, 負載均衡

目前,大部分的主流關係型資料庫都提供了主從複製的功能,通過配置兩臺(或多臺)資料庫的主從關係,可以將一臺資料庫伺服器的資料更新同步到另一臺伺服器上。網站可以利用資料庫的這一功能,實現資料庫的讀寫分離,從而改善資料庫的負載壓力。一個系統的讀操作遠遠多於寫操作,因此寫操作發向 master,讀操作發向 slaves 進行操作(簡單的輪循演算法來決定使用哪個slave)。

利用資料庫的讀寫分離,Web 伺服器在寫資料的時候,訪問主資料庫(Master),主資料庫通過主從複製機制將資料更新同步到從資料庫(Slave),這樣當 Web 伺服器讀資料的時候,就可以通過從資料庫獲得資料。這一方案使得在大量讀操作的 Web 應用可以輕鬆地讀取資料,而主資料庫也只會承受少量的寫入操作,還可以實現資料熱備份

,可謂是一舉兩得的方案。


主從複製的原理:

影響 MySQL-A 資料庫的操作,在資料庫執行後,都會寫入本地的日誌系統 A 中。
假設,實時的將變化了的日誌系統中的資料庫事件操作,通過網路發給 MYSQL-B。MYSQL-B 收到後,寫入本地日誌系統 B,然後一條條的將資料庫事件在資料庫中完成。那麼,MYSQL-A 的變化,MYSQL-B 也會變化,這樣就是所謂的 MYSQL 的複製。

在上面的模型中,MYSQL-A 就是主伺服器,即 master,MYSQL-B 就是從伺服器,即slave。

日誌系統 A,其實它是 MYSQL 的日誌型別中的二進位制日誌,也就是專門用來儲存修改資料庫表的所有動作,即 bin log。【注意 MYSQL 會在執行語句之後,釋放鎖之前,寫入二進位制日誌,確保事務安全】尷尬


日誌系統 B,並不是二進位制日誌,由於它是從 MYSQL-A 的二進位制日誌複製過來的,並不是自己的資料庫變化產生的,有點接力的感覺,稱為中繼日誌,即 relay log。可以發現,通過上面的機制,可以保證 MYSQL-A 和 MYSQL-B 的資料庫資料一致,但是時間上肯定有延遲,即 MYSQL-B 的資料是滯後的。

Mysql 主(稱 master)從(稱 slave)複製的原理:


(1)master 將資料改變記錄到二進位制日誌(binary log)中,也即是配置檔案 log-bin 指定的檔案(這些記錄叫做二進位制日誌事件, binary log events)

PS:從圖中可以看出,Slave 伺服器中有一個 I/O執行緒(I/O Thread)

在不停地監聽 Master的二進位制日誌(Binary Log)是否有更新: 如果沒有它會睡眠等待 Master 產生新的日誌事件;如果有新的日誌事件(Log Events), 則會將其拷貝至 Slave 伺服器中的中繼日誌(Relay Log)。

(2).slave 將 master 的二進位制日誌事件(binary log events)拷貝到它的中繼日誌(relay log)

(3).slave 重做中繼日誌中的事件,將 Master 上的改變反映到它自己的資料庫中。 , 所以兩端的資料是完全一樣的。

PS: 從圖中可以看出, Slave 伺服器中有一個 SQL 執行緒(SQL Thread)從中繼日誌讀取事件, 並重做其中的事件, 從而更新 Slave 的資料, 使其與 Master 中的資料一致。 只要該執行緒與 I/O 執行緒保持一致,中繼日誌通常會位於 OS 的快取中,所以中繼日誌的開銷很小。

主從複製的方式:

1.同步複製:
主伺服器在將更新的資料寫入它的二進位制日誌(Binlog)檔案中後,必須等待驗證所有的從伺服器的更新資料是否已經複製到其中,之後才可以自由處理其它進入的事務處理請求。

2.非同步複製:
主伺服器在將更新的資料寫入它的二進位制日誌(Binlog)檔案中後,無需等待驗證更新資料是否已經複製到從伺服器中,就可以自由處理其它進入的事務處理請求。

3.半同步複製:
主伺服器在將更新的資料寫入它的二進位制日誌(Binlog)檔案中後,只需等待驗證其中一臺從伺服器的更新資料是否已經複製到其中,就可以自由處理其它進入的事務處理請求,其他的從伺服器不用管。

3.資料庫分表, 分割槽, 分庫

分表:
通過拆分表可以提高表的訪問效率。 有 2 種拆分方法

1.垂直拆分
把主鍵和一些列放在一個表中, 然後把主鍵和另外的列放在另一個表中。 如果一個表中某些列常用, 而另外一些不常用, 則可以採用垂直拆分。

2.水平拆分
根據一列或者多列資料的值把資料行放到二個獨立的表中。
分割槽:
分割槽就是把一張表的資料分成多個區塊,這些區塊可以在一個磁碟上,也可以在不同的磁碟上,分割槽後,表面上還是一張表,但資料雜湊在多個位置,這樣一來,多塊硬碟同時處理不同的請求,從而提高磁碟 I/O 讀寫效能,實現比較簡單。 包括水平分割槽和垂直分割槽。

分庫:
分庫是根據業務不同把相關的表切分到不同的資料庫中,比如 web、bbs、blog 等庫。