MySQL性能調優與架構設計——第 17 章 高可用設計之思路及方案

来源:http://www.cnblogs.com/jesselzj/archive/2016/06/23/5611476.html
-Advertisement-
Play Games

第 17 章 高可用設計之思路及方案 前言: 資料庫系統是一個應用系統的核心部分,要想系統整體可用性得到保證,資料庫系統就不能出現任何問題。對於一個企業級的系統來說,資料庫系統的可用性尤為重要。資料庫系統一旦出現問題無法提供服務,所有系統都可能無法繼續工作,而不像軟體中部分系統出現問題可能影響的僅僅 ...


第 17 章 高可用設計之思路及方案

前言:

資料庫系統是一個應用系統的核心部分,要想系統整體可用性得到保證,資料庫系統就不能出現任何問題。對於一個企業級的系統來說,資料庫系統的可用性尤為重要。資料庫系統一旦出現問題無法提供服務,所有系統都可能無法繼續工作,而不像軟體中部分系統出現問題可能影響的僅僅只是某個功能無法繼續服務。所以,一個成功的資料庫架構在高可用設計方面也是需要充分考慮的。本章內容將針對如何構建一個高可用的 MySQL 資料庫系統來介紹各種解決方案以及方案之間的比較。

17.1 利用 Replication 來實現高可用架構

做維護的讀者朋友應該都清楚,任何設備(或服務),只要是單點,就存在著很大的安全隱患。因為一旦這台設備(或服務) crash 之後,在短時間內就很難有備用設備(或服務)來頂替其功能。所以稍微重要一些的伺服器或者應用系統,都會存在至少一個備份以供出現異常的時候能夠很快的頂替上來提供服務。
對於資料庫來說,主備配置是非常常見的設計思路。而對於 MySQL 來說,可以說天生就具備了實現該功能的優勢,因為其 Replication 功能在實際應用中被廣泛的用來實現主備配置的功能。
我想,在大家所接觸的 MySQL 環境中大多數都存在通過 MySQL Replication 來實現兩台(或者多台)MySQL Server 之間的資料庫複製功能吧。可能有些是為了增強系統擴展性,滿足性能要求實現讀寫分離。亦或者就是用來作為主備機的設計,保證當主機 crash 之後在很短的時間內就可以將應用切換到備機上面來繼續運行。
通過 MySQL Replication 來實現資料庫的複製實際上在前面第13章中的內容中已經做過詳細的介紹了,也介紹了多種 Replication 架構的實現原理及實現方法。在之前,主要是從擴展性方面來介紹 Replication。在這裡,我將主要介紹的是從系統高可用方面如何和利用 Replication 的多種架構實現解決高可靠性的問題。

17.1.1 常規的 Master - Slave 解決基本的主備設計

在之前的章節中我提到過,普通的 Master - Slave 架構是目前很多系統中使用最為常見的一種架構方式。該架構設計不僅僅在很大程度上解決的系統的擴展性問題,帶來性能的提升,同時在系統可靠性方面也提供了一定的保證。
在普通的一個 Master 後面複製一個或者多個 Slave 的架構設計中,當我們的某一臺Slave 出現故障不能提供服務之後,我們還有至少一臺 MySQL 伺服器(Master)可以提供服務,不至於所有和資料庫相關的業務都不能運行下去。如果 Slave 超過一臺,那麼剩下的 Slave 也仍然能夠不受任何干擾的繼續提供服務。
當然,這裡有一點在設計的時候是需要註意的,那就是我們的 MySQL 資料庫集群整體的服務能力要至少能夠保證當其缺少一臺 MySQL Server 之後還能夠支撐系統的負載,否則一切都是空談。不過,從系統設計角度來說,系統處理能力留有一定的剩餘空間是一個比較基本的要求。所以正常來說,系統中短時間內少一臺 MySQL Server 應該是仍然能夠支撐正常業務的。

如上圖所示,當我們的 Slave 集群中的一臺 Slave C 出現故障 crash 之後,整個系統的變化僅僅只是從 Master 至 Slave C 的複製中斷,客戶端應用的 Read 請求也不能再訪問 Slave C。當時其他所有的 MySQL Server 在不需要任何調整的情況下就能正常工作。客戶端的請求 Read 請求全部由 Slave A 和 Slave B 來承擔。

