MySQL高可用架構設計分析

lhrbest發表於2019-07-23

MySQL高可用架構設計分析


高可用HA(High Availability)是分散式系統架構設計中必須考慮的因素之一,它通常是指,透過設計減少系統不能提供服務的時間。


假設系統一直能夠提供服務,我們說系統的可用性是100%。如果系統每執行100個時間單位,會有1個時間單位無法提供服務,我們說系統的可用性是99%。很多公司的高可用目標是4個9,也就是99.99%,這就意味著,系統的年停機時間為8.76個小時。


百度的搜尋首頁,是業內公認高可用保障非常出色的系統,甚至人們會透過 能不能訪問來判斷“網路的連通性”,百度高可用的服務讓人留下啦“網路通暢,百度就能訪問”,“百度打不開,應該是網路連不上”的印象,這其實是對百度HA最高的褒獎。


1. MySQL高可用


說到MySQL的高可用,不得不提到複製,複製是MySQL高可用的基礎。複製解決了什麼問題呢?


  1. 實現資料備份

  2. 如果有從伺服器,主伺服器發生故障之後,開通從伺服器的寫入功能,從而提供高可用的使用功能

  3. 異地容災

  4. 分攤負載(scale out )主伺服器:寫、從伺服器:讀


1.1 主從複製流程

不同的複製協議:

 

1.2 高可用複製架構


1.3.mysql 高可用架構


  1.3.1 MySQL Cluster架構  


限制儲存引擎為NDB儲存引擎:


 

1.3.2 MySQL+MMM架構


MMM即Master-Master Replication Manager for MySQL(mysql主主複製管理器),是關於mysql主主複製配置的監控、故障轉移和管理的一套可伸縮的指令碼套件(在任何時候只有一個節點可以被寫入),這個套件也能基於標準的主從配置的任意數量的從伺服器進行讀負載均衡,所以你可以用它來在一組居於複製的伺服器啟動虛擬ip,除此之外,它還有實現資料備份、節點之間重新同步功能的指令碼。
 MySQL本身沒有提供replication failover的解決方案,透過MMM方案能實現伺服器的故障轉移,從而實現mysql的高可用。



此方案特點:


1、安全、穩定性較高,可擴充套件性好

2、 對伺服器數量要求至少三臺及以上

3、 對雙主(主從複製性要求較高)

4、 同樣可實現讀寫分離


1.3.3 MySQL+MHA架構


MHA目前在MySQL高可用方案中應該也是比較成熟和常見的方案,它由日本人開發出來,在MySQL故障切換過程中,MHA能做到快速自動切換操作,而且還能最大限度保持資料的一致性。



此架構特點:


1、安裝佈署簡單,不影響現有架構

2、自動監控和故障轉移

3、保障資料一致性

4、故障切換方式可使用手動或自動多向選擇

5、適應範圍大(適用任何儲存引擎)


2.MySQL高可用帶給我們對高可用架構設計的思考


為了保證資料的一致性,MySQL提出了複製的概念。


為了滿足acid,MySQL提供了兩種日誌 redo和undo日誌 ,redo log是重做日誌,提供前滾操作,undo log是回滾日誌,提供回滾操作。 undo log不是redo log的逆向過程,其實它們都算是用來恢復的日誌: redo log通常是物理日誌,記錄的是資料頁的物理修改,而不是某一行或某幾行修改成怎樣怎樣,它用來恢復提交後的物理資料頁(恢復資料頁,且只能恢復到最後一次提交的位置)。 undo用來回滾行記錄到某個版本。undo log一般是邏輯日誌,根據每行記錄進行記錄。 為了高可用的保證,有了多主或者主從切換。


資料庫的高可用架構一般在系統的底層,這方面的技術要求比較高,整個高可用系統大致如下:


 

3.總結


我們都知道,單點是系統高可用的大敵,單點往往是系統高可用最大的風險和敵人,應該儘量在系統設計的過程中避免單點。


方法論上,高可用保證的原則是“叢集化”,或者叫“冗餘”:只有一個單點,掛了服務會受影響;如果有冗餘備份,掛了還有其他backup能夠頂上。冗餘的最大難道是一致性即複製技術,MySQL提供了一個思路。


