MySQL 中常見的幾種高可用架構部署方案

2023-04-20 21:00:23

MySQL 中的叢集部署方案

前言

這裡來聊聊,MySQL 中常用的部署方案。

MySQL Replication

MySQL Replication 是官方提供的主從同步方案,用於將一個 MySQL 的範例同步到另一個範例中。Replication 為保證資料安全做了重要的保證,是目前運用最廣的 MySQL 容災方案。Replication 用兩個或以上的範例搭建了 MySQL 主從複製叢集,提供單點寫入,多點讀取的服務,實現了讀的 scale out

mysql

上面的栗子,一個主庫(M),三個從庫(S),通過 replication,Master 生成 event 的 binlog,然後發給 slave,Slave 將 event 寫入 relaylog,然後將其提交到自身資料庫中,實現主從資料同步。

對於資料庫之上的業務層來說,基於 MySQL 的主從複製叢集,單點寫入 Master ,在 event 同步到 Slave 後,讀邏輯可以從任何一個 Slave 讀取資料,以讀寫分離的方式,大大降低 Master 的執行負載,同時提升了 Slave 的資源利用。

優點:

1、通過讀寫分離實現橫向擴充套件的能力,寫入和更新操作在源伺服器上進行,從伺服器中進行資料的讀取操作,通過增大從伺服器的個數,能夠極大的增強資料庫的讀取能力;

2、資料安全,因為副本可以暫停複製過程,所以可以在副本上執行備份服務而不會破壞相應的源資料;

3、方便進行資料分析,可以在寫庫中建立實時資料,資料的分析操作在從庫中進行,不會影響到源資料庫的效能;

實現原理

在主從複製中,從庫利用主庫上的 binlog 進行重播,實現主從同步,複製的過程中蛀主要使用到了 dump thread,I/O thread,sql thread 這三個執行緒。

IO thread: 在從庫執行 start slave 語句時建立,負責連線主庫,請求 binlog,接收 binlog 並寫入 relay-log;

dump thread:用於主庫同步 binlog 給從庫,負責響應從 IO thread 的請求。主庫會給每個從庫的連線建立一個 dump thread,然後同步 binlog 給從庫;

sql thread:讀取 relay log 執行命令實現從庫資料的更新。

來看下複製的流程:

1、主庫收到更新命令,執行更新操作,生成 binlog;

2、從庫在主從之間建立長連線;

3、主庫 dump_thread 從本地讀取 binlog 傳送剛給從庫;

4、從庫從主庫獲取到 binlog 後儲存到本地,成為 relay log(中繼紀錄檔);

5、sql_thread 執行緒讀取 relay log 解析、執行命令更新資料。

不過 MySQL Replication 有個嚴重的缺點就是主從同步延遲。

因為資料是進行主從同步的,那麼就會遇到主從同步延遲的情況。

為什麼會出現主從延遲?

1、從庫機器的效能比主庫差;

2、從庫的壓力大;

  • 大量查詢放在從庫上,可能會導致從庫上耗費了大量的 CPU 資源,進而影響了同步速度,造成主從延遲。

3、大事務的執行;

  • 有事務產生的時候,主庫必須要等待事務完成之後才能寫入到 binlog,假定執行的事務是一個非常大的資料插入,這些資料傳輸到從庫,從庫同步這些資料也需要一定的時間,就會導致從節點出現資料延遲。

4、從庫的複製能力較差;

如果從庫的複製能力,低於主庫,那麼在主庫寫入壓力很大的情況下,就會造成從庫長時間資料延遲的情況出現。

如何解決?

1、優化業務邏輯,避免出現多執行緒大事務的並行場景;

2、提高從庫的機器效能,減少主庫寫 binlog 和從庫讀 binlog 的效率差;

3、保證主庫和從庫的網路連線,避免出現網路延遲導致的 binlog 傳輸延遲;

4、強行讀主庫;

5、配合 semi-sync 半同步複製;

semi-sync 半同步複製

MySQL 有三種同步模式,分別是:

1、非同步複製:MySQL 中預設的複製是非同步的,主庫在執行完使用者端提交的事務後會立即將結果返回給使用者端,並不關心從庫是否已經接收並且處理。存在問題就是,如果主庫的紀錄檔沒有及時同步到從庫,然後主庫宕機了,這時候執行故障轉移,在從庫衝選主,可能會存在選出的主庫中資料不完整;