17.1.2 Master 單點問題的解決

上面的架構可以很容易的解決 Slave 出現故障的情況,而且不需要進行任何調整就能繼續提供服務。但是,當我們的 Master 出現問題後呢?當我們的 Master 出現問題之後所有客戶端的 Write 請求就都無法處理了。
這時候我們可以有如下兩種解決方案,一個是將 Slave 中的某一臺切換成 Master 對外提供服務,同時將其他所有的 Slave 都以通過 CHANGE MASTER 命令來將通過新的Master 進行複製。另一個方案就是新增一臺 Master,也就是 Dual Master 的解決方案。
我們先來看看第一種解決方案,將一臺 Slave 切換成 Master 來解決問題,如圖:

當 Master 出現故障 crash 之後,原客戶端對 Master 的所有 Write 請求都會無法再繼續進行下去了,所有原 Master 到 Slave 的複製也自然就斷掉了。這時候,我們選擇一臺 Slave 將其切換成 Master。假設選擇的是 Slave A,則我們將其他 Slave B 和 Slave C都通過 CHANGE MASTER TO 命令更換其 Master,從新的 Master 也就是原Slave A 開始繼續進行複製。同時將應用端所有的寫入請求轉向到新的 Master。對於 Read 請求,我們可以去掉對新 Master 的 Read 請求,也可以繼續保留。
這種方案最大的一個弊端就是切換步驟比較多,實現比較複雜。而且,在 Master 出現故障 crash 的那個時刻,我們的所有 Slave 的複製進度並不一定完全一致,有可能有少量的差異。這時候,選擇哪一個 Slave 作為 Master也是一個比較頭疼的問題。所以這個方案的可控性並不是特別的高。
我們再來看看第二種解決方案,也就是通過 Dual Master 來解決 Master 的點問,為了簡單明瞭,這裡就僅畫出 Master 部分的圖,如下:

我們通過兩台 MySQL Server 搭建成 Dual Master 環境,正常情況下,所有客戶端的Write 請求都寫往 Master A,然後通過 Replication 將 Master A 複製到 Master B。一旦 Master A 出現問題之後,所有的 Write 請求都轉向 Master B。而在正常情況下,當Master B 出現問題的時候,實際上不論是資料庫還是客戶端的請求,都不會受到實質性的影響。
這裡,可能有讀者朋友會想到,當我們的 Master A 出現問題的時候,應用如何做到自動將請求轉向到 Master B 呢?其實很簡單,我們只需要通過相應的硬體設備如F5或者Cluster 管理軟體如 Heartbeat 來設置一個 VIP,正常情況下該 VIP 指向 Master A,而一旦 Master A出現異常 crash 之後,則自動切換指向到 Master B,前端所的應用都通過這個 VIP 來訪問 Master。這樣,既解決了應用的 IP 切換問題,還保證了在任何時刻應用都只會見到一臺 Master,避免了多點寫入出現數據紊亂的可能。
這個方案最大的特點就是在 Master 出現故障之後的處理比較簡單,可控性比較大。而弊端就是需要增加一臺 MySQL 伺服器,在成本方面投入更大。

17.1.3 Dual Master 與級聯複製結合解決異常故障下的高可用

通過前面的架構分析,我們分別得到了 Slave 出現故障後的解決方案,也解決了Master 的單點問題。現在我們再通過 Dual Master 與級聯複製結合的架構,來得到一個整體的解決方案,解決系統整體可靠性的問題。
這個架構方案的介紹在之前的章節中已經詳細的描述過了,這裡我們主要分析一下處於高可靠性方面考慮的完善和異常切換方法。

如上圖所示,首先考慮 Slave 出現異常的情況。在這個架構中,Slave 出現異常後的處理情況和普通的 Master - Slave 架構的處理方式完全一樣,僅僅需要在應用訪問 Slave集群的訪問配置中去掉一個 Slave 節點即可解決,不論是通過應用程式自己判斷,還是通過硬體解決方案如 F5 都可以很容易的實現。
下麵我們再看看當 Master A 出現故障 crash 之後的處理方案。如下圖:

