面試官:談談你對Mysql數據庫讀寫分離的瞭解,而且有哪些注意事項?

這篇文章講述的不是Mysql具體的如何實現讀寫分離,而是指何時須要上讀寫分離,及其相關的注意事項。java

由於用戶的增多,數據的增多,單機的數據庫每每支撐不住快速發展的業務,因此數據庫集羣就產生了!今天來講說讀寫分離的數據庫集羣方式! 讀寫分離顧名思義就是讀和寫分離了,對應到數據庫集羣通常都是一主一從(一個主庫,一個從庫)或者一主多從(一個主庫,多個從庫),業務服務器把須要寫的操做都寫到主數據庫中,讀的操做都去從庫查詢。主庫會同步數據到從庫保證數據的一致性。 sql

主從集羣
這種集羣方式的本質就是 把訪問的壓力從主庫轉移到從庫,也就是在單機數據庫沒法支撐併發讀寫的時候,而且讀的請求不少的狀況下適合這種讀寫分離的數據庫集羣。若是 寫的操做不少的話不適合這種集羣方式,由於你的數據庫壓力仍是在寫操做上,即便主從了以後壓力仍是在主庫上和單機區別就不大了。

在單機的狀況下,通常咱們作數據庫優化都會加索引,可是加了索引對查詢有優化,可是會影響寫入,由於寫入數據會更新索引。因此作了主從以後,咱們能夠單獨的針對從庫(讀庫)作索引上的優化,而主庫(寫庫)能夠減小索引而提升寫的效率。數據庫

看起來仍是很簡單的,可是有兩點要注意:主從同步延遲、分配機制的考慮緩存

主從同步延遲

主庫有數據寫入以後,同時也寫入在binlog(二進制日誌文件)中,從庫是經過binlog文件來同步數據的,這期間會有必定時間的延遲,多是1秒,若是同時有大量數據寫入的話,時間可能更長。服務器

這會致使什麼問題呢?好比有一個付款操做,你付款了,主庫是已經寫入數據,可是查詢是到從庫查,從庫裏尚未你的付款記錄,因此頁面上查詢的時候你還沒付款。那可不急眼了啊,吞錢了這還了得!打電話給客服投訴!併發

因此爲了解決主從同步延遲的問題有如下幾個方法:ide

一、二次讀取

二次讀取的意思就是讀從庫沒讀到以後再去主庫讀一下,只要經過對數據庫訪問的API進行封裝就能實現這個功能。很簡單,而且和業務之間沒有耦合。可是有個問題,若是有不少二次讀取至關於壓力仍是回到了主庫身上,等於讀寫分離白分了。並且若有人惡意攻擊,就一直訪問沒有的數據,那主庫就可能爆了。性能

二、寫以後的立刻的讀操做訪問主庫

也就是寫操做以後,立馬的讀操做指定訪問主庫,以後的讀操做採起訪問從庫。這就等於寫死了,和業務強耦合了。優化

三、關鍵業務讀寫都由主庫承擔,非關鍵業務讀寫分離

相似付錢的這種業務,讀寫都到主庫,避免延遲的問題,可是例如改個頭像啊,我的簽名這種比較不重要的就讀寫分離,查詢都去從庫查,畢竟延遲一下影響也不大,不會立馬打客服電話哈哈。日誌

分配機制的考慮

分配機制的考慮也就是怎麼制定寫操做是去主庫寫,讀操做是去從庫讀。

通常有兩種方式:代碼封裝、數據庫中間件

一、代碼封裝 代碼封裝的實現很簡單,就是抽出一箇中間層,讓這個中間層來實現讀寫分離和數據庫鏈接。講白點就是搞個provider封裝了save,select等一般數據庫操做,內部save操做的dataSource是主庫的,select操做的dataSource是從庫的。

優勢:就是實現簡單,而且能夠根據業務定製化變化,爲所欲爲。

缺點:就是是若是哪一個數據庫宕機了,發生主從切換了以後,就得修改配置重啓。而且若是你的系統很大,一個業務可能包含多個子系統,一個子系統是java寫的一個子系統用go寫的,這樣的話得分別爲不一樣語言實現一套中間層,重複開發。

代碼封裝數據訪問層

二、數據庫中間件 就是有一個獨立的系統,專門來實現讀寫分離和數據庫鏈接管理,業務服務器和數據庫中間件之間是經過標準的SQL協議交流的,因此在業務服務器看來數據庫中間件其實就是個數據庫。

優勢:由於是經過sql協議的因此能夠兼容不一樣的語言不須要單獨寫一套,而且有中間件來實現主從切換,業務服務器不須要關心這點。

缺點:多了一個系統其實就等於多了一個關心。。若是數據庫中間件掛了的話對吧,並且多了一個系統就等於多了一個瓶頸,因此對中間件的性能要求也高,而且全部的數據庫操做都要通過它。而且中間件實現很複雜,難度比代碼封裝高多了。

可是有開源的數據庫中間件例如Mysql Proxy,Mysql Route,Atlas。

數據庫中間件

總結

讀寫分離相對而言是比較簡單的,比分表分庫簡單,可是它只能分擔訪問的壓力,分擔不了存儲的壓力,也就是你的數據庫表的數據逐漸增多,可是面對一張表海量的數據,查詢仍是很慢的,因此若是業務發展的快數據暴增,到必定時間仍是得分庫分表。

可是正常狀況下,只要當單機真的頂不住壓力了纔會集羣,不要一上來就集羣,沒這個必要。有關於軟件的東西都是越簡單越好,複雜都是形勢所迫。

通常咱們是先優化,優化一些慢查詢,優化業務邏輯的調用或者加入緩存等,若是真的優化到沒東西優化了而後才上集羣,先讀寫分離,讀寫分離以後頂不住就再分庫分表。


若有錯誤歡迎指正! 我的公衆號:yes的練級攻略

相關文章
相關標籤/搜索