2、全同步複製:指當主庫執行完一個事務,並且等到所有從庫也執行完成這個事務的時候,主庫在提交事務,並且返回資料給使用者端。因為要等待所有從庫都同步到主庫中的資料才返回資料,所以能夠保證主從資料的一致性,但是資料庫的效能必然受到影響;

3、半同步複製:是介於全同步和全非同步同步的一種,主庫至少需要等待一個從庫接收並寫入到 Relay Log 檔案即可,主庫不需要等待所有從庫給主庫返回 ACK。主庫收到 ACK ,標識這個事務完成,返回資料給使用者端。

MySQL 中預設的複製是非同步的,所以主庫和從庫的同步會存在一定的延遲,更重要的是非同步複製還可能引起資料的丟失。全同步複製的效能又太差了,所以從 MySQL 5.5 開始,MySQL 以外掛的形式支援 semi-sync 半同步複製。

半同步複製潛在的問題

在傳統的半同步複製中,主庫寫資料到 binlog,並且執行 commit 提交事務後,會一直等待一個從庫的 ACK。從庫會在寫入 Relay Log 後,將資料落盤,然後回覆給主庫 ACK,主庫收到這個 ACK 才能給使用者端事務完成的確認。

這樣會存在問題就是,主庫已經將該事務的 commit 儲存到了引擎層,應用已經可以看到資料的變化了,只是在等待從庫的返回,如果此時主庫宕機,可能從庫還沒有寫入 Relay Log,就會發生主從庫資料不一致。

為了解決這個問題,MySQL 5.7 引入了增強半同步複製。主庫寫入資料到 binlog 後,就開始等待從庫的應答 ACK,直到至少一個從庫寫入 Relay Log 後,並將資料落盤,然後返回給主庫 ACK,通知主庫可以進行 commit 操作,然後主庫再將事務提交到事務引擎,應用此時才能看到資料的變化。

不過看下來增強半同步複製,在同步給從庫之後,因為自己的資料還沒有提交,然後宕機了,主庫中也是會存在資料的丟失,不過應該想到的是,這時候主庫宕機了,是會重新在從庫中選主的,這樣新選出的主庫資料是沒有發生丟失的。

MySQL Group Replication

MySQL Group Replication 組複製,又稱為 MGR。是 Oracle MySQL 於 2016 年 12 月釋出 MySQL 5.7.17 推出的一個全新高可用和高擴充套件的解決方案。

引入複製組主要是為了解決傳統非同步複製和半同步複製可能產生資料不一致的問題。

MGR 由若干個節點共同組成一個複製組,一個事務的提交,必須經過組內大多數節點 (N / 2 + 1) 決議並通過,才能得以提交。

當用戶端發起一個更新事務時,該事務先在本地執行,執行完成之後就要發起對事務的提交操作。在還沒有真正提交之前,需要將產生的複製寫集廣播出去,複製到其它成員。因為事務是通過原子廣播傳送的,所以組中的成員要麼都接收事務,要麼都不接收事務。如果組中的所有成員收到了該廣播訊息(事務),那麼他們會按照之前傳送事務的相同順序收到該廣播訊息。因此,所有組成員都以相同的順序接收事務的寫集,併為事務建立全域性順序。因此,所有組成員都以相同的順序接收事務的寫集,併為事務建立全域性順序。

在不同組成員並行執行的事務可能存在衝突。衝突是通過檢查和比較兩個不同並行事務的 write set 來驗證的,這個過程稱為認證。在認證期間,衝突檢測在行級別執行的:如果在不同組成員上執行的兩個並行事務更新了同一行資料,則存在衝突。根據衝突認證檢測機制判斷,按照順序,第一次提交的會正常執行,第二次提交的事務會在事務發起的原始組成員上執行回滾,,組中的其他成員對該事務執行刪除。如果兩個事務經常發生衝突,那麼最好將這兩個事務放在同一個組成員中執行,這樣它們在本地鎖管理器的協調下將都有機會提交成功,而不至於因為處在兩個不同的組成員中由於衝突認證而導致其中一個事務被頻繁回滾。

最終,所有組內成員以相同的順序接收同一組事務。因此組內成員以相同的順序應用相同的修改,保證組內資料強一致性。

mysql

有下面的幾種特性:

1、避免腦裂:MGR 中不會出現腦裂的現象;