當 Master A 出現故障 crash 之後,Master A 與 Master B 之間的複製將中斷,所有客戶端向 Master A 的 Write 請求都必須轉向 Master B。這個轉向動作的實現,可以通過上一節中所介紹的第二中方案中所介紹的通過 VIP 的方式實現。由於之前所有的 Slave 就都是從 Master B 來實現複製,所以 Slave 集群不會受到任何的影響,客戶端的所有 Read 請求也就不會受到任何的影響,整個過程可以完全自動進行,不需要任何的人為干預。不過
這裡有一個隱患就是當 Master A crash 的時候如果 Master B 作為 Slave 的 IO 線程如果還沒有讀取完 Master A 的二進位日誌的話,就會出現數據丟失的問題。要完全解決這個問題,我們只能通過第三方 patch(google 開發)來鏡像 MySQL 的二進位日誌到 Master B上面,才能完全避免不丟失任何數據。
那麼當 Master B 出現故障crash 之後的情況又如何呢?如下圖所示:

如果出現故障的不是 Master B 而是 Master A 又會怎樣呢?首先可以確定的是我們的所有 Write 請求都不會受到任何影響,而且所有的 Read 請求也都還是能夠正常訪問。
但所有 Slave 的複製都會中斷,Slave 上面的數據會開始出現滯後的現象。這時候我們需要做的就是將所有的 Slave 進行 CHANGE MASTER TO 操作,改為從 Master A 進行複製。
由於所有 Slave 的複製都不可能超前最初的數據源,所以可以根據 Slave 上面的 Relay Log 中的時間戳信息與 Master A 中的時間戳信息進行對照來找到準確的複製起始點,不會造成任何的數據丟失。

17.1.4 Dual Master 與級聯複製結合解決線上 DDL 變更問題

當我們使用 Dual Master 加級聯複製的組合架構的時候,對於 MySQL 的一個致命傷也就是線上 DDL 變更來說,也可以得到一定的解決。如當我們需要給某個表 tab 增加一個欄位,可以通過如下在上述架構中來實現:
1、在 Slave 集群中抽出一臺暫時停止提供服務,然後對其進行變更,完成後再放回集群繼續提供服務;
2、重覆第一步的操作完成所有 Slave 的變更;
3、暫停 Master B 的複製,同時關閉當前 session 記錄二進位日誌的功能,對其進行變更,完成後再啟動複製;
4、通過 VIP 切換,將應用所有對 Master A 的請求切換至 Master B;
5、關閉 Master A 當前 session 記錄二進位日誌的功能,然後進行變更;
6、最後再將 VIP 從 Master B 切換回 Master A,至此,所有變更完成。
變更過程中有幾點需要註意的:
1、整個 Slave 集群需要能夠承受在少一臺 MySQL 的時候仍然能夠支撐所有業務;
2、Slave 集群中增加或者減少一臺 MySQL 的操作簡單,可通過線上調整應用配置來實現;
3、Dual Master 之間的 VIP 切換簡單,且切換時間較短,因為這個切換過程會造成短時間段內應用無法訪問 Master 資料庫。
4、在變更 Master B 的時候,會出現短時間段內 Slave 集群數據的延時,所以如果單台主機的變更時間較長的話,需要在業務量較低的凌晨進行變更。如果有必要,甚至可能需要變更 Master B 之前將所有 Slave 切換為以 Master B 作為Master。
當然,即使是這樣,由於存在 Master A 與 Master B 之間的 VIP 切換,我們仍然會出現短時間段內應用無法進行寫入操作的情況。所以說,這種方案也僅僅能夠在一定程度上面解決 MySQL 線上 DDL 的問題。而且當集群數量較多,而且每個集群的節點也較多的情況下,整個操作過程將會非常的複雜也很漫長。對於 MySQL 線上 DDL 的問題,目前也確實還沒有一個非常完美的解決方案,只能期待 MySQL 能夠在後續版本中儘快解決這個問題了。

17.2 利用 MySQL Cluster 實現整體高可用

在上一章中已經詳細介紹過 MySQL Cluster 的相關特性,以及安裝配置維護方面的內容。這裡,主要是介紹一下如何利用 MySQL Cluster 的特性來提高我們系統的整體可用性。由於 MySQL Cluster 本身就是一個完整的分散式架構的系統,而且支持數據的多點冗餘存放,數據實時同步等特性。所以可以說他天生就已經具備了實現高可靠性的條件了,是否能夠在實際應用中滿足要求,主要就是在系統搭建配置方面的合理設置了。
由於 MySQL Cluster 的架構主要由兩個層次兩組集群來組成,包括 SQL 節點(mysqld)和NDB 節點(數據節點),所有兩個層次都需要能夠保證高可靠性才能保證整體的可靠性。

