面試官:你如何利用 MySQL Cluster 實現整體高可用?

無敵天驕發表於2021-03-20

前言

本文,主要是介紹一下如何利用  MySQL Cluster 的特性來提高我們系統的整體可用性。

由於  MySQL Cluster 本身就是一個完整的分散式架構的系統,而且支援資料的 多點冗餘存放資料實時同步等特性。所以可以說他天生就已經具備了實現高可靠性的條件了,是否能夠在實際應用中滿足要求,主要就是在系統搭建配置方面的合理設定了。

由於  MySQL Cluster 的架構主要由兩個層次兩組叢集來組成,包括  SQL 節點( mysqld) 和  NDB 節點(資料節點),所有兩個層次都需要能夠保證高可靠性才能保證整體的可靠性。下面我們從兩個方面分別來介紹  MySQL Cluster 的高可靠性。

一、SQL 節點的高可靠性保證

MySQL Cluster 中的  SQL 節點實際上就是一個多節點的  mysqld 服務,並不包含任何資料。所以, SQL 節點叢集就像其他任何普通的應用伺服器一樣,可替代性很高,只要安裝了支援  MySQL Cluster 的  MySQL Server 端即可。

當該叢集中的一個  SQL 節點  crash 掉之後,由於只是單純的應用服務,所以並不會造成任何的資料丟失。只需要前端的應用資料來源配置相容了叢集中某臺主機  crash 之後自動將該主機從叢集中去除就可以了。實際上,這一點對於應用伺服器來說是非常容易做到的,無論是透過自行開發判斷功能的代理還是透過硬體級別的負載均衡裝置,都可以非常容易做到。當然,前提自然也是剩下的  SQL 節點能夠承擔整體負載才行。

面試官:你如何利用 MySQL Cluster 實現整體高可用?

如上圖,當  SQL 1 crash 之後,實際上僅僅只是訪問到資料的很多條途徑中的某一條中斷了,實際上仍然還有很多條途徑可以獲取到所需要的資料。而且,由於  SQL 的可替代性很高,所以更換也非常簡單,即使更換整臺主機,也可以在短時間內完成。

二、NDB 節點的高可靠性保證

MySQL Cluster 的資料冗餘是有一個前提條件的,首先必須要保證有足夠的節點,實際上是至少需要 2 個節點才能保證資料有冗餘,因為, MySQL Cluster 在儲存冗餘資料的時候 ,是比需要確保同一份資料的冗餘儲存在不同的節點之上。在保證了冗餘的前提下, MySQL Cluster 才會將資料進行分割槽。

假設我們存在 4 個  NDB 節點,資料被分成 4 個  partition 存放,資料冗餘儲存,每份資料儲存 2 份,也就是說  NDB 配置中的  NoOfReplicas 引數設定為 2,4 個節點將被分成 2 個  NDB Group

所有資料的分佈類似於下圖所示:


面試官:你如何利用 MySQL Cluster 實現整體高可用?

在這樣的配置中,假設我們  NDB Group 0 這一組中的某一個  NDB 節點(假如是 NDB 1)出現問題,其中的部分資料(假設是 part 1)壞了,由於每一份資料都存在一個 冗餘複製,所以並不會對系統造成任何的影響,甚至完全不需要人為的操作, MySQL 就可以繼續正常的提供服務。

假如我們兩個節點上面都出現部分資料損壞的情況,結果會怎樣?如下圖:


面試官:你如何利用 MySQL Cluster 實現整體高可用?

如果像上圖所示,如果兩個損壞部分資料的節點屬於同一個  NDB Group,只要損壞部分並沒有包含完全相同的資料,整個  MySQL Cluster 仍然可以正常提供服務。但是,如果損壞資料中存在相同的資料,即使只有很少的部分,都會造成  MySQL Cluster 出現問題,不能完全正常的提供服務。此外,如果損壞資料的節點處於兩個不同的  NDB Group,那麼非常幸運,不管損壞的是哪一部分資料,都不會影響  MySQL Cluster 的正常服務。

可能有朋友會說,那假如我們的硬體出現故障,整個  NDB 都  crash 了呢?是的,確實很可能存在這樣的問題,不過我們同樣不用擔心,如圖所示:

面試官:你如何利用 MySQL Cluster 實現整體高可用?

假設我們整個  NDB 節點由於硬體(或者軟體)故障而  crash 之後,由於  MySQL Cluster保證了每份資料的複製都不在同一臺主機上,所以即使整太主機都  crash 了之後, MySQL Cluster 仍然能夠正常提供服務,就像上圖所示的那樣,即使整個  NDB 1 節點都  crash 了 ,每一份資料都還可以透過  NDB 2 節點找回。

那如果是同時  crash 兩個節點會是什麼結果?首先可以肯定的是假如我們  crash 的兩個節點處於同一個  NDB Group 中的話,那  MySQL Cluster 也沒有辦法了,因為兩份冗餘的資料都丟失了。但是隻要  crash 的兩個節點不在同一個  NDB Group 中, MySQL Cluster就不會受到任何影響,還是能夠繼續提供正常服務。如下圖所示的情況:

面試官:你如何利用 MySQL Cluster 實現整體高可用?

從上面所列舉的情況我們可以知道, MySQL Cluster 確實可以達到非常高的可靠性,畢竟同一時刻存放相同資料的兩個  NDB 節點都出現大故障的機率實在是太小了,要是這也能夠被遇上,那隻能自然倒黴了。

當然,由於  MySQL Cluster 之前的老版本需要將所有的資料全部  Load 到記憶體中才能正常執行,所有由於受到記憶體空間大小的限制,使用的人非常少。現在的新版本雖然已經支援僅僅只需要所有的索引資料  Load 到記憶體中即可,但是由於實際的成功案例還並不是很多,而且發展時間也還不是太長,所以很多使用者朋友對於  MySQL Cluster 目前還是持謹慎態度,大部分還處於測試階段。

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

相關文章