2、資料一致性保障:MGR 的冗餘能力很好,能夠保證 Binlog Event 至少被複制到超過一半的成員上,只要同時宕機的成員不超過半數便不會導致資料丟失。MGR還保證只要 Binlog Event 沒有被傳輸到半數以上的成員,本地成員不會將事務的 Binlog Event 寫入 Binlog 檔案和提交事務,從而保證宕機的伺服器上不會有組內線上成員上不存在的資料。因此,宕機的伺服器重啟後,不再需要特殊的處理就可以加入組;

3、多節點寫入支援:多寫模式下支援叢集中的所有節點都可以寫入。

組複製的應用場景

1、彈性複製:需要非常靈活的複製基礎設施的環境,其中MySQL Server的數量必須動態增加或減少,並且在增加或減少Server的過程中,對業務的副作用盡可能少。例如,雲資料庫服務;

2、高可用分片:分片是實現寫擴充套件的一種流行方法。基於 組複製 實現的高可用分片,其中每個分片都會對映到一個複製組上(邏輯上需要一一對應,但在物理上,一個複製組可以承載多個分片);

3、替代主從複製:在某些情況下,使用一個主庫會造成單點爭用。在某些情況下,向整個組內的多個成員同時寫入資料,對應用來說可能伸縮性更強;

4、自治系統:可以利用組複製內建的自動故障轉移、資料在不同組成員之間的原子廣播和最終資料一致性的特性來實現一些運維自動化。

InnoDB Cluster

InnoDB Cluster 是官方提供的高可用方案,是 MySQL 的一種高可用性(HA)解決方案,它通過使用 MySQL Group Replication 來實現資料的自動複製和高可用性,InnoDB Cluster 通常包含下面三個關鍵元件:

mysql

1、MySQL Shell: 它是 MySQL 的高階管理使用者端;

2、MySQL ServerMGR,使得一組 MySQL 範例能夠提供高可用性,對於 MGR,Innodb Cluster 提供了一種更加易於程式設計的方式來處理 MGR;

3、MySQL Router,一種輕量級中介軟體,主要進行路由請求,將使用者端傳送過來的請求路由到不同的 MySQL 伺服器節點。

MySQL Server 基於 MySQL Group Replication 構建,提供自動成員管理,容錯,自動故障轉移動能等。InnoDB Cluster 通常以單主模式執行,一個讀寫範例和多個唯讀範例。不過也可以選用多主模式。

優點:

1、高可用性:通過 MySQL Group ReplicationInnoDB Cluster 能夠實現資料在叢集中的自動複製,從而保證資料的可用性;

2、簡單易用:InnoDB Cluster 提供了一個簡單易用的管理介面,使得管理員可以快速部署和管理叢集;

3、全自動故障轉移: InnoDB Cluster 能夠自動檢測和診斷故障,並進行必要的故障轉移,使得資料可以繼續可用。

缺點:

1、複雜性:InnoDB Cluster 的部署和管理比較複雜,需要對 MySQL 的工作原理有一定的瞭解;

2、效能影響:由於自動複製和高可用性的要求,InnoDB Cluster 可能對 MySQL 的效能造成一定的影響;

3、限制:InnoDB Cluster 的功能對於一些特殊的應用場景可能不夠靈活,需要更多的客製化。

InnoDB ClusterSet

MySQL InnoDB ClusterSet 通過將主 InnoDB Cluster 與其在備用位置(例如不同資料中心)的一個或多個副本連結起來,為 InnoDB Cluster 部署提供容災能力。

InnoDB ClusterSet 使用專用的 ClusterSet 複製通道自動管理從主叢集到副本叢集的複製。如果主叢集由於資料中心損壞或網路連線丟失而變得無法使用,使用者可以啟用副本叢集以恢復服務的可用性。

mysql

InnoDB ClusterSet 的特點:

1、主叢集和副本叢集之間的緊急故障轉移可以由管理員通過 MySQL Shell,使用 AdminAPI 進行操作;

2、InnoDB ClusterSet 部署中可以擁有的副本叢集的數量沒有定義的限制;

3、非同步複製通道將事務從主叢集複製到副本叢集。clusterset_replicationInnoDB ClusterSet 建立過程中,在每個叢集上都設定了名為 ClusterSet 的複製通道,當叢集是副本時,它使用該通道從主叢集複製事務。底層組複製技術管理通道並確保複製始終在主叢集的主伺服器(作為傳送方)和副本叢集的主伺服器(作為接收方)之間進行;