下麵我們從兩個方面分別來介紹 MySQL Cluster 的高可靠性。

17.2.1 SQL 節點的高可靠性保證

MySQL Cluster 中的 SQL 節點實際上就是一個多節點的 mysqld 服務,並不包含任何數據。所以,SQL 節點集群就像其他任何普通的應用伺服器一樣,可替代性很高,只要安裝了支持 MySQL Cluster 的 MySQL Server 端即可。
當該集群中的一個 SQL 節點 crash 掉之後,由於只是單純的應用服務,所以並不會造成任何的數據丟失。只需要前端的應用數據源配置相容了集群中某台主機 crash 之後自動將該主機從集群中去除就可以了。實際上,這一點對於應用伺服器來說是非常容易做到的,無論是通過自行開發判斷功能的代理還是通過硬體級別的負載均衡設備,都可以非常容易做到。當然,前提自然也是剩下的 SQL 節點能夠承擔整體負載才行。

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

17.2.2 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 目前還是持謹慎態度,大部分還處於測試階段。

17.3 利用 DRBD 保證數據的高安全可靠

17.3.1 DRBD 介紹

對於很多多這朋友來說,DRBD 的使用可能還不是太熟悉,但多多少少可能有一些瞭解。 畢竟,在 MySQL 的官方文檔手冊的 High Availability and Scalability 這一章中將 DRBD 作為 MySQL 實現高可用性的一個非常重要的方式來介紹的。雖然這一內容是直到去年年中的時候才開始加入到 MySQL 的文檔手冊中,但是 DRBD 本身在這之前很久就已經成為很多應用場合實現高可靠性的解決方案,而且在不少的 MySQL 使用群體中也早就開始使用了。
簡單來說,DRBD 其實就是通過網路來實現塊設備的數據鏡像同步的一款開源 Cluster軟體,也被俗稱為網路 RAID1。官方英文介紹為:DRBD refers toblock devicesdesigned asa building block toform high availability (HA) clusters. This is done by mirroring a whole block device via an assigned network.It is shownas network raid-1- DRBD。下麵是 DRBD 的一個概覽圖:

