面試官:你如何利用 MySQL Cluster 實現整體高可用?
前言
本文,主要是介紹一下如何利用
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
節點能夠承擔整體負載才行。
如上圖,當
SQL 1 crash
之後,實際上僅僅只是訪問到資料的很多條途徑中的某一條中斷了,實際上仍然還有很多條途徑可以獲取到所需要的資料。而且,由於
SQL
的可替代性很高,所以更換也非常簡單,即使更換整臺主機,也可以在短時間內完成。
二、NDB 節點的高可靠性保證
MySQL Cluster
的資料冗餘是有一個前提條件的,首先必須要保證有足夠的節點,實際上是至少需要 2 個節點才能保證資料有冗餘,因為,
MySQL Cluster
在儲存冗餘資料的時候 ,是比需要確保同一份資料的冗餘儲存在不同的節點之上。在保證了冗餘的前提下,
MySQL Cluster
才會將資料進行分割槽。
假設我們存在 4 個
NDB
節點,資料被分成 4 個
partition
存放,資料冗餘儲存,每份資料儲存 2 份,也就是說
NDB
配置中的
NoOfReplicas
引數設定為 2,4 個節點將被分成 2 個
NDB Group
。
所有資料的分佈類似於下圖所示:
在這樣的配置中,假設我們
NDB Group 0
這一組中的某一個
NDB
節點(假如是 NDB 1)出現問題,其中的部分資料(假設是 part 1)壞了,由於每一份資料都存在一個
冗餘複製,所以並不會對系統造成任何的影響,甚至完全不需要人為的操作,
MySQL
就可以繼續正常的提供服務。
假如我們兩個節點上面都出現部分資料損壞的情況,結果會怎樣?如下圖:
如果像上圖所示,如果兩個損壞部分資料的節點屬於同一個
NDB Group
,只要損壞部分並沒有包含完全相同的資料,整個
MySQL Cluster
仍然可以正常提供服務。但是,如果損壞資料中存在相同的資料,即使只有很少的部分,都會造成
MySQL Cluster
出現問題,不能完全正常的提供服務。此外,如果損壞資料的節點處於兩個不同的
NDB Group
,那麼非常幸運,不管損壞的是哪一部分資料,都不會影響
MySQL Cluster
的正常服務。
可能有朋友會說,那假如我們的硬體出現故障,整個
NDB
都
crash
了呢?是的,確實很可能存在這樣的問題,不過我們同樣不用擔心,如圖所示:
假設我們整個
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
確實可以達到非常高的可靠性,畢竟同一時刻存放相同資料的兩個
NDB
節點都出現大故障的機率實在是太小了,要是這也能夠被遇上,那隻能自然倒黴了。
當然,由於
MySQL Cluster
之前的老版本需要將所有的資料全部
Load
到記憶體中才能正常執行,所有由於受到記憶體空間大小的限制,使用的人非常少。現在的新版本雖然已經支援僅僅只需要所有的索引資料
Load
到記憶體中即可,但是由於實際的成功案例還並不是很多,而且發展時間也還不是太長,所以很多使用者朋友對於
MySQL Cluster
目前還是持謹慎態度,大部分還處於測試階段。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2764023/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL高可用之GC-Galera Cluster for MySQLMySqlGC
- 如何設計和實現高可用MySQLMySql
- 面試官:聊一下你對MySQL索引實現原理?面試MySql索引
- 如何設計和實現高可用的MySQLMySql
- MySQL高可用之MGC--MariaDB Galera ClusterMySqlGC
- 面試官:如何用LinkedHashMap實現LRU面試HashMap
- keepalived+MySQL實現高可用MySql
- 面試官:請你實現一個深克隆面試
- 面試官:volatile如何保證可見性的,具體如何實現?面試
- MySQL高可用架構:mysql+keepalived實現MySql架構
- 面試官:如何實現掃碼登入功能?面試
- MySQL 實現高可用架構之 MHAMySql架構
- MHA+MySQL主從配置實現MySQL高可用MySql
- Go 面試官問我如何實現物件導向?Go面試物件
- MySQL高可用方案-PXC(Percona XtraDB Cluster)環境部署詳解MySql
- 面試官問你:MYSQL事務和隔離級別,該如何回答面試MySql
- 面試官如何考察你的思維方式?面試
- Java進階必備:優雅的告訴面試官訊息中介軟體該如何實現高可用架構?【石杉的架構筆記】Java面試架構筆記
- 面試官:談談你對mysql索引的認識?面試MySql索引
- 反問面試官:如何實現叢集內選主面試
- 【搞定面試官】- Synchronized如何實現同步?鎖優化?(1)面試synchronized優化
- 邦芒支招:如何判斷面試官對你有好感表現面試
- keepalived+haproxy實現mysql負載均衡高可用MySql負載
- 基於Centos7.x 搭建MySQL Galera Cluster高可用架構CentOSMySql架構
- 基於MySQL Cluster + LVS + KeepAlived部署負載均衡高可用架構MySql負載架構
- 面試題:MySQL事務的ACID如何實現?面試題MySql
- ELK架構下利用Kafka Group實現Logstash的高可用架構Kafka
- 面試官問:你有多少種方式實現三欄佈局?面試
- 面試官:MySQL 有哪些鎖??面試MySql
- 吊打面試官!MySQL靈魂100問,你能答出多少?面試MySql
- 面試官:JavaScript如何實現陣列拍平(扁平化)方法?面試JavaScript陣列
- 【Android面試技巧】當面試官問你glide的時候,是想問什麼?glide生命週期如何實現?Android面試IDE
- 【MySQL】面試官問我:MySQL如何實現無資料插入,有資料更新?我是這樣回答的!MySql面試
- 構建MHA實現MySQL高可用叢集架構MySql架構
- 答面試官問:如何防超賣,有幾種實現方式面試
- 面試官: 實現雙向繫結Proxy比defineproperty優劣如何?面試
- 面試官問:多執行緒同步內部如何實現的,你知道怎麼回答嗎?面試執行緒
- 面試官問我MySQL索引,我面試MySql索引