4、每個 InnoDB ClusterSet 叢集,只有主叢集能夠接收寫請求,大多數的讀請求流量也會被路由到主叢集,不過也可以指定讀請求到其他的叢集;

InnoDB ClusterSet 的限制:

1、InnoDB ClusterSet 只支援非同步複製,不能使用半同步複製,無法避免非同步複製的缺陷:資料延遲、資料一致性等;

2、InnoDB ClusterSet 僅支援Cluster範例的單主模式,不支援多主模式。 即只能包含一個讀寫主叢集, 所有副本叢集都是唯讀的, 不允許具有多個主叢集的雙活設定,因為在叢集發生故障時無法保證資料一致性;

3、已有的 InnoDB Cluster 不能用作 InnoDB ClusterSet 部署中的副本叢集。副本叢集必須從單個伺服器範例啟動,作為新的 InnoDB 叢集;

4、只支援 MySQL 8.0。

InnoDB ReplicaSet

InnoDB ReplicaSet 是 MySQL 團隊在 2020 年推出的一款產品,用來幫助使用者快速部署和管理主從複製,在資料庫層仍然使用的是主從複製技術。

InnoDB ReplicaSet 由單個主節點和多個輔助節點(傳統上稱為 MySQL 複製源和副本)組成。

InnoDB cluster 類似, MySQL Router 支援針對 InnoDB ReplicaSet 的引導, 這意味著可以自動設定 MySQL Router 以使用 InnoDB ReplicaSet, 而無需手動組態檔. 這使得 InnoDB ReplicaSet 成為一種快速簡便的方法, 可以啟動和執行 MySQL 複製和 MySQL Router, 非常適合擴充套件讀取, 並在不需要 InnoDB 叢集提供高可用性的用例中提供手動故障轉移功能。

mysql

InnoDB ReplicaSet 的限制:

1、沒有自動故障轉移,在主節點不可用的情況下,需要使用 AdminAPI 手動觸發故障轉移,然後才能再次進行任何更改。但是,輔助範例仍可用於讀取;

2、由於意外停止或不可用,無法防止部分資料丟失:在意外停止時未完成的事務可能會丟失;

3、在意外退出或不可用後無法防止不一致。如果手動故障轉移提升了一個輔助範例,而前一個主範例仍然可用,例如,由於網路分割區,裂腦情況可能會導致資料不一致;

4、InnoDB ReplicaSet 不支援多主模式。允許寫入所有成員的經典複製拓撲無法保證資料一致性;

5、讀取橫向擴充套件是有限的。InnoDB ReplicaSet 基於非同步複製,因此無法像 Group Replication 那樣調整流量控制;

6、一個 ReplicaSet 最多由一個主範例組成。支援一個或多個輔助。儘管可以新增到 ReplicaSet 的輔助節點的數量沒有限制,但是連線到 ReplicaSet 的每個 MySQL Router 都必須監視每個範例。因此,一個 ReplicaSet 中加入的範例越多,監控就越多。

使用 InnoDB ReplicaSets 的主要原因是你有更好的寫效能。使用 InnoDB ReplicaSets 的另一個原因是它們允許在不穩定或慢速網路上部署,而 InnoDB Cluster 則不允許。

MMM

MMM(Master-Master replication manager for MySQL)是一套支援雙主故障切換和雙主日常管理的指令碼程式。MMM 使用 Perl 語言開發,主要用來監控和管理 MySQL Master-Master(雙主)複製,可以說是 MySQL 主主複製管理器。

雙主模式,業務上同一時刻只能一個主庫進行資料的寫入。另一個主備庫,會在主伺服器失效時,進行主備切換和故障轉移。

MMM 中是通過一個 VIP(虛擬 IP) 的機制來保證叢集的高可用的。整個叢集中,在主節點會提供一個 VIP 地址來提供資料讀寫服務,當出現故障的時候,VIP 就會從原來的主節點便宜到其他節點,由其他節點提供服務。

mysql

MMM無法完全的保證資料一致性,所以適用於對資料的一致性要求不是很高的場景。(因為主備上的資料不一定是最新的,可能還沒從庫的新。解決方法:開啟半同步)。

MMM 的優缺點