從圖中我們可以看出,DRBD 介於文件系統與磁碟介質之間,通過捕獲上層文件系統的所有IO操作,然後調用內核中的IO模塊來讀寫底層的磁碟介質。當 DRBD 捕獲到文件系統的寫操作之後,會在進行本地的磁碟寫操作的同時,以 TCP/IP 協議將,通過本地主機的網路設備(NIC)將 IO 傳遞至遠程主機的網路設備。當遠程主機的 DRBD 監聽到傳遞過來的 IO 信息之後,會立即將該數據寫入到該 DRBD 所維護的磁碟設備。至此,整個 IO 才做完成。
實際上 DRBD 在處理遠程數據寫入的時候有三種複製模式(或者稱為級別)可以選擇,不同的複製模式保證了遠程數據寫入的三種可靠性。三種級別的選擇可以通過 DRBD 的通用配置部分的 protocal。不同的複製模式,實際上是影響了一個 IO 完成所代表的實際含義。
因為當我們使用 DRBD 的時候,一個 IO 完成的標識(DRBD 返回 IO 完成)是本地寫入和遠程寫入這兩個併發進程都返回完成標識。下麵我來詳細介紹一下這三種複製模式所代表的含義:
Protocol A:這種模式是可靠性最低的模式,而且是一個非同步的模式。當我們使用這個模式來配置的時候,寫遠程數據的進程將數據通過 TCP/IP 協議發送進入本地主機的 TCP send buffer 中,即返回完成。
Protocol B:這種模式相對於 Protocol A 來說,可靠性要更高一些。因為寫入遠程的線程會等待網路信息傳輸完成,也就是數據已經被遠程的 DRBD 接受到之後返回完成。
Protocol C:Protocol C 複製模式是真正完全的同步複製模式,只有當遠程的 DRBD 將數據完全寫入磁碟成功後,才會返回完成。
對比上面三種複製模式,C 模式可以保證不論出現任何異常,都能夠保證兩端數據的一1致性。而如果使用 B 模式,則可能當遠程主機突然斷電之後,將丟失部分還沒有完全寫入磁碟的信息,且本地與遠程的數據出現一定的不一致情況。當我們使用 A 複製模式的話,可能存在的風險就要更大了。只要本地網路設備突然無法正常工作(包括主機斷電),就會丟失將寫入遠程主機的數據,造成數據不一致現象。
由於不同模式所要求的遠程寫入進程返回完成信息的時機不一樣,所以也直接決定了IO 寫入的性能。通過三個模式的描述,我們可以很清楚的知道,IO 寫入性能與可靠程度成反比。所以,各位讀者朋友在考慮設置這個參數的時候,需要仔細評估各方面的影響,儘可能得到一個既滿足實際場景的性能需求,又能滿足對可靠性的要求。
DRBD 的安裝部署以及相關的配置說明,在 MySQL 的官方文檔手冊以及我的個人網站博客(http://www.jianzhaoyang.com)中都有相關的描述,而且在 DRBD 的官方網站上面也可以找到最為全面的說明,所以這裡就不再介紹了。下麵我主要介紹一下 DRBD 的一些特殊的特性以及限制,以供大家參考。

17.3.2 DRBD 特性與限制

DRBD 之所以能夠得到廣泛的採用,甚至被 MySQL 官方寫入文檔手冊作為官方推薦的高可用方案之一,主要是其各種高可靠特性以及穩定性的緣故。下麵介紹一下 DRBD 所具備的一些比較重要的特性。
1、非常豐富的配置選項,可以適應我們的應用場景中的情況。無論是可靠性級別與性能的平衡,還是數據安全性方面,無論是本地磁碟,還是網路存儲設備,無論是希望異常自動解決,還是希望手動控制等等,都可以通過簡單的配置文件就可以解決。
當然,豐富的配置在帶來極大的靈活性的同時,也要求使用者需要對他有足夠的瞭解才行,否則在那麼多配置參數中也很難決策該如何配置。幸好 DRBD 在預設情況下的各項參數實際上就已經滿足了大多數典型需求了,並不需要我們每一項參數都設置才能運行;
2、對於節點之間出現數據不一致現象,DRBD 可以通過一定的規則,進行重新同步。而且可以通過相關參數配置讓 DRBD 在固定時間點進行數據的校驗比對,來確定數據是否一致,並對不一致的數據進行標記。同時還可以選擇是 DRBD 自行解決不一致問題還是由我們手工決定如何同步;
3、在運行過程中如果出現異常導致一端 crash,並不會影響另一端的正常工作。出現異常之後的所有數據變更,都會被記錄到相關的日誌文件中。當 crash 節點正常恢復之後,可以自動同步這段時間變更過的數據。為了不影響新數據的正常同步,還可以設定恢復過程中的速度,以確保網路和其他設備不會出現性能問題;
4、多種文件系統類型的支持。DRBD 除了能夠支持各種常規的文件系統之外,還可以支持 GFS,OCFS2 等分散式文件系統。而且,在使用分散式文件系統的時候,還可以實現各結帶你同時提供所有 IO 操作。
5、提供對 LVM 的支持。DRBD 既可以使用由 LVM 提供的邏輯設備,也可以將自己對外提供的設備成為 LVM 的物理設備,這極大的方便的運維人員對存儲設備的管理。
6、所有 IO 操作,能夠絕對的保證 IO 順序。這也是對於資料庫來說非常重要的一個特性尤其是一些對數據一致性要求非常苛刻的資料庫軟體來說。
7、可以支持多種傳輸協議,從 DRBD 8.2.7 開始,DRBD 開始支持 Ipv4,IPv6以及SuperSockets來進行數據傳輸。
8、支持 Three-Way 複製。從 DRBD 8.3.0 開始,DRBD 可以支持三個節點之間的複製了,有點類似於級聯複製的特性。
當然,DRBD 在擁有大量讓人青睞的特性的同時,也存在一定的限制,下麵就是 DRBD 目前存在的一些比較重要的限制:
1、對於使用常規文件系統(非分散式文件系統)的情況下,DRBD 只能支持單 Primary模式。在單 Primary 模式下,只有一個節點的數據是可以對外提供 IO 服務的。
只有當使用 GFS 或者 OCFS2 這樣的分散式文件系統的時候,才能支持 Dual Primary 模式。
2、Sblit Brain 的解決。因為某些特殊的原因,造成兩台主機之間的 DRBD 連接中斷之後雙方都以 Primary 角色來運行之後的處理還不是太穩定。雖然 DRBD 的配置文件中可以配置自動解決 Split Brain,但是從我之前的測試情況來看,並不是每次的解決都非常令人滿意,在有些情況下,可能出現某個節點完全失效的可能。
3、複製節點數目的限制,即使是目前最新的 DRBD 版本來說,也最多只支持三個節點之間的複製。
以上幾個限制是在目前看來可能對使用者造成較大影響的幾個限制。當然,DRBD 還存在很多其他方面的限制,大家在決定使用之前,還是需要經過足夠測試瞭解,以確保不會造成上線後的困擾。

17.4 其他高可用設計方案

除了上面幾種高可用方案之外,其實還有不少方案可以供大家選擇,如RaiDB,共用存儲解(SAN 或者 NAS) 等等。
對於 RaiDB,可能很多讀者朋友還比較陌生,其全稱為 Redundant Arrays of Inexpensive Databases。也就是通過 Raid 理念來管理資料庫的數據。所以 RaiDB 也存在資料庫 Sharding 的概念。和磁碟 Raid 一樣,RaiDB 也存在多種 Raid,如 RaiDB-0,RaiDB-1,RaiDB-2,RaiDB-0-1 和 RaiDB-1-0 等。商業 MySQL 資料庫解決方案提供商 Continuent 的資料庫解決方案中,就利用了 RaiDB 的概念。大家可以通過一下幾張圖片清晰的瞭解RaiDB 的各種 Raid 模式。
RaiDB-0:

RaiDB-1:


RaiDB-2:


RaiDB-0-1:


RaiDB-1-0:

從圖中的標識,大家應該就比較清楚 RaiDB 各種Raid 模式下的數據如何分佈以及工作方式了吧。至於為什麼這樣作可以保證高可用性,就和磁碟通過 Raid 來保證數據高可靠性一樣。當然,要真正理解,前提還是大家已經具備了清晰的 Raid 概念。
而對於共用存儲的解決方案,則是一個相對來說比較昂貴的解決方案了。運行 MySQL Server 的主機上面並不存放數據,只不過通過共用協議(FC 或者 NFS)來將遠程存儲設備上面的磁碟空間 Mount 到本地,當作本地磁碟來使用。
為什麼共用存儲的解決方案可以滿足高可靠性要求呢?首先,數據不是存在 MySQL Server 本地主機上面,所以當本地 MySQL Server 主機出現任何故障,都不會造成數據的丟失,完全可以通過其他主機來找回存儲設備上面的數據。其次,無論是通過通過 SAN 還是 NAS 來作為共用存儲,存儲本身具備多種高可用解決方案,可以做到完全不丟失任何數據。甚至即使 MySQL Server 與共用存儲之間的連接通道,也有很多成熟的高可用解決方案,來保證連接的高可用性。由於共用存儲的解決方案本身違背了我個人提倡的通過 MySQL 構建廉價的企業級高性能高可靠性方案,又考慮到篇幅問題,所以這裡就不詳細深入介紹了。
如果讀者朋友對這方面比較感興趣,可以通過其他圖書再深入瞭解 SAN 存儲以及 NAS 存儲相關的知識。

17.5 各種高可用方案的利弊比較

從前面各種高可用設計方案的介紹中讀者們可能已經發現,不管是哪一種方案,都存在自己獨特的優勢,但也都或多或少的存在一些限制。其實這也是很正常的,畢竟任何事物都不可能是完美的,我們只能充分利用各自的優勢來解決自己的問題,而不是希望依賴某種方案一勞永逸的解決所有問題。這一節將針對上面的幾種主要方案做一個利弊分析,以供大家選擇過程中參考。
1、MySQL Replication
優勢:部署簡單,實施方便,維護也不複雜,是 MySQL 天生就支持的功能。且主備機之間切換方便,可以通過第三方軟體或者自行編寫簡單的腳本即可自動完成主備切換。
劣勢:如果 Master 主機硬體故障且無法恢復,則可能造成部分未傳送到 Slave 端的數據丟失;
2、MySQL Cluster
優勢:可用性非常高,性能非常好。每一分數據至少在不同主機上面存在一份拷貝,且冗餘數據拷貝實時同步。
劣勢:維護較為複雜,產品還比較新,存在部分bug,目前還不一定適用於比較核心的線上系統。
3、DRBD 磁碟網路鏡像方案
優勢:軟體功能強大,數據在底層快設備級別跨物理主機鏡像,且可根據性能和可靠性要求配置不同級別的同步。IO 操作保持順序,可滿足資料庫對數據一致性的苛刻要求。
劣勢:非分散式文件系統環境無法支持鏡像數據同時可見,性能和可靠性兩者相互矛盾,無法適用於性能和可靠性要求都比較苛刻的環境。維護成本高於 MySQL Replication。

17.6 小結

本章重點針對 MySQL 自身具備的兩種高可用解決方案以及 MySQL 官方推薦的 DRBD 解決方案做了較為詳細的介紹,同時包括了各解決方案的利弊對比。希望這些信息能夠給各位讀者帶來一些幫助。不過,MySQL 的高可用解決方案遠遠不只上面介紹過的集中方案,還存在著大量的其他方案可供各位讀者朋友進行研究探索。開源的力量是巨大的,開源貢獻者的力量更是無窮的。

 

摘自:《MySQL性能調優與架構設計》簡朝陽

轉載請註明出處:

作者:JesseLZJ
出處:http://jesselzj.cnblogs.com


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 方法一: 新建共用目錄存放腳本文件,需要應用的用戶或組授予只讀許可權 方法二: 將腳本放到在\\IP或主機名\sysvol\功能變數名稱\Policies\唯一ID\USER\Scripts\Logon(登錄) SYSVOL:是存儲域公共文件伺服器副本的共用文件夾,它們在域中所有的域控制器之間複製。 Sysv ...
  • 封裝virtio驅動到windows2008R2原版iso中1. 使用UltraISO將wim文件install.vim,boot.vim拷出到D盤2. 準備執行命令載入驅動,命令僅提供install.wim,boot.wim與install安裝方式相同,包含在第5節腳本中2.1 管理員身份打開CM... ...
  • ctid: 表示數據記錄的物理行當信息,指的是 一條記錄位於哪個數據塊的哪個位移上面。 跟oracle中偽列 rowid 的意義一樣的;只是形式不一樣。 例如這有個一表test;查看每行記錄的ctid情況 mydb=> select ctid,* from test; ctid | id | nam ...
  • 眾所周知,在部署Grid Infrastructure的過程中使用,runcluvfy.sh腳本被用於驗證系統的軟硬體環境是否滿足軟體安裝的需求。過去一直沿用現成方法進行該項工作,很少去探究其中的含義,百度搜索也鮮見全面介紹,通過借鑒整合,故形成以下記錄,用以備忘。 一、什麼是CVU CVU是Clu ...
  • 在勝利油田物探院借了一本書叫做 sqlserver2008寶典 第二版,但是看不下去 下麵打算直接安裝資料庫上手了,邊練邊學 ...
  • SQL SERVER有好多好多功能,選項也一大堆,很多功能選項並不常用。但是如果真有這種需求的時候又想不起來~ 本篇我們就來聊聊備份里的選項checksum,這是個啥玩意?聽都沒聽過?來看下圖: 就是這個選項!不知道各位看官是否知道是乾什麼的?怎麼用? 我詢問了幾個群友都沒用過,正好手頭有環境,那麼 ...
  • 修改Mysql配置 Mysql配置地址為: 如果無法修改可以把my.ini拷貝出來,修改完後,再拷貝回去! 如果配置了Mysql的日誌生成路徑,但是該目錄尚未創建,那麼啟動會報錯! 關於Mysql日誌 splunk內置了兩種mysql的日誌,分別是mysqld以及mysql_error mysqld ...
  • 第 18 章 高可用設計之 MySQL 監控 前言: 一個經過高可用可擴展設計的 MySQL 資料庫集群,如果沒有一個足夠精細足夠強大的監控系統,同樣可能會讓之前在高可用設計方面所做的努力功虧一簣。一個系統,無論如何設計如何維護,都無法完全避免出現異常的可能,監控系統就是根據系統的各項狀態的分析,讓 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...