位元組面試:什麼是讀寫分離?讀寫分離的底層如何實現?

ITPUB社群發表於2024-01-18

來源:mikechen的網際網路架構


資料庫在高併發大資料量的場景尤其重要,特別是效能的的問題,這其中就會涉及到資料庫讀寫分離機制,比如:什麼是讀寫分離?底層如何實現?優先順序如何排定等問題@mikechen


什麼是讀寫分離

讀寫分離就是將資料庫分為主從庫,一個主庫(Master)用於寫資料,多個從庫(Slaver)進行輪詢讀取資料的過程。

位元組面試:什麼是讀寫分離?讀寫分離的底層如何實現?

主從庫之間透過某種通訊機制進行資料的同步,是一種常見的資料庫架構。

 

為什麼要讀寫分離呢?

因為資料庫的“寫”,比如:10000條資料到oracle可能要3分鐘,操作是比較耗時的。

但是資料庫的“讀”,比如:從oracle讀10000條資料可能只要5秒鐘,相對應寫就沒有這麼耗時。

所以讀寫分離解決的是:把資料庫的寫入與查詢,在伺服器上分開來,從而可以極大的提升查詢效率。

 

什麼時候要讀寫分離?

資料庫不一定要讀寫分離,但是如果程式使用資料庫較多時,而更新少,查詢多的情況下就可以考慮使用。

這樣可以減少資料庫壓力,提高效能,當然資料庫也有其它最佳化方案,比如:分庫分表,或是搜尋引擎等都是解決方法。

 

讀寫分離的原理

讀寫分離基本的原理是讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。

讀寫分離是為了將請求流量分散到不同的資料庫節點上,將寫入資料的請求分發到主資料庫,讀取資料的請求分發到從資料庫,從資料可以有多臺,即一主多從。

整體架構如下圖:

位元組面試:什麼是讀寫分離?讀寫分離的底層如何實現?

從上圖可看出,有個關鍵技術就是主從複製,每次寫入資料的時候,需要將主伺服器資料複製到從伺服器中,用來確保資料一致性。

下面我以MySQL的主從複製為例,如下圖所示:

位元組面試:什麼是讀寫分離?讀寫分離的底層如何實現?

主從複製

  1. 從伺服器連線上主伺服器,啟動複製的時候,則會自身建立一個IO執行緒去像主資料庫伺服器拉取binlog的更新資訊。

  2. 把拉過來的binlog資訊寫到自己伺服器的一個relay log日誌檔案中。

  3. 從資料庫伺服器建立一個SQL執行緒,是為了將relay log的所有日誌資訊,進行sql回寫到自己的資料庫中,這樣就和主庫的資料一模一樣了。

  4. 當主資料庫有資料更新的時候,比如新插入了一條或者update了一條資料,這時候主庫會將這些資料更新到binlog二進位制檔案中,同時,主庫會建立一個binlog dump執行緒,這個執行緒將更新了的binlog資訊傳送到從庫的IO執行緒,需要注意的是,這個過程是非同步的,如果等著從庫接受完成,是不是特別慢,且影響效能。

 

讀寫分離總結

在實際的生產環境中,對資料庫的讀和寫都在同一個資料庫伺服器中,是不能滿足實際需求的,無論是在安全性、高可用性還是高併發等各個方面都是完全不能滿足實際需求的。

因此,透過主從複製的方式來同步資料,再透過讀寫分離來提升資料庫的併發負載能力,即可以解決可用性的問題,又解決了資料庫效能問題。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024420/viewspace-3004261/,如需轉載,請註明出處,否則將追究法律責任。

相關文章