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

来源:https://www.cnblogs.com/ricklz/archive/2023/04/20/17335755.html
-Advertisement-
Play Games

MySQL 中的集群部署方案 前言 MySQL Replication InnoDB Cluster InnoDB ClusterSet InnoDB ReplicaSet MMM MHA Galera Cluster MySQL Cluster MySQL Fabric 參考 MySQL 中的集群 ...


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


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

-Advertisement-
Play Games
更多相關文章
  • 概述 C#是微軟開發的一種流行的編程語言,廣泛用於開發桌面,Web和移動應用程式。在每個新版本中,C# 都會帶來令人興奮的功能和改進,使其更強大、更具表現力和更高效。C# 的最新版本是2022年發佈的 C#11,它引入了一系列新功能,例如abstract 和 virtual 引入到靜態方法中、泛型 ...
  • 分散式緩存是由多個應用伺服器共用的緩存,通常作為訪問它的應用伺服器的外部服務進行維護。 分散式緩存可以提高 ASP.NET Core 應用的性能和可伸縮性,尤其是當應用由雲服務或伺服器場托管時。 與其他將緩存數據存儲在單個應用伺服器上的緩存方案相比,分散式緩存具有多個優勢。 當分發緩存數據時,數據: ...
  • 前言 創建一個簡單的字元設備驅動程式。 ​ 本文命令的運行基本上都需要root許可權,使用root賬號,或者在命令前面加上sudo。 ​ 如果你使用ssh遠程連接的伺服器進行代碼編寫。那麼不要在root用戶下創建文件或者文件夾。這會導致你ssh連接vscode編寫代碼的許可權問題。可以在普通用戶創建好所 ...
  • 如何編寫 Windows Server 的日誌篩選器,你需要先瞭解以下概念: 1、Windows Event Log:Windows Event Log 是 Windows Server 操作系統提供的一種記錄系統事件的機制,它可以記錄操作系統、應用程式、安全、系統和其他類型的事件。 2、Event ...
  • VMware17安裝Ubuntu22.04.2-Desktop詳細記錄 1. 前置準備 VMware軟體,這裡用的VMware17 Ubuntu系統鏡像文件(.iso文件) 官網下載:Ubuntu系統下載 | Ubuntu I Tell You舊版站點:MSDN, 我告訴你 - 做一個安靜的工具站 ...
  • Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,刪除文本等等。這也是Vim啟動後的預設模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器預設模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩衝中插入文本。大多數新用戶希望文本編輯器編輯過程中一 ...
  • 1. 數據分組 1.1. SQL的語句中具有分組功能的是GROUP BY和PARTITION BY 1.1.1. 兩者都有數學的理論基礎 1.1.2. 都可以根據指定的列為表分組 1.1.3. 區別僅僅在於,GROUP BY在分組之後會把每個分組聚合成一行數據 1.1.4. GROUP BY的作用是 ...
  • 功能02-商鋪查詢緩存02 知識補充 (1)緩存穿透 https://blog.csdn.net/qq_45637260/article/details/125866738 緩存穿透(cache penetration)是指用戶訪問的數據既不在緩存當中,也不在資料庫中。出於容錯的考慮,如果從底層數據 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...