優點:高可用性,擴充套件性好,出現故障自動切換,對於主主同步,在同一時間只提供一臺資料庫寫操作,保證資料的一致性。

缺點:無法完全保資料的一致性,建議採用半同步複製方式,減少失敗的概率;目前 MMM 社群已經缺少維護,不支援基於 GTID 的複製。

適用場景:

MMM的適用場景為資料庫存取量大,業務增長快,並且能實現讀寫分離的場景。

MHA

Master High Availability Manager and Tools for MySQL,簡稱 MHA 。是一套優秀的作為 MySQL 高可用性環境下故障切換和主從提升的高可用軟體。

這個工具專門用於監控主庫的狀態,當發現 master 節點故障的時候,會自動提升其中擁有新資料的 slave 節點成為新的 master 節點,在此期間,MHA 會通過其他從節點獲取額外的資訊來避免資料一致性問題。MHA 還提供了 mater 節點的線上切換功能,即按需切換 master-slave 節點。MHA 能夠在30秒內實現故障切換,並能在故障切換過程中,最大程度的保證資料一致性。

mysql

MHA 由兩部分組成;

MHA Manager(管理節點)和MHA Node(資料節點)。

MHA Manager 可以單獨部署在一臺獨立的機器上管理多個 master-slave 叢集,也可以部署在一臺 slave節點上。MHA Node 執行在每臺 MySQL 伺服器上,MHA Manager 會定時探測叢集中的 master 節點,當 master 出現故障時,它可以自動將最新資料的 slave 提升為新的 master,然後將所有其他的 slave 重新指向新的 master。

整個故障轉移過程對應用程式完全透明。

在 MHA 自動故障切換過程中,MHA 試圖從宕機的主伺服器上最大限度的儲存二進位制紀錄檔,最大程度的保證資料的不丟失,但這並不總是可行的。例如,主伺服器硬體故障或無法通過 ssh 存取,MHA 沒法儲存二進位制紀錄檔,只進行故障轉移而丟失了最新的資料。

使用 MySQL 5.5 開始找支援的半同步複製,可以大大降低資料丟失的風險。MHA可以與半同步複製結合起來。如果只有一個 slave 已經收到了最新的二進位制紀錄檔,MHA 可以將最新的二進位制紀錄檔應用於其他所有的 slave 伺服器上,因此可以保證所有節點的資料一致性。

目前 MHA 主要支援一主多從的架構,要搭建 MHA,要求一個複製叢集中必須最少有三臺資料庫伺服器 ,一主二從,即一臺 master,一臺充當備用 master,另外一臺充當從庫,因為至少需要三臺伺服器。

MHA 工作原理總結如下:

1、從宕機崩潰的 master 儲存二進位制紀錄檔事件(binlog events);

2、識別最新更新的 slave;

3、應用差異的中繼紀錄檔(relay log) 到其他slave;

4、應用從master儲存的二進位制紀錄檔事件(binlog events);

5、提升一個 slave 為新master;

6、使用其他的 slave 連線新的 master 進行復制。

優點:

1、可以支援基於 GTID 的複製模式;

2、MHA 在進行故障轉移時更不易產生資料丟失;

3、同一個監控節點可以監控多個叢集。

缺點:

1、需要編寫指令碼或利用第三方工具來實現 Vip 的設定;

2、MHA 啟動後只會對主資料庫進行監控;

3、需要基於 SSH 免認證設定,存在一定的安全隱患。

Galera Cluster

Galera Cluster 是由 Codership 開發的MySQL多主叢集,包含在 MariaDB 中,同時支援 Percona xtradb、MySQL,是一個易於使用的高可用解決方案,在資料完整性、可延伸性及高效能方面都有可接受的表現。

其本身具有 multi-master 特性,支援多點寫入,Galera Cluster 中每個範例都是對等的,互為主從。當用戶端讀寫資料的時候,可以選擇任一 MySQL 範例,對於讀操作,每個範例讀取到的資料都是相同的。對於寫操作,當資料寫入某一節點後,叢集會將其同步到其它節點。這種架構不共用任何資料,是一種高冗餘架構。

mysql

主要功能

1、同步複製;

2、真正的 multi-master,即所有節點可以同時讀寫資料庫;

3、自動的節點成員控制,失效節點自動被清除;

4、新節點加入資料自動複製;

5、真正的並行複製,行級;