有了冗餘之後,還不夠,每次出現故障需要人工介入恢復勢必會增加系統的不可服務實踐。所以,又往往是透過“自動故障轉移”來實現系統的高可用。災備的恢復一般透過日誌來做,日誌的設計也是難點, MySQL 提供了一個思路。


【1】 http://uat.severalnines.com/blog/comparing-replication-solutions-oracle-and-mysql

【2】

【3】 https://www.cnblogs.com/youkanyouxiao/p/8335159.html

【4】

【5】 https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html

【6】 https://www.cnblogs.com/youkanyouxiao/p/9834791.html  





資料庫之網際網路常用架構方案

一、資料庫架構原則

  1. 高可用
  2. 高效能
  3. 一致性
  4. 擴充套件性

二、常見的架構方案

方案一:主備架構,只有主庫提供讀寫服務,備庫冗餘作故障轉移用

 jdbc:mysql://vip:3306/xxdb

  1. 高可用分析: 高可用,主庫掛了,keepalive(只是一種工具)會自動切換到備庫。這個過程對業務層是透明的,無需修改程式碼或配置。
  2. 高效能分析: 讀寫都操作主庫,很容易產生瓶頸。大部分網際網路應用讀多寫少,讀會先成為瓶頸,進而影響寫效能。另外,備庫只是單純的備份,資源利用率50%,這點方案二可解決。
  3. 一致性分析: 讀寫都操作主庫,不存在資料一致性問題。
  4. 擴充套件性分析: 無法透過加從庫來擴充套件讀效能,進而提高整體效能。
  5. 可落地分析: 兩點影響落地使用。第一,效能一般,這點可以透過建立高效的索引和引入快取來增加讀效能,進而提高效能。這也是通用的方案。第二,擴充套件性差,這點可以透過 分庫分表 來擴充套件。

方案二:雙主架構,兩個主庫同時提供服務,負載均衡

 jdbc:mysql://vip:3306/xxdb

  1. 高可用分析: 高可用,一個主庫掛了,不影響另一臺主庫提供服務。這個過程對業務層是透明的,無需修改程式碼或配置。
  2. 高效能分析: 讀寫效能相比於方案一都得到提升,提升一倍。
  3. 一致性分析: 存在資料一致性問題。請看, 一致性解決方案
  4. 擴充套件性分析: 當然可以擴充套件成三主迴圈,但筆者不建議(會多一層 資料同步 ,這樣同步的時間會更長)。如果非得在資料庫架構層面擴充套件的話,擴充套件為方案四。
  5. 可落地分析: 兩點影響落地使用。第一,資料一致性問題, 一致性解決方案 可解決問題 第二,主鍵衝突問題,ID統一地由分散式ID生成服務來生成可解決問題。

方案三:主從架構,一主多從,讀寫分離

 jdbc:mysql://master-ip:3306/xxdb

 jdbc:mysql://slave1-ip:3306/xxdb

 jdbc:mysql://slave2-ip:3306/xxdb

  1. 高可用分析: 主庫單點,從庫高可用。一旦主庫掛了,寫服務也就無法提供。
  2. 高效能分析: 大部分網際網路應用讀多寫少,讀會先成為瓶頸,進而影響整體效能。讀的效能提高了,整體效能也提高了。另外,主庫可以不用索引,線上從庫和線下從庫也可以建立不同的索引(線上從庫如果有多個還是要建立相同的索引,不然得不償失;線下從庫是平時開發人員排查線上問題時查的庫,可以建更多的索引)。
  3. 一致性分析: 存在資料一致性問題。請看, 一致性解決方案
  4. 擴充套件性分析: 可以透過加從庫來擴充套件讀效能,進而提高整體效能。(帶來的問題是,從庫越多需要從主庫拉取binlog日誌的端就越多,進而影響主庫的效能,並且 資料同步 完成的時間也會更長)
  5. 可落地分析: 兩點影響落地使用。第一,資料一致性問題, 一致性解決方案 可解決問題 第二,主庫單點問題,筆者暫時沒想到很好的解決方案。

注:思考一個問題,一臺從庫掛了會怎樣?讀寫分離之讀的負載均衡策略怎麼容錯?