6、使用者可以直接連線叢集,使用感受上與 MySQL 完全一致。

優勢

1、資料一致:同步複製保證了整個叢集的資料一致性,無論何時在任何節點執行相同的select查詢,結果都一樣;

2、高可用性:由於所有節點資料一致,單個節點崩潰不需要執行復雜耗時的故障切換,也不會造成丟失資料或停止服務;

3、效能改進:同步複製允許在叢集中的所有節點上並行執行事務,從而提高讀寫效能;

4、更小的使用者端延遲;

5、同時具有讀和寫的擴充套件能力。

分析下原理

Galera Cluster 中主要用到了同步複製,主庫中的單個更新事務需要在所有從庫中同步更新,當主庫提交事務,叢集中的所有節點資料保持一致。

非同步複製,主庫將資料更新傳播給從庫後立即提交事務,而不論從庫是否成功讀取或重放資料變化,所以非同步複製會存在短暫的,主從資料同步不一致的情況出現。

不過同步複製的缺點也是很明顯的,同步複製協定通常使用兩階段提交或分散式鎖協調不同節點的操作,也及時說節點越多需要協調的節點也就越多,那麼事務衝突和死鎖的概率也就會隨之增加。

我們知道 MGR 組複製的引入也是為了解決傳統非同步複製和半同步複製可能產生資料不一致的問題,MGR 中的組複製,基於 Paxos 協定,原則上事務的提交,主要大多數節點 ACK 就可以提交了。

Galera Cluster 中的同步需要同步資料到所有節點,保證所有節點都成功。基於專有通訊組系統 GCommon ,所有節點都必須有 ACK。

Galera 複製是一種基於驗證的複製,基於驗證的複製使用通訊和排序技術實現同步複製,通過廣播並行事務之間建立的全域性總序來協調事務提交。簡單的講就是事務必須以相同的順序應用於所有範例。

事務現在本地執行,然後傳送的其他節點做衝突驗證,沒有衝突的時候所有節點提交事務,否則在所有節點回滾。

mysql

當用戶端發出 commit 命令時,在實際提交之前,對資料所做的更改都會收集到一個寫集合中,寫集合中包含事務資訊和所更改行的主鍵,資料庫將寫集傳送到其它節點。

節點用寫集中的主鍵與當前節點中未完成事務的所有寫集的主鍵比較,確定節點是否可以提交事務,同時滿足下面三個條件會被任務存在衝突,驗證失敗:

1、兩個事務來源於不同節點;

2、兩個事務包含相同的主鍵;

3、老事務對新事務不可見,即老事務未提交完成。新老事務的劃定依賴於全域性事務總序,即 GTID。

驗證失敗,節點將刪除寫集,叢集將回滾原始事務,對於所有的節點都是如此,每個節點單獨進行驗證。因為所有節點都以相同的順序接收事務,它們對事務的結果都會做出相同的決定,要麼全成功,要麼都失敗。成功後自然就提交了,所有的節點又會重新達到資料一致的狀態。節點之間不交換「是否衝突」的資訊,各個節點獨立非同步處理事務。

MySQL Cluster

MySQL Cluster 是一個高度可延伸的,相容 ACID 事務的實時資料庫,基於分散式架構不存在單點故障,MySQL Cluster 支援自動水平擴容,並能做自動的讀寫負載均衡。

MySQL Cluster 使用了一個叫 NDB 的記憶體儲存引擎來整合多個 MySQL 範例,提供一個統一的服務叢集。

NDB 是一種記憶體性的儲存引擎,使用 Sarding-Nothing 的無共用的架構。Sarding-Nothing 指的是每個節點有獨立的處理器,磁碟和記憶體,節點之間沒有共用資源完全獨立互不干擾,節點之間通過告訴網路組在一起,每個節點相當於是一個小型的資料庫,儲存部分資料。這種架構的好處是可以利用節點的分佈性並行處理資料,調高整體的效能,還有就是有很高的水平擴充套件效能,只需要增加節點就能增加資料的處理能力。

mysql

MySql Cluster 中包含三種節點,分別是管理節點(NDB Management Server)、資料節點(Data Nodes)和 SQL查詢節點(SQL Nodes) 。

SQL Nodes 是應用程式的介面,像普通的 mysqld 服務一樣,接受使用者的 SQL 輸入,執行並返回結果。Data Nodes 是資料儲存節點,NDB Management Server 用來管理叢集中的每個 node。