方案四:雙主+主從架構,看似完美的方案

 jdbc:mysql://vip:3306/xxdb

 jdbc:mysql://slave1-ip:3306/xxdb

 jdbc:mysql://slave2-ip:3306/xxdb

  1. 高可用分析: 高可用。
  2. 高效能分析: 高效能。
  3. 一致性分析: 存在資料一致性問題。請看, 一致性解決方案
  4. 擴充套件性分析: 可以透過加從庫來擴充套件讀效能,進而提高整體效能。(帶來的問題 同方案二
  5. 可落地分析: 同方案二 ,但 資料同步 又多了一層,資料延遲更嚴重

三、一致性解決方案

第一類:主庫和從庫一致性解決方案

注:圖中圈出的是資料同步的地方,資料同步(從庫從主庫拉取binlog日誌,再執行一遍)是需要時間的,這個同步時間內主庫和從庫的資料會存在不一致的情況。如果同步過程中有讀請求,那麼讀到的就是從庫中的老資料。如下圖。

既然知道了資料不一致性產生的原因,有下面幾個解決方案供參考:

  1. 直接忽略,如果業務允許延時存在,那麼就不去管它。
  2. 強制讀主,採用 主備架構 方案,讀寫都走主庫。用快取來擴充套件資料庫讀效能 。有一點需要知道:如果快取掛了,可能會產生雪崩現象,不過一般分散式快取都是高可用的。
  3. 選擇讀主,寫操作時根據庫+表+業務特徵生成一個key放到Cache裡並設定超時時間(大於等於主從資料同步時間)。讀請求時,同樣的方式生成key先去查Cache,再判斷是否命中。若命中,則讀主庫,否則讀從庫。代價是多了一次快取讀寫,基本可以忽略。
  4. 半同步複製,等主從同步完成,寫請求才返回。就是大家常說的“半同步複製”semi-sync。這可以利用資料庫原生功能,實現比較簡單。代價是寫請求時延增長,吞吐量降低。
  5. 資料庫中介軟體,引入開源(mycat等)或自研的資料庫中間層。個人理解,思路同 選擇讀主 資料庫中介軟體的成本比較高,並且還多引入了一層。

第二類:DB和快取一致性解決方案

先來看一下常用的快取使用方式:

第一步:淘汰快取;

第二步:寫入資料庫;

第三步:讀取快取?返回:讀取資料庫;

第四步:讀取資料庫後寫入快取。

注:如果按照這種方式,圖一,不會產生DB和快取不一致問題;圖二,會產生DB和快取不一致問題,即4.read先於3.sync執行。 如果不做處理,快取裡的資料可能一直是髒資料。解決方式如下:

注:設定快取時,一定要加上失效時間,以防延時淘汰快取失敗的情況!

四、個人的一些見解

1、架構演變

  1. 架構演變一:方案一 -> 方案一+分庫分表 -> 方案二+分庫分表 -> 方案四+分庫分表;
  2. 架構演變二:方案一 -> 方案一+分庫分表 -> 方案三+分庫分表 -> 方案四+分庫分表;
  3. 架構演變三:方案一 -> 方案二 -> 方案四 -> 方案四+分庫分表;
  4. 架構演變四:方案一 -> 方案三 -> 方案四 -> 方案四+分庫分表;

2、個人見解

  1. 加快取和索引是通用的提升資料庫效能的方式;
  2. 分庫分錶帶來的好處是巨大的,但同樣也會帶來一些問題,詳見 資料庫之分庫分表-垂直?水平?
  3. 不管是主備+分庫分表還是主從+讀寫分離+分庫分表,都要考慮具體的業務場景。某 8到家發展四年,絕大部分的資料庫架構還是採用方案一和方案一+分庫分表,只有極少部分用方案三+讀寫分離+分庫分表。另外,阿里雲提供的資料庫雲服務也都是主備方案,要想主從+讀寫分離需要二次架構。
  4. 記住一句話:不考慮業務場景的架構都是耍流氓。






About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub、部落格園、CSDN和個人微 信公眾號( xiaomaimiaolhr )上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

........................................................................................................................

● QQ群號: 230161599 (滿) 、618766405

● 微 信群:可加我微 信,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-07-01 06:00 ~ 2019-07-31 24:00 在西安完成

● 最新修改時間:2019-07-01 06:00 ~ 2019-07-31 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書 http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班 http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁 https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客戶端 掃描下面的二維碼來關注小麥苗的微 信公眾號( xiaomaimiaolhr )及QQ群(DBA寶典)、新增小麥苗微 信, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



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

相關文章