其中資料節點會儲存叢集中的資料分割區和分割區的副本,來看下 MySql Cluster 是如何對資料進行分片的操作的,首先來了解下下面幾個概念

  • 節點組(Node Group): 一組資料節點的集合。節點組的個數=節點數 / 副本數

比如有叢集中 4 個節點,副本數為 2(對應 NoOfReplicas 的設定),那麼節點組個數為2。

另外,在可用性方面,資料的副本在組內交叉分配,一個節點組內只有要一臺機器可用,就可以保證整個叢集的資料完整性,實現服務的整體可用。

  • 分割區(Partition):MySql Cluster 是一個分散式的儲存系統,資料按照 分割區 劃分成多份儲存在各資料節點中,分割區個數由系統自動計算,分割區數 = 資料節點數 / LDM 執行緒數

  • 副本(Replica):分割區資料的備份,有幾個分割區就有幾個副本,為了避免單點,保證 MySql Cluster 叢集的高可用,原始資料對應的分割區和副本通常會儲存在不同的主機上,在一個節點組內進行交叉備份。

mysql

慄如,上面的例子,有四個資料節點(使用ndbd),副本數為2的叢集,節點組被分為2組(4/2),資料被分為4個分割區,資料分配情況如下:

分割區0(Partition 0)儲存在節點組 0(Node Group 0)中,分割區資料(主副本 — Primary Replica)儲存在節點1(node 1) 中,備份資料(備份副本,Backup Replica)儲存在節點2(node 2) 中;

分割區1(Partition 1)儲存在節點組 1(Node Group 1)中,分割區資料(主副本 — Primary Replica)儲存在節點3(node 3) 中,備份資料(備份副本,Backup Replica)儲存在節點4(node 4) 中;

分割區2(Partition 2)儲存在節點組 0(Node Group 0)中,分割區資料(主副本 — Primary Replica)儲存在節點2(node 2) 中,備份資料(備份副本,Backup Replica)儲存在節點1(node 1) 中;

分割區3(Partition 2)儲存在節點組 1(Node Group 1)中,分割區資料(主副本 — Primary Replica)儲存在節點4(node 4) 中,備份資料(備份副本,Backup Replica)儲存在節點3(node 3) 中;

這樣,對於一張表的一個 Partition 來說,在整個叢集有兩份資料,並分佈在兩個獨立的 Node 上,實現了資料容災。同時,每次對一個 Partition 的寫操作,都會在兩個 Replica 上呈現,如果 Primary Replica 異常,那麼 Backup Replica 可以立即提供服務,實現資料的高可用。

mysql cluster 的優點

1、99.999%的高可用性;

2、快速的自動失效切換;

3、靈活的分散式體系結構,沒有單點故障;

4、高吞吐量和低延遲;

5、可延伸性強,支援線上擴容。

mysql cluster 的缺點

1、存在很多限制,比如:不支援外來鍵,資料行不能超過8K(不包括BLOB和text中的資料);

2、部署、管理、設定很複雜;

3、佔用磁碟空間大,記憶體大;

4、備份和恢復不方便;

5、重啟的時候,資料節點將資料 load 到記憶體需要很長時間。

MySQL Fabric

MySQL Fabric 會組織多個 MySQL 資料庫,將大的資料分散到多個資料庫中,即資料分片(Data Shard),同時同一個分片資料庫中又是一個主從結構,Fabric 會挑選合適的庫作為主庫,當主庫掛掉的時候,又會重新在從庫中選出一個主庫。

MySQL Fabric 的特點:

1、高可用;

2、使用資料分片的橫向功能。

MySQL Fabric-aware 聯結器把從 MySQL Fabric 獲取的路由資訊儲存到快取中,然後憑藉該資訊將事務或查詢傳送給正確的 MySQL 伺服器。

同時,每一個分片組,可以又多個一個伺服器組成,構成主從結構,當主庫掛掉的時候,又會重新在從庫中選出一個主庫。保證節點的高可用。

HA Group 保證存取指定 HA Group 的資料總是可用的,同時其基礎的資料複製是基於 MySQL Replication 實現的。

mysql

缺點

事務及查詢只支援在同一個分片內,事務中更新的資料不能跨分片,查詢語句返回的資料也不能跨分片。

總結

1、MySQL Replication 是官方提供的主從同步方案,用於將一個 MySQL 的範例同步到另一個範例中,在主從複製中,從庫利用主庫上的 binlog 進行重播,實現主從同步,預設是非同步同步,針對其在不同場景下的一些缺陷,衍生出了半同步複製,強同步複製等資料高可用的方案;

2、MySQL Group Replication 組複製又稱為 MGR,引入複製組主要是為了解決傳統非同步複製和半同步複製可能產生資料不一致的問題, MGR 由若干個節點共同組成一個複製組,一個事務的提交,必須經過組內大多數節點 (N / 2 + 1) 決議並通過,才能得以提交;

3、InnoDB Cluster 是官方提供的高可用方案,是 MySQL 的一種高可用性(HA)解決方案,它通過使用 MySQL Group Replication 來實現資料的自動複製和高可用性;

4、InnoDB ClusterSet 通過將主 InnoDB Cluster 與其在備用位置(例如不同資料中心)的一個或多個副本連結起來,為 InnoDB Cluster 部署提供容災能力,每個節點就是一個 InnoDB Cluster

5、InnoDB ReplicaSet InnoDB cluster 類似, MySQL Router 支援針對 InnoDB ReplicaSet 的引導, 這意味著可以自動設定 MySQL Router 以使用 InnoDB ReplicaSet, 而無需手動組態檔. 這使得 InnoDB ReplicaSet 成為一種快速簡便的方法, 可以啟動和執行 MySQL 複製和 MySQL Router, 非常適合擴充套件讀取, 並在不需要 InnoDB 叢集提供高可用性的用例中提供手動故障轉移功能;

6、MMM(Master-Master replication manager for MySQL)是一套支援雙主故障切換和雙主日常管理的指令碼程式。MMM 使用 Perl 語言開發,主要用來監控和管理 MySQL Master-Master(雙主)複製,可以說是 MySQL 主主複製管理器;

7、Master High Availability Manager and Tools for MySQL,簡稱 MHA 。是一套優秀的作為 MySQL 高可用性環境下故障切換和主從提升的高可用軟體,這個工具專門用於監控主庫的狀態,當發現 master 節點故障的時候,會自動提升其中擁有新資料的 slave 節點成為新的 master 節點,在此期間,MHA 會通過其他從節點獲取額外的資訊來避免資料一致性問題。MHA 還提供了 mater 節點的線上切換功能,即按需切換 master-slave 節點。MHA 能夠在30秒內實現故障切換,並能在故障切換過程中,最大程度的保證資料一致性;

8、Galera Cluster 是由 Codership 開發的MySQL多主叢集,包含在 MariaDB 中,同時支援 Percona xtradb、MySQL,是一個易於使用的高可用解決方案,在資料完整性、可延伸性及高效能方面都有可接受的表現,本身具有 multi-master 特性,支援多點寫入,Galera Cluster 中每個範例都是對等的,互為主從。當用戶端讀寫資料的時候,可以選擇任一 MySQL 範例,對於讀操作,每個範例讀取到的資料都是相同的。對於寫操作,當資料寫入某一節點後,叢集會將其同步到其它節點。這種架構不共用任何資料,是一種高冗餘架構;

9、MySQL Cluster 是一個高度可延伸的,相容 ACID 事務的實時資料庫,基於分散式架構不存在單點故障,MySQL Cluster 支援自動水平擴容,並能做自動的讀寫負載均衡,MySQL Cluster 使用了一個叫 NDB 的記憶體儲存引擎來整合多個 MySQL 範例,提供一個統一的服務叢集;

10、MySQL Fabric 會組織多個 MySQL 資料庫,將大的資料分散到多個資料庫中,即資料分片(Data Shard),同時同一個分片資料庫中又是一個主從結構,Fabric 會挑選合適的庫作為主庫,當主庫掛掉的時候,又會重新在從庫中選出一個主庫。

參考

【高效能MySQL(第3版)】https://book.douban.com/subject/23008813/
【MySQL 實戰 45 講】https://time.geekbang.org/column/100020801
【MySQL技術內幕】https://book.douban.com/subject/24708143/
【MySQL學習筆記】https://github.com/boilingfrog/Go-POINT/tree/master/mysql
【MySQL檔案】https://dev.mysql.com/doc/refman/8.0/en/replication.html
【淺談 MySQL binlog 主從同步】http://www.linkedkeeper.com/1503.html